用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的感觉,但是不是容器!!!

开发,爽就完事

相关推荐
子兮曰5 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰5 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
默_笙5 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
爱勇宝5 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
qq_426003965 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫5 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
胡写代码5 天前
别再前后端各写一套表单校验了
java·后端
长沙三为智能科技5 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读5 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
大勇前进5 天前
原生 PHP 还是 Laravel?小项目到底要不要上框架
后端