pour mon application en PHP je dois aller récupérer des informations dans un fichier Excel pour ensuite les insérer dans une base de données SQL.
Le fichier excel est en possession de l'utilisateur et est donc envoyé sur le serveur (par upload) pour pouvoir être traité.
J'ai le code suivant pour récupérer mes informations :
$data = new Spreadsheet_Excel_Reader();
$data->setOutputEncoding('CP1251');
$data->read($monfichier); //$monfichier est le nom du fichier temporaire sur le serveur
Cependant le fichier Excel est protégé et je dois donc appelé une macro (dans le fichier excel) pour déverrouiller le contenu.
J'utilise donc un objet de type COM provenant de l'API Excel.
$excel_app = new COM("Excel.application") or Die ("[ERROR]");
$Workbook = $excel_app->Workbooks->Open($monfichier) or Die("[ERROR]");
try
{
$excel_app->Run('unlockAll');
}
catch (Exception $e)
{
echo "[ERROR] " . $e->getMessage();
}
J'ai testé la macro directement sous Excel et elle fonctionne parfaitement, voici son code :
Sub unlockAll()
ActiveWorkbook.Unprotect Password:="pass"
ActiveWorkbook.Sheets("sheet1").Visible = xlSheetVisible
ActiveWorkbook.Sheets("sheet2").Visible = xlSheetVisible
ActiveWorkbook.Sheets("sheet3").Visible = xlSheetVisible
End Sub
Sub lockAll()
ActiveWorkbook.Sheets("sheet1").Visible = xlSheetInvisible
ActiveWorkbook.Sheets("sheet2").Visible = xlSheetInvisible
ActiveWorkbook.Sheets("sheet3").Visible = xlSheetInvisible
ActiveWorkbook.Protect Password:="pass"
End Sub
Cependant lorsque j'exécute mon script, l'appel à la macro envoie l'exception suivante :
Source: Microsoft Excel
Description: Impossible d'exécuter la macro 'unlockAll'. Il est possible qu'elle ne soit pas disponible dans ce classeur ou que toutes les macros soient désactivées.
Pourtant sur le serveur l'application Excel autorise l'exécution de toutes les macros. Je dois mal faire mon appel mais je dois avouer que je ne vois pas où.
J'ai également essayé d'ajouter la ligne suivante, avant l'appel à ma macro, dans mon code :
$Workbook->Unprotect("pass");
Mais le résultat est identique.
J'ai testé le même code avec un fichier Excel sans macro et là je n'ai aucun problème, j'arrive à extraire les informations que je souhaite.
Cela fait un moment que cela me bloque et c'est pourquoi j'aimerais avoir vos avis sur la question, je suis peut être passé à côté d'un truc.