2014-01-16 54 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它可能会出错。