作为码农最不会陌生的就是数据导出,最常见的就是Excel和Word。一般来说没啥,用个Office相关组件,写写格式和数据绑定都ok了,但是就怕管理层各种标准格式模板,你也不知道为什么用电脑 Analysis 几分钟的事(pandas之类,甚至不用gpt4),非要搞一堆格式漂亮,文字秀美的文档。于是,我在python里找到快乐——xltpl和docxtpl,分别支持xlsx和word的模板生成文档。
介绍
最初是Eric Lapouyade发现一件事——docx采用xml的格式,于是用Jinja2的html模板来套用docx。在2015年发布了docxtpl,但是这个作者没有开发spreedsheet部分。 而Zhang Yu也在2020年以此思路开发了xltpl,补全了这部分的遗憾。(个人推理)
总体两个package的api风格很像,用起来都非常上手。
代码部分
python
from flask import send_file
from xltpl.writerx import BookWriter
from urllib.parse import quotedef fix_info_excel():# 连接模板writer = BookWriter('./xxx信息表.xlsx')ws_info_map = {"sheet_name": "xxxx提供表", # sheet页名"name": "姓名","age": 20,"gender": "男",}rows = [{"column1": "列1","column2": "列2","column3": "列3","column4": "列4","column5": "列5",},{"column1": "列21","column2": "列22","column3": "列23","column4": "列24","column5": "列25",},{"column1": "列31","column2": "列32","column3": "列33","column4": "列34","column5": "列35",}]book=[ws_info_map] // 可以配置多个sheet页,这里是数组writer.render_book(book)writer.save('xxxwww信息表.xlsx')# 处理文件名带中文filename = quote('xxxwww信息表.xlsx')rv = send_file('xxxwww信息表.xlsx', download_name=filename, # 这个参数名字已经改这个了 flask == 2.3.3as_attachment=True)rv.headers['Content-Disposition'] += "; filename*=utf-8''{}".format(filename)return rv
Excel
姓名:{{name}} 年龄:{{age}} 性别:{{gender}}
留白 | |||||
留白 | 头1 | 头2 | 头3 | 头4 | 头5 |
添加批注:beforerow{% for row in rows %} | {{row.column1}} | {{row.column2}} | {{row.column3}} | {{row.column4}} | {{row.column5}} |
添加批注:beforerow{% endfor %} |
javascript
axios({url: url,method: 'GET',responseType: 'blob',headers: {'Access-Control-Allow-Origin': '*',}
})
.then(response => {const href = window.URL.createObjectURL(response.data);const anchorElement = document.createElement('a');anchorElement.href = href;anchorElement.download = "xxxwww信息表.xlsx";document.body.appendChild(anchorElement);anchorElement.click();document.body.removeChild(anchorElement);window.URL.revokeObjectURL(href);
})
.catch(error => {console.log('error: ', error);
});
pm2.json
{"name": "flask_api","script": "D:\\webapi2\\app.py","interpreter": "D:\\webapi2\\venv\\Scripts\\python.exe","autorestart" : false
}
运行pm2 start pm2.json
就可以了,这个也支持windows起停服务。反正我是玩不转win32serviceutils
pm2不是python的开发工具,需要通过npm或yarn来安装的nodejs服务。但是这个工具很轻巧,给人一种docker的感觉,但是不是容器!!!
开发,爽就完事