当前位置:   article > 正文

flask导出Excel报表详解

flask导出excel

在日常开发中,导出数据报表可谓必备技能,在后台管理中,很多模块都需要数据报表,现在我们一起来学习一下 flask 如何导出数据报表。

没有实例的讲解很不容易理解,本文我们依然从实际项目来讲解,对 “flask+mysql微信小程序开源项目” 进一步扩展 ,教大家以项目为驱动来学习软件开发技术 。

1、后台接口编写

flask 可以使用 xlwt 扩展插件来完成对 Excel 的操作,若你的虚拟环境中没有安装 xlwt ,执行下面命令进行安装

pip install xlwt
  • 1

安装成功后,在 controller/api/api.py 头部引入 xlwt

import xlwt as xlwt
  • 1

创建导出 Excel 数据报表的接口路由

# 导出数据
@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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

代码详解:

1)使用创建 xlwt 创建 Workbook,并添加一个 sheet 页

    wb = xlwt.Workbook() # 创建一个workbook
    ws = wb.add_sheet('报修数据报表') #添加一个excel sheet页 
  • 1
  • 2

2) 获取 excel 的列,行列均是从0开始,这里我们导出的Excel,只有 5 列,因此获取 excel 中的 5 列对象。

    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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3)对每列设置不同的宽度 ,可以不设置即使用默认宽度,也可对不同列设置不同的宽度。

    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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4) 写入表头 ,即Excel的第一行标题行

在这里插入图片描述
写入标题行使用 ws.write() 方法,第一个参数表示第1行,第二个参数表示第几列,第三个参数表示第几行第几列显示的文本内容。

    ws.write(0, 0, "报修人")
    ws.write(0, 1, "联系电话")
    ws.write(0, 2, "报修地点")
    ws.write(0, 3, "报修描述")
    ws.write(0, 4, "报修备注")
    ws.write(0, 5, "报修时间")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

5)从数据库中查询出报修记录,遍历集合并从第二行开始设置单元格显示的内容,遍历写入单元格依然使用 ws.write() 方法。

  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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

6)定义 Excel 文件名、文件保存路径、若目录不存在则创建

    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 # 需要保存的文件
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

7) 使用 open() 打开文件,注意 open() 使用后必须记得 close() ,使用 wb.save(file_path) 将 sheet 数据写入文件。return path+fileName 返回文件地址给前台供前台下载 Excel 使用。

    try:
        f = open(file_path, 'r')
        f.close()
    except IOError:
        f = open(file_path, 'w')
        f.close()
    wb.save(file_path)
    return path+fileName
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
2、编写前台页面

1)在 listView.html 中增加一个按钮 button, 如下:

<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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2)在 javascript 中增加 js 函数,如下:

   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});
            }
        });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

其中 window.location.href = result; 即直接连接到文件地址,浏览器会自动下载。

总结:

导出Excel 数据报表是后端开发人员必会技能 ,在本文中我们对报修小程序源码进行拓展,导出数据报表也是报修小程序必备的功能。你应该学会如何编写导出 Excel 数据报表的功能,同时动手将你的源码扩展,加入导出 Excel 数据报表的功能 ,自己动手、丰衣足食~!


开源报修小程序源码介绍地址:

开源 flask + mysql 校园报修微信小程序系统

如果你遇见任何问题,可扫码关注我,与我交流!
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/464525
推荐阅读
相关标签
  

闽ICP备14008679号