2011-04-18 23 views
6

Estamos utilizando OpenPyxl para exportar contenido de MySQL a Microsoft Excel en formato XSLXla creación de grandes hojas de Excel mediante programación

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

Sin embargo, la cantidad de datos que nos ocupa es grande. Nos estamos quedando sin memoria. Las tablas pueden contener hasta 400 columnas en más de 500 filas. Incluso los archivos son grandes, no son tan grandes como para que Microsoft Excel u OpenOffice tengan problemas con ellos. Estamos asumiendo que nuestros problemas provienen principalmente del hecho de que Python mantiene la estructura XML DOM en la memoria de manera no suficientemente eficiente.

EDITAR: Eric, el autor de OpenPyxl, señaló que hay una opción para hacer que OpenPyxl escriba con el uso de memoria fija. Sin embargo, esto no resolvió nuestro problema por completo, ya que todavía tenemos problemas con la velocidad bruta y algo más que ocupa demasiada memoria en Python.

Ahora estamos buscando maneras más eficientes de crear archivos de Excel. Con Python preferiblemente, pero si no podemos encontrar una buena solución, es posible que deseemos buscar otros lenguajes de programación también.

opciones, no en un orden específico, incluyen

1) El uso de OpenOffice y PyUNO y esperan que sus estructuras de memoria son más eficientes que con OpenPyxl y el puente llamado TCP/IP es lo suficientemente eficiente

2) Openpyxl usa xml.etree. ¿Python lxml (extensión nativa libxml2) sería más eficiente con estructuras de memoria XML y es posible reemplazar xml.etree directamente con lxml drop-in, p. con parche de mono? (Más tarde los cambios podrían ser aportados de nuevo a Openpyxl si hay un beneficio claro)

3) Exportación de MySQL a CSV y luego archivos CSV post-proceso directamente a XSLX usando Python y el archivo iteración

4) Uso otros lenguajes de programación y bibliotecas (Java)

Punteros:

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

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

+1

¿tiene ser xlsx, ¿estás haciendo un formateo personalizado o algo así?si solo era un volcado de csv directo de mysql, Excel puede abrirlos con bastante felicidad sin necesidad del paso de conversión – bumperbox

+1

, necesita formato personalizado, CSV pierde fechas y otras columnas complejas –

Respuesta

3

Si va a usar Java, querrá utilizar Apache POI, pero probablemente no sea el modelo de usuario normal, ya que quiere mantener su huella de memoria.

En su lugar, eche un vistazo a BigGridDemo, que le muestra cómo escribir un archivo xlsx muy grande utilizando POI, con la mayor parte del trabajo sin que ocurra en la memoria.

¿También podría encontrar que la técnica utilizada en BigGridDemo podría usarse igualmente en Python?

3

¿Ha intentado ver el escritor optimizado para openpyxl? Es una característica reciente (2 meses de edad), pero es bastante robusto (utilizado en la producción de varios proyectos corporativos) y puede manejar cantidad casi infinita de los datos con el consumo de memoria constante (alrededor de 7Mb)

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

+0

cómo escribo hojas accediendo a columnas de filas y el método 'cell' en Escritor optimizado? –

Cuestiones relacionadas