个人使用django的ORM模型创建了相关业务数据的数据库,然后利用其简洁的方法来产生报表。那么访问django相关页面,获取到用户的POST请求后,从数据库中读取相对应的数据,然后可以利用xlwt或者一些图形模块在本地生成一个类似报告的文件。
那么如何在django上实现,提交数据之后,自动下载这些生成的报告文件?
个人使用django的ORM模型创建了相关业务数据的数据库,然后利用其简洁的方法来产生报表。那么访问django相关页面,获取到用户的POST请求后,从数据库中读取相对应的数据,然后可以利用xlwt或者一些图形模块在本地生成一个类似报告的文件。
那么如何在django上实现,提交数据之后,自动下载这些生成的报告文件?
post到后台后,首先读取数据库数据,然后按你说的生成报告文件,然后拼一个该文件所在的路径。接下来看下面的代码,就是一段下载用的,前面让文件流传输到服务器,后面是让文件流写入硬盘。(filename是你的文件名,downpath是你拼的文件路径),就酱!!
def file_iterator(file_name, chunk_size=512):
with open(file_name) as f:
while True:
c = f.read(chunk_size)
if c:
yield c
else:
break
response = StreamingHttpResponse(file_iterator(download_path))
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="{0}"'.format(file_name)
return response
大概说下我自己的实现方式,首先是获取相关数据之后生成报表文件,然后读取该文件并返回给客户端,代码如下:
def download_file(file_name, root_dir=settings.TMP_PATH):
"""
下载文件
:param file_name: 文件名
:param root_dir: 文件路径
:return:
"""
from rexec import FileWrapper
file_name = file_name.replace("\\", os.path.sep).replace("/", os.path.sep)
file_str = os.path.sep.join([root_dir, file_name])
if os.path.isfile(os.path.normpath(file_str)):
file_name = os.path.basename(file_str).encode("utf-8")
wrapper = FileWrapper(open(file_str, "rb"))
response = HttpResponse(wrapper, content_type='application/octet-stream')
response['Content-Length'] = os.path.getsize(file_str)
disposition = 'attachment; filename=%s' % file_name
response['Content-Disposition'] = disposition
return response
else:
raise Http404
class TestViewSet(View):
def post(self, request, *args, **kwargs):
'''
处理用户提交的POST方法
'''
# 获取DB中相关数据
# 根据DB中获取的相关数据生成报表文件
# 这里假设生成的报表文件名为 'repo.xlsx',生成报表文件的路径在项目里面的tmp目录下,并且在settings.py里面配置了TMP_PATH = os.path.join(BASE_DIR, 'tmp')
file_name = u'repo.xlsx'
rsp = download_file(file_name)
return rsp
方式多种多样
1, 如果你采用的是ajax请求, 可以返回静态文件名字a.xlsx, 把你的报表存放入/static/../ , 前端页面就直接window.open('/static/../a.xlsx) ,就可以进行下载
2, 返回文件流:
from django.http import StreamingHttpResponse
def big_file_download(request):
def file_iterator(file_name, chunk_size=512):
with open(file_name) as f:
while True:
c = f.read(chunk_size)
if c:
yield c
else:
break
the_file_name = "file_name.txt"
response = StreamingHttpResponse(file_iterator(the_file_name))
return response
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
2 回答1.9k 阅读✓ 已解决
http://blog.csdn.net/qq_18863...
这个你可以参考下,这是生成excel文件并传输的代码。只要把POST动作,关联到这段代码,然后就可以实现在post之后,浏览器自动弹出下载提示咯。