Django: libro de guardado de openpyxl como adjunto

Hola tengo una pregunta rápida. No encontré respuesta en internet, quizás alguien tuyo 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:

  

¿Alguien puede ayudar?

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 documentación:

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

Suelo usar

 ws = wb.add_sheet("Pi") 

en lugar de

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

Además, puedes intentar hacerlo: (ver documentación )

 wb.save(stream) 

y luego usar la secuencia en HttpResponse.

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 zip , 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 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 sea legible.

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