PHP COM Excel Word
Par PlaceOweb le jeudi, juin 20 2013, 15:35 - PHP - Lien permanent
Rajout dans PHP php.ini pour les versions récentes :
Installation " Depuis PHP 5.3.15 / 5.4.5, cette extension requiert que la bibliothèque php_com_dotnet.dll soit activée dans votre php.ini pour pouvoir utiliser ces fonctions COM. "
[PHP_COM_DOTNET] extension=php_com_dotnet.dll
Sinon, vous aurez l'erreur fatal :
Fatal error: Class 'COM' not found
Ressources
Lire un document word en PHP avec COM
Exemple de conversion d'un document Word en HTML via PHP. Ça fonctionne à la fois avec l'ancien format : .doc, et le nouveau : .docx (OpenDocument). Et ça marche avec les autres logiciels de la suite office : Excel et PowerPoint.
// Lancement de word $word = new COM("word.application") or die("Impossible de démarrer le composant word"); // On masque word (pour ne pas afficher la fenêtre, et l'exécuter en arrière-plan) $word->Visible = 0; // Ouverture du fichier word (doc ou docx) $word->Documents->Open(dirname(__FILE__).'/test.doc'); // Convertir le fichier word en HTML $word->Documents[1]->SaveAs(dirname(__FILE__)."/test_doc.html",8); // Fermeture de word $word->Quit(); // Libération mémoire $word->Release(); $word = null;
Problèmes
Problème d'ouverture/sauvegarde de fichier avec PHP COM
Workbooks->Open fonctionne en ligne de commande (PHP CLI), mais pas avec Apache (PHP SAPI avec XAMPP)
A l'exécution, PHP Apache retourne que le fichier n'est pas existant, lisible ou alors déjà utilisé.
Exception ! Source: Microsoft Excel Description: Microsoft Excel ne peut accéder au fichier "C:\monfichier.xls". Plusieurs raisons sont possibles :
- Le nom du fichier ou le chemin d'accès n'existe pas.
- Ce fichier est actuellement utilisé par un autre programme.
- Le classeur que vous essayez d'enregistrer porte le même nom qu'un classeur actuellement ouvert.
Cela est dû à problème de droits qu'il faut contourner comme l'indique tsintra
- Exécuter "dcomcnfg" (Services de composants)
- Ouvrir Services de composants > Ordinateurs > Poste de travail > Configuration DCOM
- Chercher "Microsoft Excel Application"
- Bouton droits : Propriétés
- Onglet "Identité", par défaut il s'agit de "L'utilisateur exécutant". Changez le en "L'utilisateur interactif"
- Appliquer ces modifications, re-tester votre application COM. Cela doit fonctionner maintenant !
Identité
Cet onglet est utilisé pour déterminer le compte que vous souhaitez utiliser pour exécuter l'application.
- L'utilisateur interactif : l'application s'exécutera en utilisant le contexte de sécurité de l'utilisateur actuellement connecté à l'ordinateur.
- L'utilisateur exécutant : l'application s'exécutera en utilisant le contexte de sécurité de l'utilisateur qui a démarré l'application.
- Cet utilisateur : vous pouvez spécifier l'utilisateur dont le contexte sécurité est utilisé pour exécuter l'application.
- Le compte système : cela est disponible uniquement pour les services Windows NT et Windows 2000 qui utilisent DCOM.
A l'inverse avec le "L'utilisateur interactif", si la session est fermée, l'objet COM n'est pas instanciable, il faut donc le passer en "L'utilisateur exécutant"
excel automation without session
Excel 2007 automation on top of a Windows Server 2008 x64 et Excel 2007 automation on top of a Windows Server 2008 x64
Après tout, j'ai trouvé une autre solution qui ne change pas de valeurs de registre et tout fonctionne normalement. La solution est ...
- Windows 2008 Server x64
créer un dossier : C:\Windows\SysWOW64\config\systemprofile\Desktop
- Windows 2008 Server x86
créer un dossier : C:\Windows\System32\config\systemprofile\Desktop
... à la place de dcomcnfg.exe. Cette opération a supprimé mes problèmes d'automatisation de bureau dans mon système. Un dossier de bureau semble être nécessaire dans le dossier de systemprofile afin d'ouvrir le fichier par Excel. Il disparaît de Windows 2008, Windows 2003 avait le dossier, et je pense que c'est ce ui provoque cette erreur. Je pense qu'il est plus sûr qu'un "piratage de registre".
Excel COM automation stops working when user logs off
- créer le dossier : C:\Windows\System32[ou SysWOW64]\config\systemprofile\Desktop
- assurez-vous q'une imprimante par défaut est configuré pour le service de l'utilisateur
- changer les paramètres DCOMCNFG (mmc -32, add "component services") d'Excel pour exécuter à l'aide du compte interactif
- changer les paramètres par défaut de DCOM pour autoriser l'accès, le lancement et l'activation local pour l'utilisateur du service
NFS et Windows
Visiblement pour monter un partage NFS depuis Windows, la version pro n'est pas suffisante, il vous faudra la version entreprise ou ultimate/intégrale.
Création d'un lien répertoire symbolique
D:\DATA\ data_files => F:\data_files\ MKLINK /D D:\DATA\data_files F:\data_files Lien symbolique créé pour D:\DATA\data_files <<===>> F:\data_files
Commentaires
Je sais que l'article est pour PHP, mais le problème se pose [bien sûr] avec tous les appels DCOM d'excel :
Merci, le mode utilisateur de service a débloqué ma situation (programme VBS lancés via un service Windows, service lui-même démarré avec un compte de domaine). En remettant le même compte dans dcomcnfg, et session fermée, ça a marché !
MERCI !