tutorial python django excel xlsx openpyxl

python - tutorial - Django: libro de guardado de openpyxl como adjunto



pip excel python (3)

Darle una oportunidad:

from openpyxl.writer.excel import save_virtual_workbook ... response = HttpResponse(save_virtual_workbook(wb), content_type=''application/vnd.ms-excel'')

save_virtual_workbook fue especialmente diseñado para su caso de uso. Aquí hay una cadena de documentos:

"" "Devuelva un libro de trabajo en memoria, adecuado para una respuesta de Django." ""

Hola tengo una pregunta rápida. No encontré respuesta en internet, quizás alguien de ustedes pueda ayudarme.

Así que quiero guardar el libro de trabajo como archivo adjunto pero no sé cómo veamos un ejemplo:

from openpyxl import Workbook from openpyxl.cell import get_column_letter wb = Workbook(encoding=''utf-8'') dest_filename = ''file.xlsx'' ws = wb.worksheets[0] ws.title = "range names" for col_idx in xrange(1, 40): col = get_column_letter(col_idx) for row in xrange(1, 600): ws.cell(''%s%s''%(col, row)).value = ''%s%s'' % (col, row) ws = wb.create_sheet() ws.title = ''Pi'' ws.cell(''F5'').value = 3.14

Entonces intenté:

response = HttpResponse(wb, content_type=''application/vnd.ms-excel'') response[''Content-Disposition''] = ''attachment; filename="foo.xls"'' return response

De hecho, está devolviendo el archivo xlsx, pero en el archivo solo hay direcciones de objeto, no el contenido del archivo:

<openpyxl.workbook.Workbook object at 0x00000000042806D8>

¿Alguien puede ayudar?


En al menos algunas versiones de django / python / openpyxl, la solución dada no funciona. Ver https://bitbucket.org/openpyxl/openpyxl/issues/657/save_virtual_workbook-generates-junk-data

Solución de trabajo simple:

wb = Workbook(write_only=True, encoding=''utf-8'') ws = wb.create_sheet() for row in data: ws.append([str(cell) for cell in row]) response = HttpResponse(content_type=''application/vnd.ms-excel'') wb.save(response)

Lo que está sucediendo aquí es que HttpResponse de Django es un objeto similar a un archivo. Workbook.save() puede tomar un objeto similar a un archivo. (Internamente, usa un archivo zipfile , que toma un nombre de archivo o un objeto similar a un archivo).

Si está manipulando el archivo en la memoria, esta es la solución más simple y probablemente más eficiente. Una respuesta de transmisión en tiempo real no tiene sentido ya que los datos no se crean con un generador. Incluso si save_virtual_workbook funciona, los datos que escribe se generan como un bloque antes de que puedan leerse.

La otra opción sería crear un NamedTemporaryFile (de tempfile o el contenedor de Django), pasarlo a Workbook.save() , luego usar FileResponse para transmitirlo desde el sistema de archivos en lugar de hacerlo desde la memoria.


Por lo general uso

ws = wb.add_sheet("Pi")

en lugar de

ws = wb.create_sheet() ws.title = "Pi"

Además, puedes intentar hacerlo: (ver documentation )

wb.save(stream)

y luego usar la secuencia en HttpResponse.