flask导出Excel报表详解

Posted JeenWang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flask导出Excel报表详解相关的知识,希望对你有一定的参考价值。

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

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

1、后台接口编写

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

 
   
   
 
  1. pip install xlwt

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

 
   
   
 
  1. import xlwt as xlwt

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

 
   
   
 
  1. # 导出数据

  2. @api.route('exportData', methods=['POST'])

  3. def exportData():

  4. wb = xlwt.Workbook()

  5. ws = wb.add_sheet('报修数据报表')

  6. first_col = ws.col(0) # xlwt中是行和列都是从0开始计算的

  7. second_col = ws.col(1)

  8. third_col = ws.col(2)

  9. four_col = ws.col(3)

  10. five_col = ws.col(4)

  11. first_col.width = 128 * 20

  12. second_col.width = 230 * 20

  13. third_col.width = 230 * 20

  14. four_col.width = 128 * 20

  15. five_col.width = 230 * 20

  16. ws.write(0, 0, "报修人")

  17. ws.write(0, 2, "报修地点")

  18. ws.write(0, 3, "报修描述")

  19. ws.write(0, 4, "报修备注")

  20. ws.write(0, 5, "报修时间")

  21. dataw = RepairServiceSheet.query.order_by(RepairServiceSheet.id.desc()).all()

  22. if dataw is not None:

  23. for i in range(0, len(dataw)):

  24. pet = dataw[i]

  25. repairDate = ''

  26. if pet.repairDate is not None:

  27. repairDate = pet.repairDate.strftime('%Y-%m-%d %Z %H:%M:%S')

  28. ws.write(i + 1, 0, pet.applicantName)

  29. ws.write(i + 1, 1, pet.mobile)

  30. ws.write(i + 1, 2, pet.address)

  31. ws.write(i + 1, 3, pet.description)

  32. ws.write(i + 1, 4, pet.remarks)

  33. ws.write(i + 1, 5, repairDate)

  34. now = str(time.time())

  35. path = "/static/excel/"

  36. fileName = "repair_" + now + ".xls"

  37. file_path = basedir + path

  38. if not os.path.exists(file_path):

  39. os.makedirs(file_path)

  40. file_path = file_path + fileName

  41. try:

  42. f = open(file_path, 'r')

  43. f.close()

  44. except IOError:

  45. f = open(file_path, 'w')

  46. wb.save(file_path)

  47. return path+fileName

代码详解:

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

 
   
   
 
  1. wb = xlwt.Workbook() # 创建一个workbook

  2. ws = wb.add_sheet('报修数据报表') #添加一个excel sheet页

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

 
   
   
 
  1. first_col = ws.col(0) # xlwt中是行和列都是从0开始计算的

  2. second_col = ws.col(1)

  3. third_col = ws.col(2)

  4. four_col = ws.col(3)

  5. five_col = ws.col(4)

  6. six_col = ws.col(6)

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

 
   
   
 
  1. first_col.width = 128 * 20

  2. second_col.width = 230 * 20

  3. third_col.width = 230 * 20

  4. four_col.width = 128 * 20

  5. five_col.width = 230 * 20

  6. six_col.width=230 * 20

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

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

 
   
   
 
  1. ws.write(0, 0, "报修人")

  2. ws.write(0, 2, "报修地点")

  3. ws.write(0, 3, "报修描述")

  4. ws.write(0, 4, "报修备注")

  5. ws.write(0, 5, "报修时间")

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

 
   
   
 
  1. dataw = RepairServiceSheet.query.order_by(RepairServiceSheet.id.desc()).all()

  2. if dataw is not None:

  3. for i in range(0, len(dataw)):

  4. pet = dataw[i]

  5. repairDate = ''

  6. if pet.repairDate is not None:

  7. repairDate = pet.repairDate.strftime('%Y-%m-%d %Z %H:%M:%S')

  8. ws.write(i + 1, 0, pet.applicantName)

  9. ws.write(i + 1, 1, pet.mobile)

  10. ws.write(i + 1, 2, pet.address)

  11. ws.write(i + 1, 3, pet.description)

  12. ws.write(i + 1, 4, pet.remarks)

  13. ws.write(i + 1, 5, repairDate)

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

 
   
   
 
  1. now = str(time.time()) # 获取当前时间,作为文件名后缀

  2. path = "/static/excel/" # 保存 Excel 的相对路径

  3. fileName = "repair_" + now + ".xls" # Excel 文件名

  4. file_path = basedir + path # 保存 Excel 的绝对路径

  5. if not os.path.exists(file_path): # 判断目录是否存在

  6. os.makedirs(file_path) # 目录不存在则创建

  7. file_path = file_path + fileName # 需要保存的文件

 
   
   
 
  1. try:

  2. f = open(file_path, 'r')

  3. f.close()

  4. except IOError:

  5. f = open(file_path, 'w')

  6. f.close()

  7. wb.save(file_path)

  8. return path+fileName

2、编写前台页面

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

 
   
   
 
  1. <div class="content">

  2. <button class="layui-btn layui-btn-warm" onclick="exportData()">导出报表</button>

  3. <fieldset class="layui-elem-field layui-field-title">

  4. <legend>报修管理</legend>

  5. </fieldset>

  6. ...

  7. </div>

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

 
   
   
 
  1. function exportData() {

  2. $.ajax({

  3. cache: true,

  4. type: "POST",

  5. url: "/api/exportData",

  6. async: false,

  7. error: function (request) {

  8. return false;

  9. },

  10. success: function (result) {

  11. console.log(result);

  12. window.location.href = result;

  13. },

  14. complete: function () {

  15. },

  16. error: function (data) {

  17. layer.msg('导出失败,请重试!', {icon: 5});

  18. }

  19. });

总结:

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


如果你遇见任何问题,可扫码关注我,与我交流!



以上是关于flask导出Excel报表详解的主要内容,如果未能解决你的问题,请参考以下文章

Silverlight程序之:简单的Excel报表导出方法

将Crystal报表导出到Excel - 指定目录

Java报表工具FineReport导出EXCEL的四种API

Java报表工具FineReport导出EXCEL的四种方式

Java报表工具FineReport导出EXCEL的四种API

Java报表工具FineReport导出EXCEL的四种API