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

PHPExcel将.xlsx文件标识为CSV文件,php,excel,Php,Excel,我的PHP版本是5.2.9。我使用phpexcel1.7.5解析Excel2007的一个文件。但是,使用相同的源代码和相同的Excel文件,它在两台机器上得到了不同的结果。这两台机器使用相同的PHP和PHPExcel部署。一个运行良好,另一个将所有Excel2007文件解析为CSV文件 我调试了这两个案例,最后发现了如下差异 public function canRead($pFilename) { // Check if zip class exists if (!class_

我的PHP版本是5.2.9。我使用
phpexcel1.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;
}
<?
    require_once("PHPExcel/PHPExcel/IOFactory.php");
    echo @PHPExcel_IOFactory::identify('/tmp/styleA.xlsx');
    echo "\n";
    exit();
?>
work well机器上打印的
$contents
值是
xml定义标签
。但是另一台机器返回了一个
空的
字符串

$fileName
值为
“\u rels/.rels”
。我搜索了一下,发现这是一个关系文件。是否在Excel2007文件中进行了压缩?有人能告诉我更多关于这个文件的信息吗?如何解决这个解析问题

仅供参考,我使用了很少的代码来测试这个案例,每次都会出现问题。代码如下

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;
}
<?
    require_once("PHPExcel/PHPExcel/IOFactory.php");
    echo @PHPExcel_IOFactory::identify('/tmp/styleA.xlsx');
    echo "\n";
    exit();
?>


对不起,我的英语不好。

我终于抓住了真正的问题。它是在
php安装过程中发生的


出错机器使用
php cgi
启动服务,另一台使用
php
。而且出错的机器没有添加
——启用fastcgi
配置,尽管它有
zip.so
扩展。如果您想在项目中使用
zip
,最好在安装php时添加
--启用zip
(而不是
--使用zip
!!!)配置。添加php扩展名
zip。因此
安装php后可能会出现问题。

所有
.xlsx
文件都被压缩。文件
\u rels/.rels
只是链接了一些其他文件属性。具体来说,它将excel文件指向
app.xml
core.xml
workbook.xml
。您的一个安装可能已损坏。这也可能与每个系统所使用的操作系统有关。就解决问题而言,你提到你的代码是不同的,你的意思是这是一个额外的代码吗?@Foo\u Chow感谢
\u rels/.rels
的解释。和我在两台机器上的代码是一样的,包括上面的测试代码。我刚刚使用了一个Excel2007文件、PHPExcel库和4行测试代码。我认为问题是由环境变量的差异造成的。但我还是找不到真正的原因。您提到会有一些损坏的安装。您能将它们限制在一些lib或其他扩展模块中吗?@Foo_Chow我在两个x86_64 GNU/Linux machinesOk上工作,所以您的问题是PHPExcel没有读取
\u rels/.rels
文件。尝试用
$rels=simplexml\u load\u字符串($zip->getFromName(''u rels/.rels'))替换
$rels=simplexml\u load\u字符串中的以下内容:
。如果这样做有效,则问题在于
\u getFromZipArchive()
函数。