之前在做项目管理系统的时候需要实现将数据导出到excel表的功能,搜索之后发现了python的xlwt模块可以很好的实现这项功能。
首先是导入xlwt模块:
import xlwt
from io import BytesIO
将处理好的数据写入excel并且传给前端
# 获取当前时间 nowtime = datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S') # 创建一个workbook,设置编码格式为utf8 workbook = xlwt.Workbook(encoding='utf-8') # 创建一个 worksheet worksheet = workbook.add_sheet('Worksheet') # 将处理好的数据写入excel,其中i为行,j为列 for i in range(len(msg_list)): for j in range(len(msg_list[i])): worksheet.write(i, j, msg_list[i][j]) # 创建操作二进制数据的对象 output = BytesIO() # 将excel数据写入到内存中 workbook.save(output) # 设置文件读取的偏移量,0表示从头读起 output.seek(0) # 设置HTTP的报头为二进制流 self.set_header("Content-Type", "application/octet-stream") # 设置文件名 self.set_header("Content-Disposition", "attachment; filename=export-%s.xls" % nowtime) return self.write(output.getvalue())
在前端我发现如果是通过a标签的href来请求对应的API接口,可以直接下载到excel文件,但是如果希望在发送请求时携带一些数据,则需要发送ajax请求,代码如下:
$("#export-from").submit(function(e){ e.preventDefault(); var data = {}; $(this).serializeArray().map(function(x){ data[x.name] = x.value; }); if (data["start_time"] && data["end_time"]){ var url= ("api/export/results?start_time="+data["start_time"]+"&end_time="+data["end_time"]); var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); // 返回blob类型,该类型用来存储二进制数据 xhr.responseType = "blob"; xhr.onload = function () { // 请求完成,执行回调函数 if (this.status === 200) { // 状态码为200 var blob = this.response; var reader = new FileReader(); // 转换为base64 reader.readAsDataURL(blob); reader.onload = function (e) { // 转换完成,创建一个a标签用于下载 var a = document.createElement('a'); a.download = 'results.xls'; a.href = e.target.result; // 修复firefox中无法触发click $("body").append(a); a.click(); $(a).remove(); } } }; // 发送ajax请求 xhr.send() } });