django後臺返回excel表
1. 方法一(不推薦)
- 思路:先根據條件從數據庫查找data,再把data生成excel表,再把excel表返回(FileResponse)
步驟:
1.data:利用django.forms.model_to_dict 把數據轉化成dict,注意,ImageField無法轉化
from django.forms import model_to_dict user_infos = UserInfo.objects.filter(**kwargs) data = list(map(lambda x: model_to_dict(x, exclude=["avatr"]), user_infos))
2.excel:使用xlsxwriter庫根據data生成excel表
xlsxwriter的使用見下面
3.FileResponse:使用 django.http.FileResponse 返回
from django.http import FIleResponse with open("./excel/userinfos.xlsx", "rb") as f: res = FileResponse(f) res["Content-Type"] = "application/octet-stream" res["Content-Disposition"] = 'filename="userinfs.xlsx"' return res
- 缺點:每次針對不同的請求要生成不同的excel文件
2. 方法二(推薦)
- 思路:先查出數據data,再在內存中寫一個excel文件,再返回出去,這樣就省了一步
步驟
- data:和上面一樣
excel+HttpResponse:在內存中寫excel
from django.http import HttpResponse from io import BytesIO import xlsxwriter x_io = BytesIO() work_book = xlsxwriter.WorkBook(x_io) work_sheet = work_book.add_sheet("excel-1") ... ... ... work_book.close() res = HttpResponse() res["Content-Type"] = "application/octet-stream" res["Content-Disposition"] = 'filename="userinfos.xlsx"' res.write(x_io.getvalue()) return res
其他:與上面的比較就是不用再去寫一個excel文件了,也不用過後再刪除了。
3. xlsxwriter 的使用方法
pip install xlsxwriter
import xlswriter
# 注意這裏與上面用BytesIO的區別
work_book = xlsxwriter.workbook.WorkBook("./excel/user_data.xlsx")
work_sheet = work_book.add_sheet("excel-1")
data = [{"a":1, "b": 2}, {"a":22, "b":11}, {"a":54, "b":99}...]
keys = dict(data[0].keys())
keys.sort()
row, col = 0, 0
# 寫頭
for k in keys:
# 意思是:在row行,col列,寫了一個k
work_sheet.write(row, col, k)
col += 1
# 寫內容
row, col = 1, 0
for temp in data:
for k in keys:
work_sheet.write(row, col, temp[k])
col += 1
row += 1
col = 0
# work_book.close()
# 這樣就寫了一個名爲 user_data.xlsx 的文件了