我的PHP版本是5.2.9。我使用PHPExcel 1.7.5
来解析Excel2007的文件。但是使用相同的源代码和相同的Excel文件,它在两台机器上产生了不同的结果。这两台机器使用相同的PHP和PHPExcel部署。一个运行良好,另一个解析所有Excel2007文件为CSV文件。
我调试了这两个案例,最后发现了差异如下。
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_string($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;
}
工作井机器上打印的$contents
值为xml definition tag
。但是另一台机器返回了empty
字符串。
$fileName
值为"_rels/.rels"
。我谷歌它,发现它是一个关系文件。它是否在Excel2007文件中压缩?有人可以告诉我有关此文件的更多信息吗?以及如何解决这个解析问题?
仅供参考,我使用了很少的代码来测试这个案例,每次都会出现问题。代码如下。
<?
require_once("PHPExcel/PHPExcel/IOFactory.php");
echo @PHPExcel_IOFactory::identify('/tmp/styleA.xlsx');
echo "\n";
exit();
?>
抱歉我的英语不好。
答案 0 :(得分:0)
最后我发现了真正的问题。它由php installation
发生。
错误的机器使用php-cgi
启动服务而另一台使用php
。错误的机器虽然有--enalble-fastcgi
扩展名但没有添加zip.so
配置。如果你想在项目中使用zip
,你最好在安装php时添加--enable-zip
(不是--with-zip
!!!)配置。在安装php之后添加php扩展zip.so
,不知何故可能会出错。