AI PLAY玩法更新持续收录
← 回到更新流

2026-10-05 · 原文发布日

PDF工时表自动汇总进Excel

这个免费n8n流程让你在n8n聊天窗口一次上传多份PDF工时表,逐个提取文本后交给Azure OpenAI智能体分类统计,按顾问姓名返回现场、远程和未知三类工时合计的JSON(JSON不合法会直接报错中止),然后每位顾问一行追加到Microsoft Excel工作簿和n8n Data Table,全部写完后通过Outlook发一封处理完成确认邮件。扫描件需先OCR出文字层。

原文要点

原工作流由Christoph Dibbern发布:在n8n聊天窗口一次上传一份或多份PDF工时表,流程拆分文件逐份处理,提取纯文本后交给Azure OpenAI驱动的智能体,按顾问姓名分类统计现场、远程、未知三类工时并返回JSON;解析失败会报错中止。随后每位顾问一行追加到Microsoft Excel工作簿(列名name、onsite、remote、unknown)并同步插入n8n Data Table,全部写完后通过Outlook发一封处理完成确认邮件。需配置Azure OpenAI、Excel、Outlook凭据,目标表四列齐全,扫描件须先OCR出文字层。

这次做成什么

做一条“聊天上传PDF→AI汇总工时→双写Excel与Data Table→邮件确认”的处理线。本站独立练习方案:先用材料区的合成工时表文本(绕过PDF提取)调通分类统计与JSON校验,再换真实PDF端到端验证。

准备什么

  • n8n实例,启用n8n Chat触发,具备Azure OpenAI聊天模型、Microsoft Excel、Microsoft Outlook及Data Table节点
  • Azure OpenAI部署的凭据,以及有目标工作簿写权限和Outlook发信权限的Microsoft 365账号
  • Excel工作簿中已建工作表,列名严格为name、onsite、remote、unknown;n8n Data Table四列同名
  • 带文字层的PDF工时表;扫描件需先用其他OCR工具生成文字层

具体怎么做

  1. 配置聊天上传入口

    添加Chat Trigger作为入口,允许文件上传;接拆分节点把一次上传的多个PDF拆成独立条目逐个处理。练习阶段可先不上传文件,用Set节点粘贴材料区的合成工时文本代替。

  2. PDF文本提取

    添加PDF提取节点,把每个文件二进制转成纯文本。用一份真实带文字层的PDF测试,确认输出文本完整;扫描件在此步会输出空文本,需先OCR。

  3. 配置Azure OpenAI统计智能体

    添加AI Agent/语言模型节点绑定Azure OpenAI凭据,系统提示词用材料区全文:要求逐条判断每条工时记录属于onsite、remote还是无法判断的unknown,按顾问姓名汇总三类合计,只返回规定结构的JSON。

  4. JSON解析与失败中止

    加Code节点对模型输出JSON.parse,并校验每条结果含name、onsite、remote、unknown四个数字字段;解析或校验失败直接抛错让流程中止,避免脏数据写表——这与原模板行为一致。

  5. 双写Excel与Data Table

    Excel节点选Append,逐顾问写入一行;Data Table节点插入同样四列值。两处字段映射都用解析后的name/onsite/remote/unknown。

  6. 发送完成确认邮件

    最后加Outlook节点,收件人填处理负责人地址,主题如“工时表处理完成”,正文写明本次处理文件数与写入行数。端到端手动跑一次,核对Excel行数与Data Table一致。

可直接复制的材料

Azure OpenAI工时统计系统提示词

本站按原模板描述独立重写;unknown兜底不猜测是关键规则,字段名与Excel列对齐

你是工时表汇总助手。输入是一位顾问的PDF工时表提取出的纯文本,其中每一行是一条工时记录,含日期、工作描述和小时数。
请逐条判断:
- 描述中明确提到在客户现场、驻场、on-site、vor Ort等,计入onsite;
- 明确提到远程、居家办公、remote、Homeoffice等,计入remote;
- 无法从描述判断工作地点的,计入unknown,不要猜测。
汇总该顾问三类工时的小时合计,并只输出如下合法JSON,不输出任何解释:
{"consultants":[{"name":"顾问姓名","onsite":数字,"remote":数字,"unknown":数字}]}
工时表文本:
{{ $json.extractedText }}

合成工时表文本(练习用)

本站虚构文本,可粘进Set节点代替PDF提取结果练习统计逻辑;含一条无法判断地点的记录用于验证unknown

顾问:李岚
date,hours,description
2026-09-28,8,客户现场部署新版本
2026-09-29,4,远程例会与支持
2026-09-30,6,代码评审与文档
2026-10-01,8,客户现场培训
2026-10-02,3,远程故障排查

Excel与Data Table字段映射

列名必须严格为name/onsite/remote/unknown;工作簿、收件人需替换为你自己的

{"excel":{"workbook":"替换为目标工作簿","worksheet":"替换为工作表名","mode":"append","columns":{"name":"consultants[].name","onsite":"consultants[].onsite","remote":"consultants[].remote","unknown":"consultants[].unknown"}},"dataTable":{"columns":["name","onsite","remote","unknown"]},"outlook":{"to":"替换为负责人邮箱","subject":"工时表处理完成"}}

输入与输出示例

本站虚构演示,汇总数字按合成文本手工核算(8+8=16、4+3=7、不明6),非真实模型调用结果

输入

在n8n聊天上传一份练习PDF,其提取文本即上方合成工时表:李岚,五天记录分别为现场8小时、远程4小时、描述不明6小时、现场8小时、远程3小时。

对应输出

智能体返回 {"consultants":[{"name":"李岚","onsite":16,"remote":7,"unknown":6}]};Excel追加一行:name=李岚、onsite=16、remote=7、unknown=6;Data Table出现相同一行;Outlook收到一封主题为“工时表处理完成”的确认邮件,正文注明处理1个文件、写入1行。

做完检查这些

  • 一次上传两份PDF时,拆分后每份独立处理且各产生对应行,互不串数据
  • 把合成文本中“代码评审与文档”这类无地点描述改为明确远程后,unknown应减少6小时、remote增加6小时
  • 故意让模型输出非JSON(如在解析节点前注入杂文本)时流程报错中止,Excel不产生脏行
  • Excel追加行与Data Table插入行的四列数值完全一致
  • 全部文件处理完后才发送确认邮件,邮件中的行数与实际写入行数一致

容易卡住的地方

  • 扫描件没有文字层时PDF提取得到空文本,模型会把全部工时归为unknown或直接失败,必须先OCR
  • Excel列名大小写或顺序不符会导致映射失败,四列严格为name、onsite、remote、unknown
  • Azure OpenAI凭据用的是部署名而非模型名,配置错会直接认证失败
  • 多顾问混在一份PDF时需确认提示词按姓名分组,否则合计会串人
  • 确认邮件在末尾节点才发,若中间任一步失败中止则不会收到邮件,排查时先看执行日志

原文与作者资料 ↗

本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。

原文标题
Extract consultant hours from PDF timesheets with Azure OpenAI and Excel
原作者
Christoph Dibbern
原始发布日期
2026-10-05T13:37:46.873Z
来源
https://n8n.io/workflows/20465