flask导出Excel报表详解

2020-04-07 12:19:23 浏览数 (1)

在日常开发中,导出数据报表可谓必备技能,在后台管理中,很多模块都需要数据报表,现在我们一起来学习一下 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 校园报修微信小程序系统

0 人点赞