使用 django 下载文件
Downloading a file with django
我正在尝试使用 django 下载由 xlsxwriter 生成的 xlsl 文件。我以前曾多次编写过这样的代码,但没有使用 xlsxwriter(使用 csvwriter)并且它运行良好。但在这种情况下,当我下载文件时,它总是空的。但是文件系统上的文件不是。
这是我的查看代码:
def download_xls(self, request):
os.chdir('/tmp')
xls_name = re.sub('\s+', '_', "%s_%s_%s.xlsx" % (
request.user.username.lower(),
self.report.name.lower(),
datetime.now().strftime('%y%m%d_%H%I%S')))
workbook = xlsxwriter.Workbook(xls_name)
worksheet1 = workbook.add_worksheet()
worksheet2 = workbook.add_worksheet()
worksheet1.write("A1", "hello1")
worksheet2.write("A1", "hello2")
workbook.close()
response = HttpResponse(content_type='application/ms-excel')
response['Content-disposition'] = "attachment; filename=%s" % xls_name
return response
这是文件系统上的文件:
-rw-r--r-- 1 _www wheel 5751 Oct 24 09:14 /tmp/admin_wafer_viz_151024_090900.xlsx
这是下载的文件:
-rw-------@ 1 LarryMartell staff 0 Oct 24 09:14 admin_wafer_viz_151024_090900.xlsx
谁能看出我在这里做错了什么可能很愚蠢的简单事情?
您需要将工作簿保存到响应中才能将实际文件放入 HTTP 响应中:
def download_xls(self, request):
os.chdir('/tmp')
xls_name = re.sub('\s+', '_', "%s_%s_%s.xlsx" % (
request.user.username.lower(),
self.report.name.lower(),
datetime.now().strftime('%y%m%d_%H%I%S')))
output = io.BytesIO()
workbook = Workbook(output, {'in_memory': True})
worksheet1 = workbook.add_worksheet()
worksheet2 = workbook.add_worksheet()
worksheet1.write("A1", "hello1")
worksheet2.write("A1", "hello2")
workbook.close()
output.seek(0)
response = HttpResponse(content_type='application/ms-excel')
response['Content-disposition'] = "attachment; filename=%s" % xls_name
return response
你也可以尝试 xlwt 包,它看起来更简单:
workbook.save(response)
response = HttpResponse(content_type='application/ms-excel')
response['Content-Disposition'] = "attachment; filename=%s" % xls_name
你可以在我的一个项目中看到一个例子here
我正在尝试使用 django 下载由 xlsxwriter 生成的 xlsl 文件。我以前曾多次编写过这样的代码,但没有使用 xlsxwriter(使用 csvwriter)并且它运行良好。但在这种情况下,当我下载文件时,它总是空的。但是文件系统上的文件不是。
这是我的查看代码:
def download_xls(self, request):
os.chdir('/tmp')
xls_name = re.sub('\s+', '_', "%s_%s_%s.xlsx" % (
request.user.username.lower(),
self.report.name.lower(),
datetime.now().strftime('%y%m%d_%H%I%S')))
workbook = xlsxwriter.Workbook(xls_name)
worksheet1 = workbook.add_worksheet()
worksheet2 = workbook.add_worksheet()
worksheet1.write("A1", "hello1")
worksheet2.write("A1", "hello2")
workbook.close()
response = HttpResponse(content_type='application/ms-excel')
response['Content-disposition'] = "attachment; filename=%s" % xls_name
return response
这是文件系统上的文件:
-rw-r--r-- 1 _www wheel 5751 Oct 24 09:14 /tmp/admin_wafer_viz_151024_090900.xlsx
这是下载的文件:
-rw-------@ 1 LarryMartell staff 0 Oct 24 09:14 admin_wafer_viz_151024_090900.xlsx
谁能看出我在这里做错了什么可能很愚蠢的简单事情?
您需要将工作簿保存到响应中才能将实际文件放入 HTTP 响应中:
def download_xls(self, request):
os.chdir('/tmp')
xls_name = re.sub('\s+', '_', "%s_%s_%s.xlsx" % (
request.user.username.lower(),
self.report.name.lower(),
datetime.now().strftime('%y%m%d_%H%I%S')))
output = io.BytesIO()
workbook = Workbook(output, {'in_memory': True})
worksheet1 = workbook.add_worksheet()
worksheet2 = workbook.add_worksheet()
worksheet1.write("A1", "hello1")
worksheet2.write("A1", "hello2")
workbook.close()
output.seek(0)
response = HttpResponse(content_type='application/ms-excel')
response['Content-disposition'] = "attachment; filename=%s" % xls_name
return response
你也可以尝试 xlwt 包,它看起来更简单:
workbook.save(response)
response = HttpResponse(content_type='application/ms-excel')
response['Content-Disposition'] = "attachment; filename=%s" % xls_name
你可以在我的一个项目中看到一个例子here