programing

django에서 openpyxl workbook 개체를 HttpResponse로 반환합니다.가능합니까?

abcjava 2023. 6. 20. 21:17
반응형

django에서 openpyxl workbook 개체를 HttpResponse로 반환합니다.가능합니까?

저는 장고의 데이터베이스에서 엑셀 형식의 데이터를 방문자들에게 제공해야 합니다.

제가 생각할 수 있는 유일한 방법은 다음 단계입니다.

  1. 데이터베이스에서 데이터를 추출합니다.
  2. 으로 포장합니다.Workbook에서의 반대.openpyxl.
  3. 일시적으로 어딘가에 저장합니다.
  4. 다시 'rb'로 읽습니다.
  5. Excel의 MIME 유형이 포함된 보기를 반환합니다.
  6. 디스크의 Excel 파일을 삭제합니다.(지금은 쓸모가 없지 않습니까?)

그 정도면 됐다.하지만, 저는 이것을 하는 다른 더 좋은 방법이 있다고 생각합니다.내 말은, 어쩌면 돌아올 방법이 있을지도 몰라요.openpyxl로서 반대하는.HttpResponse중간 파일 매체 없이 직접.

그래서 제 질문은 다음과 같습니다. 반품이 가능한가요?openpyxlWorbook목적어?(처음입니다.openpyxl)

실제로 데이터를 디스크 어디에나 저장할 필요가 없습니다. openpyxl에는 이를 수행할 수 있는 방법이 있습니다. 문서화가 잘 되어 있지는 않습니다.오래 전에 xlwt를 사용하여 이런 것을 만들었지만, 최근에는 openpyxl을 사용하여 Falcon 프레임워크에서도 비슷한 것을 만들었습니다.

이 두 가지를 결합하면 코드가 다음과 같이 나타납니다.

from django.http import HttpResponse
from openpyxl import Workbook
from openpyxl.writer.excel import save_virtual_workbook


workbook = Workbook()
worksheet = workbook.active

# ... worksheet.append(...) all of your data ...

response = HttpResponse(content=save_virtual_workbook(workbook), mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
response['Content-Disposition'] = 'attachment; filename=myexport.xlsx'
return response

더 큰 파일을 생성하는 경우 StreamingHttpResponse를 사용하는 것을 검토하는 것이 좋습니다. 하지만 적어도 이것이 당신을 도와줄 것이라고 믿습니다.

이것은 제가 작업한 두 프로젝트의 병합을 기반으로 한 즉흥적인 스니펫이므로 정확하지 않을 수 있습니다.그래도 꽤 가까울 겁니다.Falcon의 출력은 다음과 같습니다.

response.content_type = 'application/octet-stream;'
response.set_header('Content-Disposition', 'attachment; filename=myexport.xlsx')
response.body = save_virtual_workbook(workbook)

업데이트: 이전 버전을 완전히 다시 썼기 때문에 이제 훨씬 쉬워졌습니다.django-excel-response라이브러리, openpyxl 사용!이제 https://github.com/tarkatronic/django-excel-response 에서 확인할 수 있습니다.

설치할 수 있습니다.pip install django-excel-response그리고 장고의 대안으로 그것을 사용하기 시작합니다.HttpResponse최소한의 문서가 포함되어 있으며, 개선/제안을 환영합니다.:)

save_virtual_workbook이 더 이상 사용되지 않기 때문에 stream을 대신 사용했습니다.

from openpyxl import Workbook
from tempfile import NamedTemporaryFile

def exportToExcel(request):
   workbook = Workbook()
   ...

   with NamedTemporaryFile() as tmp:
      workbook.save(tmp.name)
      tmp.seek(0)
      stream = tmp.read()

   response = HttpResponse(content=stream, content_type='application/ms-excel', )
   response['Content-Disposition'] = f'attachment; filename=ExportedExcel-{datetime.now().strftime("%Y%m%d%H%M")}.xlsx'
   return response

이것은 나에게 효과가 있었습니다.

from openpyxl import Workbook, load_workbook
from openpyxl.writer.excel import save_virtual_workbook

wb = Workbook()
...

response = HttpResponse(content=save_virtual_workbook(wb), content_type='application/ms-excel')
response['Content-Disposition'] = 'attachment; filename=Inform.xlsx'
return response

언급URL : https://stackoverflow.com/questions/33217306/return-openpyxl-workbook-object-as-httpresponse-in-django-is-it-possible

반응형