用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 分钟前
Spring 事务失效的 8 大场景 + 原因 + 解决方案
java·后端·spring
我是若尘7 分钟前
我的需求代码被主干 revert 了,接下来我该怎么操作?
前端·后端·代码规范
dweizhao22 分钟前
这份AI报告,把美股干崩了
后端
YuanDaima204842 分钟前
[CrewAI] 第15课|构建一个多代理系统来实现自动化简历定制和面试准备
人工智能·python·面试·agent·crewai
WHS-_-20221 小时前
Python 算法题学习笔记一
python·学习·算法
码界筑梦坊1 小时前
353-基于Python的大湾区气候数据可视化分析系统
开发语言·python·信息可视化·数据分析·django·vue·毕业设计
JOEH601 小时前
Java 后端开发中的内存泄漏问题:90% 开发者都会踩的 5 个坑
后端
_野猪佩奇_牛马版1 小时前
多智能体协作 - 使用 LangGraph 子图实现
后端
JOEH601 小时前
为什么你的数据库连接总超时?99% 的 Java 程序员都踩过这 5 个坑
后端
后端不背锅2 小时前
对外接口设计完全指南:安全、高性能、可演进
后端