web-dev-qa-db-fra.com

Lire le fichier Xlsx dans PhpSpreadsheet

Je souhaite lire un fichier xlsx créé dans Microsoft Excel, mais lorsque j'exécute le code suivant ...

$Source_File = "test.xlsx";
$Spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($Source_File);

... je reçois l'erreur suivante:

Fatal error: Uncaught PhpOffice\PhpSpreadsheet\Reader\Exception: Unable to identify a reader for this file in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/IOFactory.php:163
Stack trace:
  #0 /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/IOFactory.php(93): PhpOffice\PhpSpreadsheet\IOFactory::createReaderForFile('file:///home/ar...')
  #1 /var/www/html/Function_Spreadsheet.php(480): PhpOffice\PhpSpreadsheet\IOFactory::load('file:///home/ar...')
  #2 /var/www/html/Function_Home.php(3747): Spreadsheet_Reader_1('/var/www/html/F...', 3745, Array, Array)
  #3 {main} thrown in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/IOFactory.php on line 163

J'obtiens la même erreur si j'utilise à la place $Spreadsheet = IOFactory::load($Source_File);

J'obtiens l'erreur suivante si j'utilise à la place $Spreadsheet = $reader->load($Source_File);

Warning: ZipArchive::getFromName(): Invalid or uninitialized Zip object in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 311

Warning: ZipArchive::getFromName(): Invalid or uninitialized Zip object in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 313

Notice: Trying to get property 'Relationship' of non-object in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 350

Warning: Invalid argument supplied for foreach() in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 350

Warning: ZipArchive::getFromName(): Invalid or uninitialized Zip object in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 311

Warning: ZipArchive::getFromName(): Invalid or uninitialized Zip object in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 313

Notice: Trying to get property 'Relationship' of non-object in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 397

Warning: Invalid argument supplied for foreach() in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 397

Warning: ZipArchive::getFromName(): Invalid or uninitialized Zip object in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 311

Warning: ZipArchive::getFromName(): Invalid or uninitialized Zip object in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 313

Notice: Trying to get property 'Override' of non-object in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 1855

Warning: Invalid argument supplied for foreach() in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 1855

Warning: ZipArchive::close(): Invalid or uninitialized Zip object in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 1883

Le fichier est lisible et ouvert par mon PHP v7.2, dans Apache sur Ubuntu 18.04. J'ai lu plusieurs articles du forum, qui suggèrent ce qui suit, ce que j'ai fait:

J'ai essayé d'ouvrir le fichier dans LibreOffice et de l'enregistrer en tant que xlsx, mais la même erreur se produit (aucune erreur si j'enregistre en tant que xls).

Je peux créer un lecteur $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();, mais quand je fais $Spreadsheet = $reader->load($Source_File); ou $Spreadsheet = IOFactory::load($Source_File); j'obtiens la même erreur.

Je peux également créer un lecteur xls capable de lire les fichiers xls. Je peux également créer un lecteur xlsx, mais il ne lira pas le fichier xlsx, il donne la même erreur lors de la lecture du fichier xlsx. Alors, pourquoi l'erreur se produit-elle avec le fichier xlsx?

De plus, j'ai lu le code source vers lequel pointe le message d'erreur (IOFactory.php) Et j'ai trouvé l'emplacement suivant (près de la ligne # 139) où l'erreur se produit ...

//Let's see if we are lucky
if (isset($reader) && $reader->canRead($filename))
{
    return $reader;
}

... et j'ai cherché la définition de canRead, mais je ne l'ai trouvée nulle part dans /vendor/phpoffice/phpspreadsheet/. Où est défini canRead? Je pense que si je pouvais lire la définition de canRead, alors je comprendrais peut-être ce que la cause première du problème est.

METTRE À JOUR:

J'ai appris des commentaires et des discussions que canRead() est définie dans \PhpSpreadsheet\Reader\Xlsx.php À partir de la ligne 65. Dans canRead(), $Zip->open($pFilename) renvoie un code d'erreur, ZipArchive::ER_NOENT, Ce qui signifie " aucun fichier de ce type ". Cependant, le fichier existe. Alors, pourquoi cette erreur se produit-elle ?

MISE À JOUR - 2018-12-18

Cette page Web suggère qu'il existe plusieurs types de fichiers xlsx. J'ai donc exécuté file test.xlsx, Qui affichait Microsoft Excel 2007+. Ensuite, j'ai ouvert la feuille de calcul dans LibreOffice Calc et l'ai enregistrée en tant que type OOXML de fichier xlsx et relancé file test.xlsx, Qui affichait Microsoft OOXML. Ensuite, j'ai relancé le script PHP, mais j'ai la même erreur. Donc, il semble que mon type de fichier xlsx ne soit pas le problème.

J'ai donc décidé d'utiliser PHPExcel (même s'il est obsolète) pour faire le travail nécessaire. Lorsque j'ai exécuté le script à l'aide de PHPExcel, j'ai reçu une erreur similaire à propos de canRead() ne pouvant pas détecter le fichier xlsx.

J'ai donc continué à lire cette page Web et suivi la dernière suggestion de wesood, qui provenait de la réponse acceptée le cette page Web . Cette solution a fonctionné pour moi: dans le fichier /PHPExcel/IOFactory.php, J'ai ajouté PHPExcel_Settings::setZipClass(\PHPExcel_Settings::PCLZIP); juste avant if (isset($reader) && $reader->canRead($filename)).

Cependant, je veux toujours savoir comment résoudre ce problème dans PhpSpreadsheet. Il semble que je doive en savoir plus sur le fonctionnement de pclzip et si une action similaire doit être effectuée avec PhpSpreadsheet.

MISE À JOUR 2019-02-10:

J'ai essayé d'exécuter le script aujourd'hui et il semble que l'ajout de PHPExcel_Settings::setZipClass(\PHPExcel_Settings::PCLZIP); ne fonctionne plus. Donc, je suis de nouveau coincé ...

Que fais-je de mal? Toute aide est la bienvenue!

MISE À JOUR 2019-02-18:

En suivant les recommandations des commentaires, j'ai testé le script en utilisant des fichiers XLSX aléatoires trouvés via les résultats de recherche Google (par exemple, ce fichier ), qui étaient de type Excel 2007+ Ou Microsoft OOXML Et la même erreur s'affiche pour PhpSpreadsheet:

Erreur fatale: PhcOffice\PhpSpreadsheet\Reader\Exception non capturé: Impossible d'identifier un lecteur pour ce fichier dans /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/IOFactory.php:176 Trace de pile: # 0/var /www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/IOFactory.php(113): PhpOffice\PhpSpreadsheet\IOFactory :: createReaderForFile ('fichier: /// var/www ...') # 1/var/www/html/Function_Spreadsheet.php (798): PhpOffice\PhpSpreadsheet\IOFactory :: identifier ('file: /// var/www ...') # 2 /var/www/html/Function_Home.php(3748): Spreadsheet_Reader_1 ('/ var/www/html/F ...', 3746, Array, Array) # 3 {main} jeté dans /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/IOFactory.php on ligne 176

6
Arya

J'ai rencontré cette même erreur exacte lors de la tentative de chargement dans un fichier XLSX. Pour moi personnellement, j'ai découvert une solution très simple qui a résolu mon problème. Je récupérais manuellement l'extension du nom de fichier sous la forme xlsx. J'ai remarqué un autre code à moi en utilisant l'ancienne PHP bibliothèque de feuilles de calcul acceptait l'extension Xls. J'ai donc essayé de charger dans Xlsx et cela a parfaitement fonctionné.

Voici le code que j'utilise pour charger correctement l'extension. Il saisit simplement tous les caractères après la dernière période, puis capture le premier caractère de cette sous-chaîne. ucfirst met simplement en majuscule la première lettre de la chaîne passée. substr renvoie une sous-chaîne où le premier paramètre est la chaîne à extraire et le deuxième paramètre est l'indice vers lequel démarrer la sous-chaîne dans la chaîne donnée. Et enfin strrpos trouve la dernière occurrence d'une sous-chaîne dans la chaîne donnée.

https://www.php.net/manual/en/function.ucfirst.php

https://www.php.net/manual/en/function.strrpos

https://www.php.net/manual/en/function.substr.php

$inputFileType = ucfirst(substr($cccFile, strrpos($cccFile, '.') + 1));

/**  Create a new Reader of the type defined in $inputFileType  **/
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType);

Une fois, j'ai ajouté la commande ucfirst, cela a résolu le problème pour moi.

1
dmikester1

J'ai eu le même problème, après avoir ajouté des fichiers .xlsx à un référentiel git sur mon Mac.
Le problème était que git convertissait automatiquement les fins de ligne.

La solution était d'ajouter ces lignes au .gitattributes fichier:

*.xls   binary
*.xlsx  binary
0
lewis