PHPExcel将.xlsx文件标识为CSV文件
我的PHP版本是5.2.9。我使用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_
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()
函数。