我的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