programing

장고: openpyxl 워크북을 첨부 파일로 저장

fastcode 2023. 4. 15. 09:32
반응형

장고: openpyxl 워크북을 첨부 파일로 저장

안녕하세요, 질문이 하나 있는데요.인터넷에서 답을 못 찾았는데 당신 중 누군가가 도와줄 수 있을 것 같아요.

그래서 워크북을 첨부 파일로 저장하고 싶은데 예를 들어 보겠습니다.

    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

그리고 나서 나는 시도했다:

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

실제로 xlsx 파일을 반환하고 있지만 파일에는 파일 내용이 아닌 객체 주소만 있습니다.

<openpyxl.workbook.Workbook object at 0x00000000042806D8>

누가 좀 도와줄래?

시험해 보세요.

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

save_virtual_workbook사용 사례에 맞게 특별히 설계되었습니다.다음은 문서 문자열입니다.

"장고 응답에 적합한 인메모리 워크북을 반환합니다."""

적어도 일부 버전의 django/python/openpyxl에서는 지정된 용액이 작동하지 않습니다.https://bitbucket.org/openpyxl/openpyxl/issues/657/save_virtual_workbook-generates-junk-data 를 참조해 주세요.

심플한 기능 솔루션:

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)

여기서 일어나고 있는 일은 Django의 HttpResponse가 파일과 같은 오브젝트라는 것입니다. Workbook.save()파일 같은 개체를 가져올 수 있습니다.(내부에서는 zipfile을 사용합니다.zipfile은 파일명 또는 파일라이크 오브젝트 중 하나를 사용합니다).

메모리내의 파일을 조작하는 경우는, 이것이 가장 심플하고 효율적인 솔루션입니다.생성기를 사용하여 데이터를 생성하지 않기 때문에 스트리밍 응답은 의미가 없습니다.save_virtual_workbook이 동작해도 쓰기 데이터는 읽기 전에 블록으로 생성됩니다.

다른 옵션은 Named를 작성하는 것입니다.Temporary File(temp 파일 또는 Django 래퍼)을 사용하여 다음 주소로 전달합니다.Workbook.save()그런 다음 FileResponse를 사용하여 메모리 대신 파일 시스템에서 스트리밍합니다.

나는 주로 사용한다.

ws = wb.add_sheet("Pi")

대신

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

또, 다음의 조작을 시도할 수 있습니다(매뉴얼 참조).

wb.save(stream)

그런 다음 HttpResponse에서 스트림을 사용합니다.

다음의 코드 라인도 시험해 볼 수 있습니다.
파일 이름을 원하는 대로 설정할 수도 있습니다.

wb = Workbook()
..............
..............
response = HttpResponse(save_virtual_workbook(wb),content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
response['Content-Disposition'] = 'attachment; filename='+str(yourFileName)+'_report'+'.xlsx'
return response

언급URL : https://stackoverflow.com/questions/16016039/django-openpyxl-saving-workbook-as-attachment

반응형