在日常开发中,导出数据报表可谓必备技能,在后台管理中,很多模块都需要数据报表,现在我们一起来学习一下 flask 如何导出数据报表。
没有实例的讲解很不容易理解,本文我们依然从实际项目来讲解,对 “flask mysql微信小程序开源项目” 进一步扩展 ,教大家以项目为驱动来学习软件开发技术 。
1、后台接口编写
flask 可以使用 xlwt 扩展插件来完成对 Excel 的操作,若你的虚拟环境中没有安装 xlwt ,执行下面命令进行安装
代码语言:txt复制pip install xlwt
安装成功后,在 controller/api/api.py 头部引入 xlwt
代码语言:txt复制import xlwt as xlwt
创建导出 Excel 数据报表的接口路由
代码语言:txt复制# 导出数据
@api.route('exportData', methods=['POST'])
def exportData():
wb = xlwt.Workbook()
ws = wb.add_sheet('报修数据报表')
first_col = ws.col(0) # xlwt中是行和列都是从0开始计算的
second_col = ws.col(1)
third_col = ws.col(2)
four_col = ws.col(3)
five_col = ws.col(4)
first_col.width = 128 * 20
second_col.width = 230 * 20
third_col.width = 230 * 20
four_col.width = 128 * 20
five_col.width = 230 * 20
ws.write(0, 0, "报修人")
ws.write(0, 1, "联系电话")
ws.write(0, 2, "报修地点")
ws.write(0, 3, "报修描述")
ws.write(0, 4, "报修备注")
ws.write(0, 5, "报修时间")
dataw = RepairServiceSheet.query.order_by(RepairServiceSheet.id.desc()).all()
if dataw is not None:
for i in range(0, len(dataw)):
pet = dataw[i]
repairDate = ''
if pet.repairDate is not None:
repairDate = pet.repairDate.strftime('%Y-%m-%d %Z %H:%M:%S')
ws.write(i 1, 0, pet.applicantName)
ws.write(i 1, 1, pet.mobile)
ws.write(i 1, 2, pet.address)
ws.write(i 1, 3, pet.description)
ws.write(i 1, 4, pet.remarks)
ws.write(i 1, 5, repairDate)
now = str(time.time())
path = "/static/excel/"
fileName = "repair_" now ".xls"
file_path = basedir path
if not os.path.exists(file_path):
os.makedirs(file_path)
file_path = file_path fileName
try:
f = open(file_path, 'r')
f.close()
except IOError:
f = open(file_path, 'w')
wb.save(file_path)
return path fileName
代码详解:
1)使用创建 xlwt 创建 Workbook,并添加一个 sheet 页
代码语言:txt复制 wb = xlwt.Workbook() # 创建一个workbook
ws = wb.add_sheet('报修数据报表') #添加一个excel sheet页
2) 获取 excel 的列,行列均是从0开始,这里我们导出的Excel,只有 5 列,因此获取 excel 中的 5 列对象。
代码语言:txt复制 first_col = ws.col(0) # xlwt中是行和列都是从0开始计算的
second_col = ws.col(1)
third_col = ws.col(2)
four_col = ws.col(3)
five_col = ws.col(4)
six_col = ws.col(6)
3)对每列设置不同的宽度 ,可以不设置即使用默认宽度,也可对不同列设置不同的宽度。
代码语言:txt复制 first_col.width = 128 * 20
second_col.width = 230 * 20
third_col.width = 230 * 20
four_col.width = 128 * 20
five_col.width = 230 * 20
six_col.width=230 * 20
4) 写入表头 ,即Excel的第一行标题行
写入标题行使用 ws.write() 方法,第一个参数表示第1行,第二个参数表示第几列,第三个参数表示第几行第几列显示的文本内容。
代码语言:txt复制 ws.write(0, 0, "报修人")
ws.write(0, 1, "联系电话")
ws.write(0, 2, "报修地点")
ws.write(0, 3, "报修描述")
ws.write(0, 4, "报修备注")
ws.write(0, 5, "报修时间")
5)从数据库中查询出报修记录,遍历集合并从第二行开始设置单元格显示的内容,遍历写入单元格依然使用 ws.write() 方法。
代码语言:txt复制 dataw = RepairServiceSheet.query.order_by(RepairServiceSheet.id.desc()).all()
if dataw is not None:
for i in range(0, len(dataw)):
pet = dataw[i]
repairDate = ''
if pet.repairDate is not None:
repairDate = pet.repairDate.strftime('%Y-%m-%d %Z %H:%M:%S')
ws.write(i 1, 0, pet.applicantName)
ws.write(i 1, 1, pet.mobile)
ws.write(i 1, 2, pet.address)
ws.write(i 1, 3, pet.description)
ws.write(i 1, 4, pet.remarks)
ws.write(i 1, 5, repairDate)
6)定义 Excel 文件名、文件保存路径、若目录不存在则创建
代码语言:txt复制 now = str(time.time()) # 获取当前时间,作为文件名后缀
path = "/static/excel/" # 保存 Excel 的相对路径
fileName = "repair_" now ".xls" # Excel 文件名
file_path = basedir path # 保存 Excel 的绝对路径
if not os.path.exists(file_path): # 判断目录是否存在
os.makedirs(file_path) # 目录不存在则创建
file_path = file_path fileName # 需要保存的文件
7) 使用 open() 打开文件,注意 open() 使用后必须记得 close() ,使用 wb.save(file_path) 将 sheet 数据写入文件。return path fileName 返回文件地址给前台供前台下载 Excel 使用。
代码语言:txt复制 try:
f = open(file_path, 'r')
f.close()
except IOError:
f = open(file_path, 'w')
f.close()
wb.save(file_path)
return path fileName
2、编写前台页面
1)在 listView.html 中增加一个按钮 button, 如下:
代码语言:txt复制<div class="content">
<button class="layui-btn layui-btn-warm" onclick="exportData()">导出报表</button>
<fieldset class="layui-elem-field layui-field-title">
<legend>报修管理</legend>
</fieldset>
...
</div>
2)在 javascript 中增加 js 函数,如下:
代码语言:txt复制 function exportData() {
$.ajax({
cache: true,
type: "POST",
url: "/api/exportData",
async: false,
error: function (request) {
return false;
},
success: function (result) {
console.log(result);
window.location.href = result;
},
complete: function () {
},
error: function (data) {
layer.msg('导出失败,请重试!', {icon: 5});
}
});
其中 window.location.href = result; 即直接连接到文件地址,浏览器会自动下载。
总结:
导出Excel 数据报表是后端开发人员必会技能 ,在本文中我们对报修小程序源码进行拓展,导出数据报表也是报修小程序必备的功能。你应该学会如何编写导出 Excel 数据报表的功能,同时动手将你的源码扩展,加入导出 Excel 数据报表的功能 ,自己动手、丰衣足食~!
开源报修小程序源码介绍地址:
开源 flask mysql 校园报修微信小程序系统