django後臺返回excel表

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文件,再返回出去,這樣就省了一步
  • 步驟

    1. data:和上面一樣
    2. 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 的文件了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章