PHPExcel identifie un file .xlsx en tant que file CSV

Ma version PHP est 5.2.9. Et j'utilise PHPExcel 1.7.5 pour parsingr un file d'Excel2007. Mais avec le même code source et le même file Excel, il a donné différents résultats sur deux machines. Les deux machines étaient avec le même deployment PHP et PHPExcel. On a bien fonctionné et l'autre a analysé tout le file Excel2007 en tant que file CSV.

J'ai débogué les deux cas et j'ai finalement trouvé les différences comme suit.

 public function canRead($pFilename) { // Check if zip class exists if (!class_exists('ZipArchive')) { return false; } // Check if file exists if (!file_exists($pFilename)) { throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); } $xl = false; // Load file $zip = new ZipArchive; if ($zip->open($pFilename) === true) { // check if it is an OOXML archive $rels = simplexml_load_ssortingng($this->_getFromZipArchive($zip, "_rels/.rels")); foreach ($rels->Relationship as $rel) { switch ($rel["Type"]) { case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument": if (basename($rel["Target"]) == 'workbook.xml') { $xl = true; } break; } } $zip->close(); } return $xl; } ... public function _getFromZipArchive(ZipArchive $archive, $fileName = '') { // Root-relative paths if (strpos($fileName, '//') !== false) { $fileName = substr($fileName, strpos($fileName, '//') + 1); } $fileName = PHPExcel_Shared_File::realpath($fileName); // Apache POI fixes $contents = $archive->getFromName($fileName); if ($contents === false) { $contents = $archive->getFromName(substr($fileName, 1)); } return $contents; } si (! file_exists ($ pFilename)) { public function canRead($pFilename) { // Check if zip class exists if (!class_exists('ZipArchive')) { return false; } // Check if file exists if (!file_exists($pFilename)) { throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); } $xl = false; // Load file $zip = new ZipArchive; if ($zip->open($pFilename) === true) { // check if it is an OOXML archive $rels = simplexml_load_ssortingng($this->_getFromZipArchive($zip, "_rels/.rels")); foreach ($rels->Relationship as $rel) { switch ($rel["Type"]) { case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument": if (basename($rel["Target"]) == 'workbook.xml') { $xl = true; } break; } } $zip->close(); } return $xl; } ... public function _getFromZipArchive(ZipArchive $archive, $fileName = '') { // Root-relative paths if (strpos($fileName, '//') !== false) { $fileName = substr($fileName, strpos($fileName, '//') + 1); } $fileName = PHPExcel_Shared_File::realpath($fileName); // Apache POI fixes $contents = $archive->getFromName($fileName); if ($contents === false) { $contents = $archive->getFromName(substr($fileName, 1)); } return $contents; } 

La $contents imprimée sur la machine work-well était une xml definition tag . Mais l'autre machine a renvoyé une string empty .

La valeur $fileName est "_rels/.rels" . J'ai google et j'ai trouvé qu'il s'agissait d'un file relationnel. Était-ce compressé dans le file Excel2007? Quelqu'un pourrait-il me dire plus d'informations sur ce file? Et comment réparer ce problème d'parsing?

FYI, j'ai utilisé un petit code pour tester cette affaire et le problème est apparu chaque fois. Le code est le suivant.

 <? require_once("PHPExcel/PHPExcel/IOFactory.php"); echo @PHPExcel_IOFactory::identify('/tmp/styleA.xlsx'); echo "\n"; exit(); ?> <? <? require_once("PHPExcel/PHPExcel/IOFactory.php"); echo @PHPExcel_IOFactory::identify('/tmp/styleA.xlsx'); echo "\n"; exit(); ?> 

Désolé pour mon mauvais anglais.

Enfin, j'ai saisi le véritable problème. Il s'est produit par l' php installation .

La machine erronée a utilisé php-cgi pour démarrer le service et l'autre utilisé php . Et la machine erronée n'a pas ajouté --enalble-fastcgi configuration --enalble-fastcgi , elle avait zip.so extension zip.so Si vous souhaitez utiliser le zip dans le projet, vous devriez append la configuration --enable-zip (pas – avec --with-zip !!!) lors de l'installation de php. Ajoutez php extension zip.so après avoir installé php, en quelque sorte, cela pourrait aller mal.