feat: add docfill mvp cli

This commit is contained in:
赵义仑
2026-06-18 20:03:47 +08:00
commit ca444bd5d0
22 changed files with 2539 additions and 0 deletions

144
README.md Normal file
View File

@@ -0,0 +1,144 @@
# docfill
`docfill` 是一个最小化本地填报工具:从 Excel 或 SQLite 读取数据,把 `{{字段名}}` 填入 Word/Excel 模板,生成输出文件。
## Build
```bash
go build -o docfill ./cmd/docfill
bash scripts/build.sh
```
`scripts/build.sh` writes the local macOS arm64 binary to `dist/docfill-darwin-arm64`.
## Run
```bash
./docfill run --config task.json
./docfill run -c task.json --var date=2026-06-18 --var batch=早班
```
成功时 stdout 输出生成文件清单:
```text
generated 2 file(s)
- /path/to/out/report_张三.xlsx
- /path/to/out/report_李四.xlsx
```
退出码:
- `0`: 成功。
- `1`: 配置、数据、模板或输出失败。
- `2`: 命令行参数错误。
## Run Case Tests
```bash
go test -run TestCase -v ./internal/docfill
```
当前案例覆盖:
- Excel 日报数据填 Excel 模板,批量生成个人日报。
- SQLite 日报数据填 Word 模板,批量生成个人日报。
- SQLite 汇总数据填 Excel 模板,批量生成部门汇总表。
## Smoke Test
```bash
bash scripts/smoke.sh
```
Smoke test 会:
- 跑全量 Go 测试。
- 构建临时 `docfill` 二进制。
- 复制 `examples/` 到临时目录。
- 生成临时 Excel、Word、SQLite 示例数据。
- 执行两个示例任务并检查输出文件。
## Digital Employee Runbook
给数字员工或调度脚本使用时,看:
- `docs/digital-employee-runbook.md`
## Runnable Examples
示例配置在 `examples/`
- `examples/excel-to-word/task.json`
- `examples/sqlite-to-excel/task.json`
示例里的二进制 Office/SQLite 文件由 `scripts/smoke-fixtures` 临时生成,不提交到仓库。
## Excel Data Example
```json
{
"vars": {
"date": "2026-06-18"
},
"data": {
"type": "excel",
"path": "./data.xlsx",
"sheet": "Sheet1",
"header_row": 1
},
"template": {
"path": "./template.docx"
},
"output": {
"path": "./out/report_{{date}}_{{name}}_{{_row}}.docx",
"overwrite": false
}
}
```
Excel 第一行是字段名,后续每一行生成一个文件。
## SQLite Data Example
```json
{
"vars": {
"date": "2026-06-18"
},
"data": {
"type": "sqlite",
"path": "./data.db",
"query": "select name, date, done from daily_report where date = ?",
"params": ["{{date}}"]
},
"template": {
"path": "./template.xlsx"
},
"output": {
"path": "./out/report_{{name}}_{{_row}}.xlsx"
}
}
```
SQL 查询结果的列名就是模板占位符字段名。
## P0 Rules
- 配置里的相对路径按 `task.json` 所在目录解析。
- `vars` 可以提供默认变量,命令行 `--var key=value` 会覆盖同名默认变量。
- 模板填充时,每行数据字段优先于 `vars`
- `_row` 是内置变量,表示当前数据行序号,从 `1` 开始。
- SQLite `params` 对应 SQL 里的 `?` 参数。
- Excel `header_row``1` 开始,默认是 `1`
- 默认不覆盖已有输出文件;只有 `output.overwrite: true` 才允许覆盖。
- 输出文件路径中的字段值会清理 `/ \ : * ? " < > |`
- 模板里缺字段或渲染后仍有 `{{字段}}`,会直接失败。
- Word 模板支持同一段落内被拆开的文本占位符,例如 `{{na``me}}` 位于相邻文本节点。
## MVP Limits
- 只支持 JSON 配置。
- 只支持 `.xlsx` 数据源、SQLite 数据源。
- 只支持 `.docx``.xlsx` 模板。
- Word 占位符拆分只做最小兼容:支持同一段落内的文本节点拆分,不做复杂表格循环或样式级模板语法。
- 不做 Web、权限、审批流、模板设计器或业务系统直连。