django에서 openpyxl workbook 개체를 HttpResponse로 반환합니다.가능합니까?
저는 장고의 데이터베이스에서 엑셀 형식의 데이터를 방문자들에게 제공해야 합니다.
제가 생각할 수 있는 유일한 방법은 다음 단계입니다.
- 데이터베이스에서 데이터를 추출합니다.
- 으로 포장합니다.
Workbook
에서의 반대.openpyxl
. - 일시적으로 어딘가에 저장합니다.
- 다시 'rb'로 읽습니다.
- Excel의 MIME 유형이 포함된 보기를 반환합니다.
- 디스크의 Excel 파일을 삭제합니다.(지금은 쓸모가 없지 않습니까?)
그 정도면 됐다.하지만, 저는 이것을 하는 다른 더 좋은 방법이 있다고 생각합니다.내 말은, 어쩌면 돌아올 방법이 있을지도 몰라요.openpyxl
로서 반대하는.HttpResponse
중간 파일 매체 없이 직접.
그래서 제 질문은 다음과 같습니다. 반품이 가능한가요?openpyxl
의Worbook
목적어?(처음입니다.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
'programing' 카테고리의 다른 글
판다 데이터 프레임 및 카운트에서 선택한 열에 있는 값의 고유한 조합 (0) | 2023.06.20 |
---|---|
typescript node.js express 경로분리된 파일 모범 사례 (0) | 2023.06.20 |
static method와 abc.abstract method: 섞일까요? (0) | 2023.06.15 |
iTunesConnect / App StoreConnect에서 앱을 삭제하는 방법 (0) | 2023.06.15 |
제목별 검색 입력이 다시 비어 있을 때 초기 배열을 시각화하는 방법은 무엇입니까? (0) | 2023.06.15 |