图片表格 → Excel 表格
这个技能解决什么
用户手里只有一张表格的截图或照片(App 里的账单、学校发的成绩单、店里的价目表、发票明细、纸质库存表、课程表、报销单……),想变成能在 Excel 里排序、求和、筛选的电子表格。
分工:
- 看图抄字由你(模型)来做:按下面的「照抄规则」逐行抄成文字。
- 规整和自检交给脚本:
scripts/normalize.py把你抄的粗糙文字对齐成列,数字列变成真数值、日期统一写法,输出 xlsx 和 CSV 两份,并核对合计、列出看不清和对不上的格子。
和「A股成交截图转表格」的分工:炒股的成交记录、交割单用那个技能(它会核对成交价乘股数、补股票代码前导 0、接着做复盘);其他所有表格用这个。
第一步:先提醒隐私(每次收截图前说一句)
> 截图或拍照前,请先把身份证号、银行卡号、手机号这些遮掉或裁掉。截图我只用来抄内容,不会保存;整理出来的表格只存在你自己电脑上。
用户已经发来带这些号码的图:照常整理,跑完脚本后按「隐私提醒」告诉他哪一列有疑似号码,问他要删掉这一列还是遮住中间几位(遮住就重跑时加 --mask)。
第二步:逐行照抄(最重要)
把截图当成一张表,原表一行抄一行,格子之间用制表符隔开(逗号、竖线 |、两个以上空格也行,脚本都认)。
- 不补、不猜、不算。 看不清的格子写
?,哪怕只是一位看不清也写成1?8.00这样;抄完把这些格子列出来问用户。截图上没有的列不要自己加,不要用单价乘数量去算金额,也不要替原表算合计。 - 表头照抄。 第一行写表头,用截图上的原列名,一个字不改(「实发金额(元)」就写「实发金额(元)」)。截图上没有表头,就问用户每列叫什么;问不到就用
--no-header,列名暂叫「列1、列2……」。多层表头(上面一行「上半年」、下面一行「1月 2月」)合成一行写:上半年-1月。 - 合并单元格展开。 一个格子跨了好几行(例如「部门:销售」竖着合并了 3 行),就把这个值抄到每一行上;跨了好几列的标题行不算数据,不抄。原表里写着「同上」「〃」的格子照抄,脚本会按原意填成上一行的值。
- 数字和金额原样抄。 小数位、千分位、¥、元、% 都照截图写(
¥1,280.00、95.5%原样抄就行,脚本会处理),不四舍五入、不换算单位。负数照原样写(-12.00或(12.00))。 - 编号照抄每一位。 学号、工号、单号、电话前面的 0 一个都不能丢(
00123)。 - 空格子留空,两个分隔符之间什么都不写;原表里写的是「-」「/」「无」就照抄。
- 合计、小计、总计行照抄,放在原来的位置。脚本会用它核对上面各行加起来对不对。
- 多张截图:每张图开头写一行
--- 图2 ---,表头再抄一遍(没有也行);两张图重叠的部分照抄,脚本会去掉重复行。同一张图里两行一模一样的,脚本不删、只提醒。 - 照片歪了、反光、被手指挡住:能看清的照抄,挡住的写
?;大片看不清就请用户重拍一张,不要硬猜。 - 日期照截图写(
9/3、2026年9月3日、20260903都行)。只有月日没有年份时,问一句是哪一年,跑脚本时加--year。
抄完自己先对一遍行数:截图上几行,抄出来就该几行。
第三步:跑脚本规整、自检
把抄好的文字存成文本文件(例如 抄录.txt),然后:
python {baseDir}/scripts/normalize.py --in 抄录.txt --out 整理结果.xlsx
会同时生成 整理结果.xlsx 和 整理结果.csv。常用选项:
--in 图1.txt 图2.txt:多张截图分开存的,一起传,按顺序拼成一张表、去掉重叠行。--in 整理结果.xlsx 新抄的.txt:往上次整理好的表里续上新截图(也可以传上次的 CSV)。表头顺序不同也没关系,按列名对齐。--year 2026:日期只有月日时按哪一年算(不写就按今年)。--mask:把疑似身份证号、银行卡号、手机号遮成前 3 位加后 4 位。--no-header:第一行就是数据,没有表头。--keep-dup:用户说重叠的那几行确实是不同的记录,不要去重。- 用户想先看看效果:
python {baseDir}/scripts/normalize.py --in {baseDir}/assets/sample_transcript.txt --out 样例.xlsx(样例里故意放了一格看不清的金额、两张图的重叠行和手机号)。
没装 Excel 组件(脚本提示只出了 CSV):告诉用户 CSV 用 Excel 也能直接打开、中文不乱码;想要 xlsx 就在命令行运行 pip install openpyxl,装好再跑一次。
脚本退出码:0 全部通过;3 表格已写出,但有地方要用户确认;2 出错(stderr 两行「出错了:…」「下一步:…」,原样转告用户)。
第四步:把结果讲给用户
按脚本输出,用大白话说:
- 表格存在哪(xlsx 和 CSV 两份),共几行几列,哪些列已经变成数字、哪些是日期。
- 合计核对:一致的说一句「合计对得上」;对不上的,把脚本那句「写的是多少,上面几行加起来是多少,差多少」转告用户,请他对着原图看是哪一行抄错还是原表本身算错。不要自己改数字去凑合计。
- 看不清的格子:逐个问,拿到答案后改抄录文件重跑。
- 格子数对不上的行:多半是某个空格子没留出位置,或者一个格子里有空格被拆开了;对着原图改好重跑。
- 隐私提醒:有疑似身份证号、银行卡号、手机号的列,问用户删掉还是遮住。
- 提示:没写年份按哪年算的、哪些编号列保持成文字、同一张图里的重复行、「同上」填了几格——逐条让用户确认。
退出码是 3 时,告诉用户表格已经能打开看,但标黄(看不清)、标红(对不上)的格子要先确认;xlsx 里另有一页「待确认」列着全部问题。
用户说大白话 → 你怎么做
| 用户这么说 | 你怎么做 |
|---|---|
| 「把这张水电费账单转成 Excel」(附 1 张截图) | 先说隐私提醒;照抄成文本(表头、每一行、合计行);跑 normalize.py --in 抄录.txt --out 水电费.xlsx;按第四步讲结果 |
| 「孩子的成绩单拍了照,帮我做成表,好算平均分」 | 照抄姓名、各科分数,看不清的分数写 ? 问家长;跑脚本得到数字列;平均分可以告诉他在 Excel 里用「平均值」按钮算,或者你按表里的数算给他看,但不写回原表、不改原始分数 |
| 「这三张是同一份价目表,截了三屏」 | 三张图按顺序抄进一个文件,每张开头写 --- 图2 ---、--- 图3 ---;重叠的行照抄,脚本会去重;跑完告诉他去掉了几行重复 |
| 「发票明细,帮我核一下金额对不对」 | 照抄每行和「合计」行;脚本核对加总;对得上就说对得上,对不上就说差多少、请他对照原票,不替他判断发票真假、不算税 |
| 「上周整理的库存表,今天又盘了一页,接上去」 | normalize.py --in 库存表.xlsx 今天抄录.txt --out 库存表.xlsx;列名对得上就按列名拼,重叠的行自动去掉 |
| 「公司通讯录截图转成表格」 | 先提醒手机号属于别人的个人信息,只在工作需要范围内用;照抄后跑脚本,隐私提醒里会列出手机号列,问他要不要遮住中间几位(--mask) |
| 「这张课程表有合并的格子,一节课占了两行」 | 合并格展开:同一门课抄到它占的每一行上;节次写成原样(1-2节),不会被当成日期 |
| 「报销单拍歪了,右下角被挡住了」 | 能看清的照抄,挡住的格子写 ?;跑完把看不清的格子列给用户,请他补拍或口头告诉你 |
| 「第 3 行那个金额是 128,刚才糊了」 | 把抄录里那一格的 1?8 改成 128,重跑,确认合计核对通过 |
| 「合计对不上没关系,原表就是这么写的」 | 照原表保留,不改数;在交付时注明「原表合计与明细加总差多少,已按原表保留」 |
| 「这是我的股票交割单截图」 | 改用「A股成交截图转表格」,它会按成交记录的规矩核对价格、股数和金额 |
不做什么
- 不补数、不猜数:看不清就问;缺的列空着;不用单价乘数量去算金额,不替原表算合计、平均分、税额。
- 不改原表的数字去凑合计;合计对不上只报告差额,由用户决定。
- 不判断发票、单据真伪,不做记账、报税、审计结论。
- 不保存截图,不联网,不把表格发到任何地方;表格只写在用户自己电脑上。
- 不主动收集身份证号、银行卡号、手机号;表里出现时提醒删除或遮住。
- 不处理炒股成交记录(用「A股成交截图转表格」)。
- 不做手写体的大段文字识别、不做图表(柱状图、折线图)读数:只整理表格。
参考
assets/sample_transcript.txt:照抄格式样例(两张图、一格看不清、一处重叠行、手机号列、合计行)。