PHPExcel 在不同系统上的不同行为
PHPExcel different behavior on different systems
我在本地主机和服务器上都有 PHPExcel。
当我尝试读取本地主机上的 xlsx 文件时 - 一切正常,但当我尝试读取服务器上的同一文件时 - 所有带有西里尔文字的单元格都是空的。
所有系统都有相同的 PHPExcel 和 PHP 版本。
可能是什么问题?
谢谢!
此文件的问题在于它是由不识别文件名区分大小写的应用程序创建的。
rels
table 表示共享字符串 table(存储工作簿的所有文本字符串值)被称为 sharedStrings.xml
,但实际zip 中的文件名为 SharedStrings.xml
。 MS Excel 本身生成的文件在文件名中使用了正确的大小写,因此我猜测该文件是使用某些第三方工具或库创建的。 MS Excel 显然更容忍文件名的大小写敏感性,允许它读取 zip 而不管。
我或许可以使用
解决这个问题
$zip->getFromIndex(
$zip->locateName('sharedStrings.xml', ZIPARCHIVE::FL_NOCASE);
);
而不是
$zip->getFromName('sharedStrings.xml');
但我需要几天时间来实施修复
编辑
/PHPExcel/Reader/Excel2007.php
文件第 310 行附近的某处是 getFromZipArchive()
方法,可以更改为:
private function getFromZipArchive($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->getFromIndex(
$archive->locateName($fileName, ZIPARCHIVE::FL_NOCASE)
);
if ($contents === false) {
$contents = $archive->getFromIndex(
$archive->locateName(substr($fileName, 1), ZIPARCHIVE::FL_NOCASE)
);
}
return $contents;
}
然后将能够不区分大小写地访问共享字符串文件
我在本地主机和服务器上都有 PHPExcel。 当我尝试读取本地主机上的 xlsx 文件时 - 一切正常,但当我尝试读取服务器上的同一文件时 - 所有带有西里尔文字的单元格都是空的。
所有系统都有相同的 PHPExcel 和 PHP 版本。
可能是什么问题? 谢谢!
此文件的问题在于它是由不识别文件名区分大小写的应用程序创建的。
rels
table 表示共享字符串 table(存储工作簿的所有文本字符串值)被称为 sharedStrings.xml
,但实际zip 中的文件名为 SharedStrings.xml
。 MS Excel 本身生成的文件在文件名中使用了正确的大小写,因此我猜测该文件是使用某些第三方工具或库创建的。 MS Excel 显然更容忍文件名的大小写敏感性,允许它读取 zip 而不管。
我或许可以使用
解决这个问题$zip->getFromIndex(
$zip->locateName('sharedStrings.xml', ZIPARCHIVE::FL_NOCASE);
);
而不是
$zip->getFromName('sharedStrings.xml');
但我需要几天时间来实施修复
编辑
/PHPExcel/Reader/Excel2007.php
文件第 310 行附近的某处是 getFromZipArchive()
方法,可以更改为:
private function getFromZipArchive($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->getFromIndex(
$archive->locateName($fileName, ZIPARCHIVE::FL_NOCASE)
);
if ($contents === false) {
$contents = $archive->getFromIndex(
$archive->locateName(substr($fileName, 1), ZIPARCHIVE::FL_NOCASE)
);
}
return $contents;
}
然后将能够不区分大小写地访问共享字符串文件