2014-01-16 114 views
1

我的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(); 
?> 

對不起,我的英文不好。

+0

所有'.xlsx'文件都被壓縮。文件'_rels/.rels'只是鏈接一些其他文件屬性。具體來說,它將excel文件指向'app.xml','core.xml'和'workbook.xml'。其中一個安裝可能會損壞。它也可能與每個系統所在的操作系統有關。 – foochow

+0

只要解決問題,你提到你的代碼是不同的,你的意思是它是一方的額外代碼? – foochow

+0

@Foo_Chow感謝您對'_rels/.rels'的解釋。而且我在兩臺機器上的代碼是相同的,包括上面的測試代碼。我只使用了Excel2007文件,PHPExcel庫和4行測試代碼。我認爲問題是由環境變量的差異造成的。但我仍然無法找到真正的原因。你提到會有一些損壞的安裝。你能限制他們之間的一些庫或其他擴展模塊? – chestnut

回答

0

終於我發現了真正的問題。它發生在php installation

錯誤的機器使用php-cgi啓動服務和其他使用php。並且錯誤的機器沒有添加--enalble-fastcgi配置,雖然它有zip.so擴展名。如果您想在項目中使用zip,則最好在安裝php時添加--enable-zip(不是--with-zip !!!)配置。在安裝php之後添加php擴展zip.so它可能會出錯。