前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >flask导出Excel报表详解

flask导出Excel报表详解

原创
作者头像
热心的程序员
修改2020-04-07 12:19:23
2.4K1
修改2020-04-07 12:19:23
举报
文章被收录于专栏:编程之路编程之路

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、后台接口编写
  • 2、编写前台页面
  • 总结:
相关产品与服务
腾讯云 BI
腾讯云 BI(Business Intelligence,BI)提供从数据源接入、数据建模到数据可视化分析全流程的BI能力,帮助经营者快速获取决策数据依据。系统采用敏捷自助式设计,使用者仅需通过简单拖拽即可完成原本复杂的报表开发过程,并支持报表的分享、推送等企业协作场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档