有的时候,我们的网站需要为使用者提供 CSV 或 EXCEL 文件的下载。 最简单的方法是后台生成文件,放在服务器固定的路径下,然后生成链接指向静态文件,这样做有以下好处:
但这样的做法也有以下问题:
可见,对于使用动态数据在每次访问实时生成的 CSV、EXCEL,采用动态生成下载响应而不将文件写入磁盘的方式就有着其必要行了。 本文,我们就来介绍如何在 django 中动态生成和下载 CSV、EXCEL 文件。
有以下需要注意的地方:
def index(request):
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = "attachment;filename='abc.csv'"
writer = csv.writer(response)
writer.writerow(['username','age','height', 'weight'])
writer.writerow(['zhiliao','18','180','100']) # 在这里并不会指定文件名字。
return response
我们知道,CSV 文件的本质是逗号分隔的文本文件,因此我们通过模板生成这个文本文件。
views.py
template
注意
动态生成文件,最常用的就是流式响应,流式响应最大的优势在于其资源的节省与高效。 代码实现也比较简单。
def large_csv_view(request):
response = StreamingHttpResponse(content_type='text/csv')
response['Content-Disposition'] = "attachment;filename='abc.csv'"
rows = ("{},{}\n".format(row,row) for row in range(1,100000))
response.streaming_content = rows
return response
excel 文件的构成要比 CSV 文件复杂的多,我们可以用 xlwt 模块来操作 excel。
def export_users_xls(request):
response = HttpResponse(content_type='application/ms-excel')
response['Content-Disposition'] = 'attachment; filename="abc.xls"'
wb = xlwt.Workbook(encoding='utf-8')
ws = wb.add_sheet('Menu')
# Sheet header, first row
row_num = 0
font_style = xlwt.XFStyle()
font_style.font.bold = True
# 表头内容
columns = ['id','Mname']
for col_num in range(len(columns)):
ws.write(row_num, col_num, columns[col_num], font_style)
# Sheet body, remaining rows
font_style = xlwt.XFStyle()
# 获取数据库数据
rows = models.Menu.objects.all().values_list('id','Mname')
for row in rows:
row_num += 1
for col_num in range(len(row)):
ws.write(row_num, col_num, row[col_num], font_style)
wb.save(response)
return response
https://blog.csdn.net/xujin0/article/details/84027222。 https://blog.csdn.net/bbwangj/article/details/86526245。