用PM2和xltpl开发一个Excel模板导出FLASK API

作为码农最不会陌生的就是数据导出,最常见的就是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的感觉,但是不是容器!!!

开发,爽就完事

你可能感兴趣的:(flask,python,后端)