Django导出数据为Excel,调用浏览器下载
程序员文章站
2022-03-25 22:58:23
1. 环境 Django (2.1.10) + Python3.6 + xlwt (1.3.0) 操作系统使用的为:Windows 7 2. 接口代码 提示:若出现 TypeError: string argument expected, got 'bytes' 错误。问题出现在使用StringIO ......
1. 环境
django (2.1.10) + python3.6 + xlwt (1.3.0)
操作系统使用的为:windows 7
2. 接口代码
def now_export(request): data_list = cip.objects.all() # 获取数据的查询集 if not data_list: return httpresponse(json.dumps({"state": "1", "msg": "查无数据,导出失败"}), content_type="application/json") ws = workbook(encoding='utf-8') # 设置excel为utf-8的编码格式 w = ws.add_sheet(u"正在清洗的cip报表") # 设置sheet名称 w.write(0, 0, "id") w.write(0, 1, u"清洗线路") w.write(0, 2, u"操作者") w.write(0, 3, u"清洗目标") w.write(0, 4, u"清洗类型") w.write(0, 5, u"cip状态") w.write(0, 6, u"开始时间") # 把需要导出的数据写到文件中 excel_row = 1 for obj in data_list: w.write(excel_row, 0, excel_row) w.write(excel_row, 1, obj.cipno) w.write(excel_row, 2, obj.oper) w.write(excel_row, 3, obj.ccid) w.write(excel_row, 4, obj.mode) w.write(excel_row, 5, "cip程序启动") w.write(excel_row, 6, datetime.strftime(obj.start_time, '%y-%m-%d %h:%m:%s')) excel_row += 1 sio = bytesio() # 写出到io ws.save(sio) sio.seek(0) # 重新定位到开始 response = httpresponse(sio.getvalue(), content_type='application/vnd.ms-excel') # 设置文件格式为excel # attachment(意味着消息体应该被下载到本地;大多数浏览器会呈现一个“保存为”的对话框,将filename的值预填为下载后的文件名) response['content-disposition'] = 'attachment; filename=test.xls' response.write(sio.getvalue()) return response
提示:若出现 typeerror: string argument expected, got 'bytes' 错误。问题出现在使用stringio的write方法上,用bytesio替代stringio即可解决问题,笔者这里已经替换过了
3. 前端请求
注意:但需要注意的是,如果想要用这种方式下载文件,不能使用ajax
的方式,而是应该新建一个<a>
标签,模拟点击下载。原因为处于安全性考虑,javascript
无法与磁盘进行交互,因此ajax得到的内容将被保留在内存中,而不是磁盘上。
3.1 请求方式为get时:
此时直接在a标签的href属性中指定路由即可
<a class="btn btn-success radius r" style="line-height:1.6em;margin-top:3px" title="导出报表" href="/cip/now_export/">导出报表</a>
3.2 请求方式为post时:
这种请求 需写一个form表单,把请求所需数据写在表单中,在a标签中指定表单的提交方法即可。(对于a标签实现post请求感兴趣的可以自行百度其他方法)
<a class="btn btn-success radius r" style="line-height:1.6em;margin-top:3px" title="导出报表" onclick="document.getelementbyid('form').submit();">
导出报表</a>
<form action="/cip/draft_export/" method="post" id="form" enctype="multipart/form-data">
<div class="row cl">
<div class="formcontrols col-xs-8 col-sm-9">
<label class="form-label col-xs-4 col-sm-2">开始日期:</label>
<input type="text" style="width: 200px" onfocus="wdatepicker({ datefmt:'yyyy-mm-dd',maxdate:'#f{$dp.$d(\'startdate\')||\'%y-%m-%d\'}'})"
id="startdate" class="input-text wdate" name="startdate">
</div>
<div class="formcontrols col-xs-8 col-sm-9" style="width: 400px">
<label class="form-label col-xs-4 col-sm-2">结束日期:</label>
<input type="text" style="width: 200px" onfocus="wdatepicker({ datefmt:'yyyy-mm-dd hh:mm:ss',mindate:'#f{$dp.$d(\'enddate\')}' })"
id="enddate" class="input-text wdate" name="enddate">
</div>
</div>
<br>
<div class="row cl">
<div class="formcontrols col-xs-8 col-sm-9">
<label class="form-label col-xs-4 col-sm-2">线路:</label>
<span class="select-box">
<select class="select" id="line" name="line">
<option>all</option>
</select>
</span>
</div>
<div class="formcontrols col-xs-8 col-sm-9">
<label class="form-label col-xs-4 col-sm-2">目标:</label>
<span class="select-box">
<select class="select" id="goal" name="goal">
<option>all</option>
</select>
</span>
</div>
<a name="" id="" class="btn btn-success" onclick="search_date(1)"><i class="hui-iconfont" ></i> 搜索</a>
</div>
</form>
上一篇: 自定义标签
下一篇: tomcat 内存溢出及中文乱码配置