使用PHP读写Excel文件

5

可能重复:
PHP_excel的替代方案
需要帮助的PHPExcel读者

第一篇文章。我有一个非常特殊的需求,需要使用PHP/MySQL读写非常大(5MB以上)的Excel文件。我已经使用了PHPExcel,虽然它非常优雅,但对于我的需求来说速度太慢,并且使用了太多的PHP内存。目前,我的主机限制了我最多只能使用32M的PHP内存。

我的当前解决方案如下:

导入到数据库中

我使用php-excel reader(http://code.google.com/p/php-excel-reader/)来处理.xls文件 - 在导入大约3000行之前,PHP会耗尽内存。
我使用spreadsheet reader(https://github.com/nuovo/spreadsheet-reader)来处理.xlsx文件,到目前为止,我已经尝试了5000行以上,而没有耗尽内存。它非常慢,这使我相信它是在打开和关闭Excel文件,并一次读取一部分数据。

导出

对于少于500行的任何内容,使用PHP Excel效果很好。但速度非常慢,32Mb PHP内存无法处理数百行以上的内容(注:我正在使用缓存,虽然有所帮助,但还不够)

对于超过500行的任何内容,请使用基本的制表符分隔文本。速度非常快,没有行数限制,但没有格式和真正的Excel。

理想情况下,我正在寻找一个全能型解决方案,可以快速读写 .xls 和 .xlsx 文件,而且不会遇到内存问题。我不介意使用商业产品,并愿意支付几百美元购买可行的产品。
我已经花费数小时在互联网和这个网站上搜索,但还没有找到合适的方案。
有什么建议吗?
附注:如果有人想看看我如何实现上述解决方案,我很乐意分享代码。

你只需要内存来存储数据,在32MB的内存中存储几千行任何数据都非常紧张。你不能使用ini_set来增加内存吗?你是将数据存储在内存中还是立即写入文件中? - deceze
只需在您的服务器上安装Excel即可。如果您的服务器与Excel不兼容,请更换与之兼容的服务器操作系统。 - hakre
你不能强制所有人都保存为.csv格式吗? :) - Robin Castlin
不是寻求关于PHPExcel的帮助,因此请勿重复。目前无法安装Excel或增加内存。正在探索Mark提供的替代方案。谢谢大家。 - Kage
当然我可以使用 .csv,但我正在尝试编写一个网站,以本地 Excel 格式漂亮地格式化输出数据。 - Kage
显示剩余2条评论
5个回答

4

如果您对PHPExcel的速度和内存需求感到不满意,我会向您指出我在这个问题上的标准答案。如果答案没有列在那里,那么它可能不存在:那个列表是我所知道的最全面的......尽管编写自己的替代方案来代替PHPExcel的人很少告诉我,这使得保持最新变得困难。


谢谢Mark。我刚刚看到了你的备选列表,现在正在探索其中的一些。别误会,PHPExcel非常出色且易于使用,只是我遇到了某些限制并试图绕过它们。我的当前解决方案可以工作,但远不如PHP Excel那样优雅。我只是希望能找到一些东西,既能像PHP输出CSV一样快速读写,又具有一些格式化功能。 - Kage
在速度方面,你很难找到任何与CSV相近的东西:CSV是一种简单的格式,可以逐行简单地编写;而BIFF实际上是一个带有许多个体(非线性文件)的目录,而OfficeOpenXML则是一个复杂的XML文件集合,包装在一个zip包装器中。如果你找到了什么,请告诉我(即使没有其他原因,也可以让我尝试保持替代列表的最新状态)。 - Mark Baker
谢谢Mark。问题已解决。使用我上面提到的两个导入库之一,并使用你建议的一个导出替代方案(php-writeexcel),我现在可以成功地导入和导出超过10,000行数据。如果你还没有添加Nuovo(https://github.com/nuovo/spreadsheet-reader)到你的列表中,我建议你添加它。它只能读取xlsx文件,速度相对较慢,但没有内存问题。 - Kage
1
我维护着一个名为“spreadsheet-reader”的库,自从这个问题出现后,XLSX的性能得到了改善——罪魁祸首是XLSX文件中存储在单独的XML文件中的所谓“共享字符串”。我之前编写的代码只是按顺序读取XML文件,但当共享字符串的顺序与电子表格中的顺序不同时,就会出现问题。然而,现在它们被缓存在内存中(有一个限制,以免耗尽可用内存),因此XLSX的读取速度应该更快。此外,该库可以很好地读取XLS、CSV、ODS和各种分隔符文本文件。 - pilsetnieks
谢谢Nouveau,spreadsheet-reader对我非常有用。我不确定你是否考虑编写一个Excel编写器? - Kage

2
据我的经验,使用php实现excel功能的性能并不好(用perl实现8分钟完成了php需要3小时才能完成的工作),因此我最终选择使用Perl。
对于内存耗尽的问题,你唯一能做的就是提高memory_limit的值。请参考这里

看看这个,http://www.bettina-attack.de/jonny/view.php/projects/php_writeexcel/demo/。我刚实现了它,它可以在几秒钟内写入1000行30列。这是一个Perl脚本的PHP转换。 - Kage
@Kage 我需要写入 30,000 行数据 :) 在 10,000 行后,我发现2011年找到的所有 php 实现都非常慢。 - Vyktor
Vyktor。不确定您认为什么是慢的,但我上面提到的脚本大约在15秒内输出大约10,000行数据,每行有34列数据(约6mb)。 Perl脚本会比这快得多吗? - Kage
@Kage Ah 当它工作时,1万行是一个阈值,然后时间复杂度开始快速增加...2万需要超过20分钟。 - Vyktor

0

-1

我会推荐使用PHPExcel。它易于使用,如果需要更改功能也很容易。我经常使用它,即使是处理大型复杂的电子表格也从未遇到过任何问题。


1
正如我在问题中所述,我已经在使用PHPExcel。 - Kage
1
抱歉,我看错了。还有一个叫做php_excel或类似的包,我以为那是你尝试过的那个。我的错 :P - inquam

-2

1
正如我在问题中所述,我已经在使用PHPExcel。 - Kage
它有文档,你可以查看。 - saidOnder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接