财务、报销、审计场景中,发票信息录入Excel是高频但低效的工作。一张增值税发票上至少有十几个字段——发票代码、发票号码、开票日期、购买方/销售方信息、金额、税额、价税合计——纯手工敲,一张少说两分钟,还容易看错行。本文梳理几种主流方案,从最简单的手动技巧到基于OCR和大模型的自动化提取,帮你按业务量选对工具。
一、先搞清楚:你手里的发票是什么格式
不同来源的发票,处理难度天差地别:
| 发票类型 | 常见格式 | 提取难度 | 推荐方案 |
|---|---|---|---|
| 电子发票(全电发票) | PDF / OFD / XML | 低 | 直接解析XML或PDF文本层 |
| 增值税电子普通发票 | 低-中 | PDF文本提取 + 正则 | |
| 纸质发票扫描件 | PDF / 图片 | 中 | OCR识别 |
| 手机拍照发票 | JPG / PNG | 中-高 | OCR + 字段校正 |
| 增值税专用发票(纸质) | 扫描件 | 中 | OCR + 结构化模板 |
关键判断点:如果是电子发票PDF,它内部大概率有可复制的文本层,不需要OCR,直接提取文字再做字段切分即可,准确率接近100%。只有扫描件和照片才需要OCR。
二、零成本方案:Excel自带功能 + 手动技巧
1. Power Query 从PDF取数(Excel 365 / 2021)
Excel的"数据 → 获取数据 → 从文件 → 从PDF"可以直接解析PDF中的表格。对于版式规整的电子发票,能自动识别出发票明细行。如果是图片格式的,可能不太好用。
操作路径:
- 打开Excel,点击「数据」选项卡
- 选择「获取数据」→「从文件」→「从PDF」
- 选中发票PDF,Excel会列出文档中识别到的表格
- 勾选需要的表,点击「转换数据」进入Power Query编辑器
- 清洗后点击「关闭并上载」
局限:对单张发票的抬头信息(发票号码、日期等)识别不稳定,更适合提取发票里的商品明细表格。
2. 复制粘贴 + 文本分列
最朴素但最可靠的方式:打开PDF,全选复制,粘贴到Excel,然后用「数据 → 分列」按空格或分隔符拆分。配合Ctrl+E快速填充,对固定格式的发票字段提取效率很高。
例如把"发票号码:12345678"粘贴到A列,在B列输入第一个结果12345678,按Ctrl+E,Excel会自动推断规则并填充剩余行。
三、在线工具
每月几十到几百张发票,手动处理已经不现实,但又没必要上系统。这一档的核心是OCR结构化识别。
1. 发票处理成excel网站
- https://bankstatement-wizard.net/:支持pdf格式,图片格式的发票,通过AI技术,提取里面表格,转为excel 和 csv格式,非常好用,不会出现乱码问题
2. 发票专用OCR接口
百度AI、阿里云、腾讯云都提供"发票识别"API,针对增值税发票做过专项训练,能直接返回结构化JSON。典型调用流程:
- 注册账号,开通发票识别服务,获取API Key
- 上传发票图片/PDF,调用接口
- 接口返回JSON,包含发票代码、号码、日期、购销方、金额、税额、明细行等字段
- 用Python脚本把JSON写入Excel
以百度AI发票识别为例,返回的核心字段结构大致如下:
{"invoice_code":"011002000111","invoice_num":"12345678","invoice_date":"2024年03月15日","total_amount":"1000.00","total_tax":"130.00","amount_in_figures":"1130.00","seller_name":"某某科技有限公司","purchaser_name":"某某贸易有限公司","commodity_transaction_name":[{"name":"*信息技术服务*软件开发费","amount":"1000.00","tax_rate":"13%"}]}拿到JSON后,用pandas一行代码就能导出Excel:
importpandasaspd df=pd.DataFrame([invoice_data])# invoice_data 为识别结果字典df.to_excel("发票汇总.xlsx",index=False)成本参考:各家云厂商的发票识别API通常有免费额度,超出后每张约0.01-0.05元,几百张的成本可以忽略。
四、大批量 / 企业级方案:自动化流程
如果每月发票量上千张,或者需要和财务系统对接,建议搭建自动化流水线:
方案A:RPA + OCR
用UiPath、影刀、来也等RPA工具,配置一个流程:
- 监听指定文件夹(如"待识别发票")
- 新文件进入后自动调用OCR接口
- 识别结果写入共享Excel或数据库
- 异常件(识别置信度低)自动标记并通知人工复核
方案B:全电发票直接解析XML
全面数字化的电子发票(全电发票)本身就是结构化数据。开票方交付的XML文件里,所有字段都有明确标签,根本不需要OCR。
importxml.etree.ElementTreeasETimportpandasaspd tree=ET.parse("全电发票.xml")root=tree.getroot()data={"发票号码":root.findtext(".//InvoiceNumber"),"开票日期":root.findtext(".//IssueDate"),"价税合计":root.findtext(".//TaxIncludedTotalAmount"),# ... 其余字段}pd.DataFrame([data]).to_excel("发票汇总.xlsx",index=False)这是准确率最高、成本最低的方式——随着全电发票全面推行,未来发票转Excel的核心不再是"识别",而是"数据对接"。
方案C:专业财务软件
用友、金蝶、每刻报销、合思等系统都自带发票识别和录入功能,上传发票后自动生成凭证,Excel只是中间导出格式。如果企业已经在用这类系统,不需要自己造轮子。
五、自己动手:一个极简Python脚本
如果你有一批电子发票PDF,想快速汇总到Excel,下面这个脚本可以作为起点。它用pdfplumber提取文本,用正则匹配关键字段,适合版式统一的电子发票。
importpdfplumberimportreimportpandasaspddefextract_invoice(pdf_path):withpdfplumber.open(pdf_path)aspdf:text="\n".join(page.extract_text()forpageinpdf.pages)deffind(pattern):m=re.search(pattern,text)returnm.group(1).strip()ifmelse""return{"发票号码":find(r"发票号码[::]\s*(\d+)"),"开票日期":find(r"开票日期[::]\s*([\d年月日]+)"),"价税合计":find(r"价税合计[^¥¥]*[¥¥]?\s*([\d.]+)"),"销售方":find(r"名称[::]\s*(\S+公司)"),}# 批量处理文件夹下所有PDFimportglob results=[extract_invoice(f)forfinglob.glob("发票/*.pdf")]pd.DataFrame(results).to_excel("发票汇总.xlsx",index=False)注意:正则匹配依赖发票版式,不同省份、不同开票系统的格式可能有差异,实际使用时需要根据样本调整。
六、避坑提醒
- 扫描件分辨率:OCR识别前确保图片清晰度,建议300dpi以上,模糊的发票识别率会骤降。
- 金额校验:提取后务必做一次"金额+税额=价税合计"的校验,不相等的大概率识别有误。
- 发票真伪:OCR只能提取信息,不能验真。报销场景需要对接国税总局发票查验平台或第三方验真接口。
- 重复录入:用发票号码+发票代码做唯一键去重,避免同一张发票被录入两次。
- 数据安全:发票包含企业税号、金额等敏感信息,使用云端OCR服务时注意数据合规要求,涉密企业建议部署本地OCR模型。
七、选型建议总结
| 月处理量 | 推荐方案 | 预计成本 |
|---|---|---|
| < 20张 | 手动复制 + Excel快速填充 | 0 |
| 20-200张 | 发票识别API + Python脚本 | 几元到几十元 |
| 200-2000张 | OCR工具批量处理 / RPA流程 | 几百元 |
| > 2000张 | 财务系统集成 / 全电发票XML对接 | 按系统定价 |
发票转Excel本质上是一个"非结构化数据 → 结构化数据"的问题。电子发票普及后,这个问题正在从"图像识别"转向"数据解析",技术门槛越来越低。如果你只是偶尔处理,Excel自带功能就够了;如果是重复性工作,花半小时写个脚本或配个RPA流程,省下的时间远不止这点投入。