我的PHP版本是5.2.9。我使用PHPExcel 1.7.5
解析Excel2007的文件。但是使用相同的源代码和相同的Excel文件,它在两台机器上产生了不同的结果。这两台机器使用相同的PHP和PHPExcel部署。一个运行良好,另一个将所有Excel2007文件解析为CSV文件。PHPExcel将.xlsx文件标识为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();
?>
对不起,我的英文不好。
所有'.xlsx'文件都被压缩。文件'_rels/.rels'只是链接一些其他文件属性。具体来说,它将excel文件指向'app.xml','core.xml'和'workbook.xml'。其中一个安装可能会损坏。它也可能与每个系统所在的操作系统有关。 – foochow
只要解决问题,你提到你的代码是不同的,你的意思是它是一方的额外代码? – foochow
@Foo_Chow感谢您对'_rels/.rels'的解释。而且我在两台机器上的代码是相同的,包括上面的测试代码。我只使用了Excel2007文件,PHPExcel库和4行测试代码。我认为问题是由环境变量的差异造成的。但我仍然无法找到真正的原因。你提到会有一些损坏的安装。你能限制他们之间的一些库或其他扩展模块? – chestnut