当前位置: 首页 > 知识库问答 >
问题:

使用PHPExcel将XLS文件中的单页转换为CSV-内存耗尽

颜欣怡
2023-03-14

我有一个Excel文件(97-2003),我需要能够通过PHP导入,并将文件中的一页转换为CSV。这些是由用户上传的,因此没有手动操作的选项。它需要使用PHP。

我目前正在使用PHPExcel,它一直工作正常,直到我们得到一个超过33,000行的文件…这是一个致命的PHP错误:致命错误:允许内存大小为1073741824字节耗尽(试图分配97字节)在[PathhpExcel]\PHPExcel\Worksheet.php行11231

有什么方法可以进一步优化它,还是 PHPExcel 在处理大片时不适合使用?我使用的代码相当简单,所以不确定是否可以进一步优化它,但手指交叉!这是我使用的代码:

$reader = PHPExcel_IOFactory::createReader('Excel5');
$reader->setReadDataOnly(true);
$reader->setLoadSheetsOnly('Details');

$excel = $reader->load($filename);

$writer = PHPExcel_IOFactory::createWriter($excel, 'CSV');
$writer->save($filename_fixed);

如果PHPExcel不适合这项工作,我最好使用什么?

编辑-这是Mark建议后的工作代码

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
$cacheSettings = array( 'memoryCacheSize' => '2GB');
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);

$reader = PHPExcel_IOFactory::createReader('Excel5');
$reader->setReadDataOnly(true);
$reader->setLoadSheetsOnly('Details');

$excel = $reader->load($filename);

$writer = PHPExcel_IOFactory::createWriter($excel, 'CSV');
$writer->save($filename_fixed);

共有1个答案

汝昀
2023-03-14

PHPExcel 1.7.3 引入了单元格缓存作为减少在 PHP 内存限制内维护大型工作簿的内存使用的机制。单元缓存提供了一种权衡,通过序列化单元数据来减小其大小,或者允许将单元数据保存在 PHP 内存之外,只在“内存中”维护单元索引;但以性能为代价。

默认情况下,单元格缓存将以最佳速度将所有单元格存储在内存中;但其他缓存选项包括:

    < li >在内存中压缩 < li >在内存中序列化 < li >在内存中序列化的igbinary > < li >磁盘上的红色 < li>APC < li >内存缓存 < li>wincache < li>html" target="_blank">phptemp < li>sqlite或sqlite3数据库

它们之间的速度和内存使用量各不相同,也会因操作平台和其他设置而异,因此您需要确定在您自己的情况下使用哪个是最佳选择;但作为一般准则,内存使用效率越高,性能越慢。SQLite 选项是最近添加的,它提供了最佳的内存使用率,因为即使是“单元格索引”也不会在内存中维护,我目前正在测试一些更改,看看是否可以提高 sqlite 执行速度。

开发者文档的第4.2.1节介绍了用法

 类似资料:
  • 问题内容: 有谁知道是否有可以让我将XLS最好转换为JSON的应用程序? 我还将为CSV转换程序做准备,因为如果周围什么都没有的话,我可能最终不得不写自己。 问题答案: 这对我来说效果很好,不需要上传文件: https://github.com/cparker15/csv-to- json?files=1

  • 问题内容: 这里有人知道在Java中将csv文件转换为xls或xlsx文件的任何快速,干净的方法吗? 我已经有一些东西可以管理csv文件,并且我需要与其他程序具有额外的兼容性。 除了包名称外,示例代码始终受到人们的赞赏。 非常感谢, 贾斯汀 到目前为止,这是我的代码。我需要从行中删除返回值(“ \ n”)。我的某些单元格包含多行信息(一个列表),因此我可以在csv中使用“ \ n”来表示 单元格中

  • 问题内容: 我已阅读以下有关通过GoogleDocs将UTF-8编码的(希伯来语)XLS转换为CSV的建议,并且可以正常工作。当我在Sublime2中使用utf8编码打开CSV时,希伯来语正确显示。但是,当我尝试使用SQLyog将数据导入到我的数据库中时,在确保将我的目标表和导入定义都设置为UTF8之后,我变得很乱,例如: ⒚椔 我哪里出问题了? 问题答案: 从excel导出到csv的最佳方法是:

  • 问题内容: 谁能指导我如何使用PHP将XLS转换为CSV? 我有一个包含文档列表的Excel电子表格,我想使用PHP将其转换为CSV格式。 问题答案: 也许您可以开始使用PHP阅读XLS。 然后,使用主逻辑输出所需的内容(您的情况下为csv)。 祝好运,

  • 问题内容: 我需要帮助来理解使用java将XML文件转换为CSV文件所涉及的步骤。这是XML文件的示例 这是生成的CSV文件。 我当时正在考虑使用DOM解析器读取xml文件。我遇到的问题是,我需要按名称指定要编码的特定元素,但我希望它能够解析它而不这样做。 Java中是否有任何工具或库可以帮助我实现这一目标。 如果我下面有这种格式的XML文件,并且想在与MSgId相同的行中添加InitgPty的值

  • 问题内容: 致命错误:在第269行的D:\ xampplite \ htdocs \ Scraper \ PHPExcel \ Reader \ Excel2007.php中,耗尽了134217728字节的内存大小(尝试分配1078799字节) 即使我仅尝试使用PHPExcel打开〜350 KB的小型excel文件,我的128M PHP内存限制也很快耗尽了。 虽然,我可以增加配置中的内存限制,但是