Создание больших листов Excel программно - PullRequest
7 голосов
/ 18 апреля 2011

Мы используем OpenPyxl для экспорта содержимого MySQL в Microsoft Excel в формате XSLX

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

Однако объем данных, с которыми мы имеем дело, велик.Мы бежим к нехватке памяти.Таблицы могут содержать до 400 столбцов в 50000+ строк.Даже файлы большие, они не такие большие, что у Microsoft Excel или OpenOffice могут возникнуть проблемы с ними.Мы предполагаем, что наши проблемы в основном связаны с тем, что Python хранит структуру XML DOM в памяти недостаточно эффективным образом.

РЕДАКТИРОВАТЬ: Эрик, автор OpenPyxl, указал, что есть возможность заставить OpenPyxl писатьс фиксированным использованием памяти.Однако это не решило нашу проблему полностью, поскольку у нас все еще есть проблемы с сырой скоростью и чем-то еще, занимающим слишком много памяти в Python.

Теперь мы ищем более эффективные способы создания файлов Excel.С Python желательно, но если мы не можем найти хорошее решение, мы можем захотеть посмотреть и другие языки программирования.

Опции, не в произвольном порядке, включают

1) Использование OpenOffice и PyUnoи надеемся, что их структуры памяти более эффективны, чем с OpenPyxl, а мост вызовов TCP / IP достаточно эффективен

2) Openpyxl использует xml.etree.Будет ли Python lxml (собственное расширение libxml2) более эффективным с XML-структурами памяти и возможно ли заменить xml.etree напрямую с помощью lxml, например, с помощью monkey-patching?(позже изменения могут быть внесены обратно в Openpyxl, если есть явное преимущество)

3) Экспорт из MySQL в CSV и последующая обработка файлов CSV непосредственно в XSLX с использованием Python и итерации файлов

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 ]

3 голосов
/ 18 апреля 2011

Вы пытались взглянуть на оптимизированный писатель для openpyxl?Это недавняя функция (2 месяца), но она достаточно надежна (используется в производственных процессах в нескольких корпоративных проектах) и может обрабатывать практически неопределенный объем данных при постоянном потреблении памяти (около 7 МБ)

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

3 голосов
/ 18 апреля 2011

Если вы собираетесь использовать Java, вам нужно будет использовать Apache POI, но, скорее всего, не обычную UserModel, поскольку вы хотите уменьшить объем используемой памяти.

Вместо этого взгляните на BigGridDemo , который показывает, как написать очень большой файл xlsx с использованием POI, при этом большая часть работы не выполняется в памяти.

Вы также можете обнаружить, что метод, используемый в BigGridDemo, можетодинаково использоваться в Python?

...