Weekly Report Builder(日报汇总成周报)
Overview
把一周的日报内容按「事项」合并同类项后,填入周报模板的原始版式,产出一份新的 xlsx 周报。
避免每周手工复制粘贴、避免丢失模板的合并单元格 / 字体 / 边框 / 打印设置。
自带模板
templates/ 下自带一套可直接使用的空白模板(个人信息栏已留空):
| 文件 | 用途 |
|---|---|
templates/weekly-report-template.xlsx |
周报模板,build_weekly.py 的输出底版 |
templates/daily-report-template.xlsx |
日报模板,extract_dailies.py 读取的输入格式 |
两者版式相同:标题行 + 姓名/部门/岗位/日期表头 + 「一、工作小结」(4 行)+「二、感悟心得」(3 行)。
没有自己的模板时直接用这两个;用户已有自己的模板(版式相近)时优先用用户的,脚本会自动适配。
When to Use
- 触发场景:用户说「汇总日报写周报」「生成周报」「按日报做周报」「本周/上周周报」「把这周的日报汇成周报」
- 适用结构:工作区下有三个目录
模板/(含周报模板 xlsx)、日报/(每日一份 xlsx)、周报/(产出目录) - 日报与周报使用同一套表单型版式(见表头 / 区块标题 / 项次 + 事项 + 描述三列)
- 没有现成工作区时,用
templates/里的自带模板建一套 - 不适用:用户要的是日报本身;或要生成 Word / PPT 周报
关键事实
这类日报 / 周报是表单/打印型版式,不是数据表,典型结构:
B1标题(合并 B1:I1)、B2:I2表头(姓名 / 部门 / 岗位 / 日期)- 段落标题行形如「一、xx工作小结:」「二、实习感悟/心得:」
- 每个区块:表头行含「项次 / 工作事项 / 完成情况描述」,其下是若干预留的编号行(B 列为 1、2、3…)
- 描述列通常与右侧若干列合并(如
D{r}:I{r}),合并后约可容纳 40 余个汉字/行 - 模板自带预留的项次数字,未使用的行要清掉 B 列数字(用户自己的日报就是这么做的)
- 第三节标题若模板原文写的是「本日」,输出周报时改为「本周」
做法要点:不要从零画表。直接载入模板文件再填值,版式才能 100% 继承。
步骤
Step 1 · 确认参数
先确认三件事,缺什么问什么:
- 工作区根目录(含
模板/日报/周报子目录);用户没有自己的模板 → 用templates/自带的 - 目标周次(起止日期,如 9.21-9.25)
- 合并口径:按事项合并同类项(默认),还是逐日罗列
另外从日报表头读 姓名 / 部门 / 岗位(extract_dailies.py 的输出里已带 name/dept/job),
写进周报的表头行,避免周报缺个人信息。
从 日报/ 目录列文件名反查该周实际存在哪几天的日报(周末 / 缺勤日通常没有)。
Step 2 · 抽取日报内容
python3 scripts/extract_dailies.py \
--dir "<工作区>/日报" --start 9.21 --end 9.25
输出 JSON:每天的小结 / 心得条目 + 姓名部门岗位元信息。--start/--end 用 月.日 格式。
脚本会读日报表内的 I2 日期单元格兜底,文件名不含日期也能识别。
Step 3 · 按事项合并同类项(需要判断,脚本不做)
把一周的条目按事项主题归并:同类工序(如各类缝制、各类物料整理)合成一条,
写成「本周…」的整体完成情况,保留关键细节(款式、数量、工艺要点),不要简单拼接。
心得区同理归并。合并后条目数不得超过模板预留行数(常见为小结 4 条、心得 3 条)。
不要凭空编造日报里没有的工作或感悟;合并后条目不足就留空行。
Step 4 · 写 JSON 并生成周报
写 <work_dir>/merged.json:
{
"title": "实习期工作周报(9月21日 - 9月25日)",
"name": "张三",
"dept": "产品部",
"job": "工程师",
"date_range": "2026.9.21-2026.9.25",
"min_heights": {"5": 97, "6": 99},
"summary": [{"item": "事项名", "desc": "本周整体完成情况…"}],
"insight": [{"item": "事项名", "desc": "感悟…"}]
}
python3 scripts/build_weekly.py \
--data "<work_dir>/merged.json" \
--template "<工作区>/模板/工作周报模板.xlsx" \
--out "<工作区>/周报/某某9.21-9.25工作周报.xlsx"
没有自有模板时,--template 指向 templates/weekly-report-template.xlsx。
name/dept/job/date_range可选:按标签自动写进表头行对应单元格sheet_name可选:指定输出页签名(用户自带模板的页签常是「日报」,用这个改成「周报」)min_heights可选:按行号抬高指定行的最小行高(模板某些预留行可能偏紧)build_weekly.py会自动探测模板中的区块位置与描述列合并宽度,脚本本身不含任何路径硬编码
Step 5 · 校验
- 确认合并单元格数量与模板一致、列宽未变
- 确认无
#REF!之类的公式错误(此类表单通常不含公式,也就无需重算) - 用 host 的预览能力展示产出,并在回复中复述归并后的条目
示例
示例 1:典型请求
用户说:「把这周的日报汇总成周报,模板用模板文件夹里的周报模板」
执行:
1. 确认工作区 / 周次 → 9.21-9.25;日报/ 下有 9.21、9.22、9.23 三天
2. Step 2 抽取 → 得到 7 条小结、3 条心得
3. Step 3 归并 → 小结合并为 4 条(缝制工艺 / 物料清点装箱 / 半成品处理 / 培训学习),心得 2 条
4. Step 4 生成 某某9.21-9.25工作周报.xlsx
5. 预览展示
结果:周报版式与模板完全一致,内容为周维度表述。
示例 2:边界情况
- 本周日报未齐(比如只到周三)→ 照常生成,标题仍写整周日期,回复中提示「本周尚未结束,可补完后续日报后重跑覆盖」
- 目标周报文件已存在 → 先问是否覆盖;脚本需显式加
--overwrite才会覆盖 - 日报文件名不含日期 → 脚本读表内日期单元格兜底
- 模板区块行数不同 →
build_weekly.py/extract_dailies.py均自动探测,无需改代码 - 用户没有任何模板或日报工作区 → 用
templates/里的两个自带模板,按「模板 / 日报 / 周报」建一套目录,先让用户按日报模板每日填写,再走本流程