ARTICLE · 1240429
月底报销,我把一堆发票照片变成了 Excel 表
月底报销,我把一堆发票照片变成了 Excel 表 · 报销
金额、日期、开票方、税号,自动排好
发票报销整理
今天带你从零到一做出一个小工具。不是讲概念,是做完你就能用。
咱们要做的是发票报销整理。你月底肯定经历过。几十张发票拍了照存在手机里,报销要一张张手抄金额、日期、开票方,眼都花了还容易抄错。
做完这个工具,你把每张发票识别出的文字存成文本,脚本自动把金额、日期、开票方挑出来,排成一张 Excel,按文件名排好。你最后只核对一遍总额。
下面每一步都按「你打开什么、复制哪段、存成什么名、怎么跑、看到啥」来写。零基础也能跟。
想象一下这个结果。
你桌面有个文件夹,里面是「发票1.txt」「发票2.txt」,每张对应一张发票识别出的文字。以前你要对着照片逐个抄。
做完之后,你跑一下脚本,出来一张「报销表.xlsx」。第一列文件名,后面是日期、开票方、金额。你扫一眼,加一遍总额,交。
这个工具长这样(用文字描述结构)。
做出来之后,你省下的是一张张对着照片抄数字的手工活,和抄错重来的返工。
重点说一下 OCR。OCR 是把图片上的字认出来变成文本的技术,手机扫文档、翻译 App 都靠它。你不用自己装 OCR,用手机自带的识别,或者任意能识别图片文字的网页,把每张发票的文字复制出来存成 txt 就行。
装库。装好 Python 后打开命令行,输入
pip install openpyxl看到成功提示就装好了。
安全上必须先说一句。发票含税号、金额这些敏感信息,尽量本地处理,别传到不熟悉的网站。而且 OCR 不是绝对准,金额务必自己加一遍再交。报销关系到钱,AI 识别仅供参考,关键数字必须人工复核。
拿出手机,打开能识别图片文字的功能(很多手机相册长按图片就有,或者任意 OCR 网页)。
对着一张发票拍照识别,把出来的文字全选复制,存成一个 txt 文件,叫「发票1.txt」。第二张叫「发票2.txt」,以此类推。都放进桌面一个叫「发票txt」的文件夹。
这里有个小技巧。拍的时候把发票放平、光线足,字清楚,后面识别才准。歪着拍容易认错数字。
打开记事本,复制下面这段,存成「整理.py」,保存类型选「所有文件」,编码 UTF-8。和「发票txt」文件夹放同一目录。
import os, re from openpyxl import Workbook folder = r'./发票txt' # 每张发票识别出的文字存成一个 .txt rows = [] for f in sorted(os.listdir(folder)): if not f.endswith('.txt'): continue text = open(os.path.join(folder, f), encoding='utf-8').read() m = re.search(r'(?:价税合计|金额)[^0-9]{0,6}([0-9]+\.[0-9]{2})', text) amount = m.group(1) if m else '' d = re.search(r'(\d{4})[年/-](\d{1,2})[月/-](\d{1,2})', text) date = d.group(0) if d else '' s = re.search(r'名称[::]\s*([^\n]{2,30})', text) seller = s.group(1).strip() if s else '' rows.append([f, date, seller, amount]) wb = Workbook() ws = wb.active ws.append(['文件名', '日期', '开票方', '金额']) for r in rows: ws.append(r) wb.save('报销表.xlsx') print('已生成报销表.xlsx,共', len(rows), '张')怎么跑。在这个目录打开命令行,输入
python 整理.py回车。你看到「已生成报销表.xlsx,共 N 张」,文件夹里就多了一张 Excel。双击打开,四列整整齐齐。
第一个坑,拍歪了金额认差十倍。
有一张发票我斜着拍,OCR 把「128.00」认成了「1280.00」,差了十倍。那个月报销总额对不上,财务打回来,我一张张重加才发现。后来我每张都自己加一遍总额,宁可慢点也不交错。
第二个坑,金额没匹配到。
有张发票金额写法是「金额(小写)¥1,280.00」,我的正则没认出带逗号的。后来我把逗号先去掉再匹配,或者手动补那一行。
第三个坑,开票方抓错。
有的发票「名称」出现两次(购买方和销售方),脚本抓到了第一个也就是我自己的名字。后来我改成抓「销售方」后面的名称才对。
验收标准很简单。
你拿三张发票试,跑出来三行,日期、开票方、金额都对。再把金额加起来,和脚本里看到的一致。
能,就对了。但记住,交之前你亲自加一遍所有金额,别直接信脚本的数。
做出来之后,你可以加两样东西。
一个是自动算总额。在 Excel 最后加一行 SUM,省你手加。
一个是按日期排序。脚本里 sorted 已经按文件名排,你可以改成按日期排,报销单看起来更顺。
这两样不是必须。但加上之后,你交给财务的就是一张干净又对得上的表。
我第一次做出来那天,月底二十五张发票。以前我要对着照片抄一小时,还总怀疑抄错。那回我识别完跑一下,三分钟出表,然后自己加了一遍总额,心里有底才交。
那一刻我明白,工具替我干的不是「判断」,是「抄写」这种重复活。判断和核对,永远留给我自己。
你不用懂 OCR 原理。你要的只是一个「把字认出来、让脚本排一排」的动作。
剩下的是它帮你排,你帮自己核对。
这一篇带你做出来的是发票报销整理。下一篇,咱们一份模板加一份名单,批量生成几十份 Word。
OCR 准不准,七分靠拍。给你几条实在的。
拍完识别完,别急着跑脚本。先肉眼扫一眼文字,明显的错字先改掉,后面脚本才挑得准。如果一张发票跨了两行文字,识别出来也是连着的,你存 txt 前顺手断一下行,后面挑金额更稳。
出来的是四列基础表,你可以按公司模板再加。
加完这层,财务拿到的是一张能直接入账的表,不只是流水。报销无小事,慢一点比对快一点被退强。记得再次提醒自己,金额那一列是机器认的,交之前你亲自加一遍,别偷这个懒。
你如果发票不多,比如就五六张,也值得用。手动抄五六张容易,但月底累的时候最容易抄错。把这套当成一个「防错网」,识别完跑一下,金额列出来你加一遍,比纯手抄多一层保险。工具不是只给大量用的,给怕错的人用也一样好使。别觉得少就懒得用,错往往出在觉得少的时候。
识别文字那一步,能用手写转文字的也行,只要最终是 txt 就能进脚本。关键不是用什么识别,是识别出干净的文字。文字越干净,脚本挑金额越准,你核对越省心。
我是 Jeff,每天用 AI 解决一个真实问题。这一篇,是我替你亲自试过的。
如果你觉得今天这篇有收获,欢迎点赞、在看、转发三连,我们下篇见
THANKS FOR READING















































































