程序matically创建大型Excel表格

8 投票
2 回答
2981 浏览
提问于 2025-04-16 15:57

我们正在使用OpenPyxl把MySQL里的内容导出到Microsoft Excel的XSLX格式。

https://bitbucket.org/ericgazoni/openpyxl/overview

不过,我们处理的数据量很大,导致内存不够用。表格可能有多达400列和超过50000行。虽然文件很大,但也不是大到Microsoft Excel或OpenOffice会出问题的程度。我们认为问题主要是因为Python在内存中处理XML结构的方式不够高效。

编辑:OpenPyxl的作者Eric指出,有一个选项可以让OpenPyxl在写入时使用固定的内存。不过,这并没有完全解决我们的问题,因为我们仍然面临速度慢和其他东西占用过多内存的问题。

现在我们在寻找更高效的方法来创建Excel文件。我们希望使用Python,但如果找不到好的解决方案,也可能考虑其他编程语言。

我们考虑的选项(没有特定顺序)包括:

1) 使用OpenOffice和PyUno,希望它们的内存结构比OpenPyxl更高效,并且TCP/IP调用桥接足够高效。

2) Openpyxl使用xml.etree。Python的lxml(libxml2的本地扩展)在处理XML内存结构时会更高效吗?是否可以直接用lxml替换xml.etree,比如通过猴子补丁?(如果有明显的好处,之后可以把这些改动贡献回Openpyxl)

3) 从MySQL导出到CSV,然后直接用Python处理CSV文件,转换成XSLX格式。

4) 使用其他编程语言和库(比如Java)。

参考链接:

http://dev.lethain.com/handling-very-large-csv-and-xml-files-in-python/

http://enginoz.wordpress.com/2010/03/31/writing-xlsx-with-java/

2 个回答

4

如果你打算使用Java,建议你用Apache POI这个工具,但最好不要用普通的UserModel,因为那样会占用比较多的内存。

你可以看看这个BigGridDemo的例子,它教你如何用POI写一个非常大的xlsx文件,而且大部分操作都不会在内存中进行。

你可能还会发现,BigGridDemo中使用的技巧也可以在Python中使用哦?

4

你有没有试过看看openpyxl的优化写入功能?这是一个最近推出的功能(大约两个月前),但它非常稳定(在几个企业项目中已经投入使用),可以处理几乎无限量的数据,而且内存消耗保持在一个稳定的水平(大约7MB)。

http://packages.python.org/openpyxl/optimized.html#optimized-writer

撰写回答