xlsx报表纯标准库离线导出法
适用场景
系统需要把台账 / 流水导出为真正的 .xlsx 文件,且零第三方依赖(纯标准库 zipfile + XML),单元格用内联字符串杜绝公式注入时触发。模块 xlsx.py + app._download + 导出路由。
操作步骤
- 零依赖生成:
xlsx.py(L1–2)纯zipfile+ XML 手写 OOXML:[Content_Types].xml/_rels/.rels/xl/workbook.xml/xl/_rels/workbook.xml.rels/xl/worksheets/sheet1.xml(L60–65)。 - 内联字符串防注入:
_cell()(L32)对字符串走t="inlineStr"(L38),不使用<f>公式字段,内容经xml.sax.saxutils.escape转义(L5),从根本上消除导出注入。 - 数值原生:
int/float直接写<v>(L37),bool/None转空或 0/1(L34–35)。 - 附件下载:
app._download(data, filename, ctype)(L633)以Content-Disposition: attachment; filename*=UTF-8''<quote>输出,支持中文文件名;xlsx 用application/vnd.openxmlformats-officedocument.spreadsheetml.sheet(L38 常量)。 - 调用点:财务流水
/txn/export(L714–715、L1476–1482)、台账act=='export'(L986–990)均经xlsx.build(heads, rows, sheet=...)→_download。
注意边界
- 仅支持单表、内联字符串,足够导出台账 / 流水;多 sheet / 公式不在范围内(刻意不引第三方)。
- 字符串必须 escape,否则特殊字符(
<、&)会破坏 XML 使文件打不开。 - 文件名用
urllib.parse.quote+filename*=UTF-8''编码,避免中文乱码。
反例避雷
- 用
<f>公式写单元格 → 导出即注入点(用户可构造恶意公式);一律inlineStr。 - 不 escape 直接拼 XML → 含
<的备注让 xlsx 损坏;必须走escape。 - 引 openpyxl 等第三方 → 违反纯标准库零依赖铁律;手写 OOXML 即可。
关联笔记
- [[技能|纯标准库本地Web系统搭建法]]
- [[技能|财务模块闭环开发法]]
实战战绩
2026-09-29 落地:台账 / 流水导出真正 .xlsx,纯标准库、内联字符串无公式注入;中文文件名正确;导出后经 Excel / WPS 打开无误。
版本记录
| 版本 | 日期 | 变更 |
|---|---|---|
| v1.0.0 | 2026-10-03 | 据 xlsx.py build/_cell 与 app._download/导出路由固化 |