作为码农最不会陌生的就是数据导出,最常见的就是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 quote
def 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.3
as_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的感觉,但是不是容器!!!
开发,爽就完事