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

开发,爽就完事

相关推荐
七夜zippoe4 小时前
DolphinDB 高可用部署实战:从容灾设计到故障自动转移
开发语言·python·高可用·容灾·dolphindb
l1258654 小时前
# LangGraph Deep Research Agent 全流程设计:多轮研究、人机协同与真实来源管理
数据库·人工智能·python·算法·自然语言处理·oracle·langchain
码事漫谈4 小时前
项目探测:把老项目的知识变成 AI 的外部记忆
后端
PragmaticWorks4 小时前
从"遍地 try-catch"到分层治理:用 pragmatic-ddd 的异常体系治好代码洁癖
后端·领域驱动设计
青少儿编程课堂5 小时前
图形化编程实战:智能交通灯调度台,一个作品讲透循环、条件与广播
c++·python·算法·bfs·信息学竞赛
苍何5 小时前
我的开源项目登顶 GitHub 趋势榜 No1 了!
后端
HAPPY酷5 小时前
python的对象和方法
开发语言·python
苍何5 小时前
原来 Agent 量大管饱,真不是吹的
后端
the局外人5 小时前
别再背 Chain、Agent、Memory 了:用一条“智能流水线”学会 LangChain
python·langchain·llm
MetaLite5 小时前
SpringBoot分页接口怎么设计-pageSize不设上限会发生什么
java·spring boot·后端