PHPExcel将.xlsx文件标识为CSV文件

时间:2014-01-16 04:30:01

标签: php excel

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

抱歉我的英语不好。

1 个答案:

答案 0 :(得分:0)

最后我发现了真正的问题。它由php installation发生。

错误的机器使用php-cgi启动服务而另一台使用php。错误的机器虽然有--enalble-fastcgi扩展名但没有添加zip.so配置。如果你想在项目中使用zip,你最好在安装php时添加--enable-zip(不是--with-zip !!!)配置。在安装php之后添加php扩展zip.so,不知何故可能会出错。