スキャンした請求書をAIでExcel化する方法:明細・先頭ゼロ・合計を確認
2ページのサンプル請求書をOfox ChatでExcelに変換。明細の抽出、SKUの先頭ゼロ、繰越額の二重計上、元ページと金額の検算まで、実際の出力ファイルで確認します。
スキャンした請求書をExcelにするには、明細と元ページを抽出し、小計や合計を明細から分離して、金額を検算します。 ファイルが開くだけでは、行の欠落、SKUの変化、小計の二重計上までは分かりません。
この記事では、明細6行を含む2ページの自作サンプルを使います。架空の請求書であり、顧客情報は含まれていません。PDFは画像だけで構成され、埋め込みテキストがないため、OCRを使わないテキスト抽出では文字を取得できません。正解値があるので、出力を見た目で信用せずに照合できます。すべての請求書に対する認識精度を示す試験ではありません。
元の請求書と正解値を分けて用意する
スキャン請求書PDFをダウンロードし、照合用の正解値は抽出依頼と分けて保管してください。両方をAIに渡すと、請求書を読めたかではなく、正解を転記できたかを試すことになります。
2ページ目には表の見出しが繰り返されています。1ページ目末尾の繰越額185.40米ドルは2ページ目にも記載されていますが、追加の購入明細ではありません。SKUはすべてゼロで始まります。手書きや大きな汚れがなくても起こる、実務的な確認点を含めたサンプルです。
| 確認する項目 | このサンプルの正解 |
|---|---|
| 明細行数 | 6行 |
| 1ページ目の明細小計 | 185.40米ドル |
| 2ページ目の明細小計 | 104.59米ドル |
| 請求書の小計 | 289.99米ドル |
| 小計に対して一度丸めた税額 | 29.00米ドル |
| 合計 | 318.99米ドル |
税額の計算方法はサンプル内に記載されています。他の国や地域の税務処理を勧めるものではありません。実際の請求書には、明細ごとの丸め、値引き、送料、源泉徴収、複数税率などがあります。自分の計算方法で元の請求書を書き換えず、印字内容と差異を残してください。
PDFに合った抽出方法を選ぶ
まず、PDF内の文章を選択してコピーしてみます。意味の通る文字列が得られれば、使えるテキスト層がある可能性があります。画像しか選べない場合は、OCRかページ画像を確認できるモデルが必要です。検索可能なPDFでもOCR結果が誤っていることはあるため、SKUと金額を表示された原稿に照らして確認します。
単発の請求書であれば、ファイルを扱えるアシスタントに抽出、例外の記録、Excel作成をまとめて依頼できます。一定の帳票を数千件処理するなら、業務ルールを組み込んだ文書処理パイプラインの方が監視と再実行を管理しやすくなります。モデルの順位は評価候補を絞る材料であり、個々の請求書を正しく読める証明ではありません。OCR向けモデル選び(英語)はモデル選定を扱い、本記事は完成したExcelの確認に重点を置きます。
利用する画面がPDFを受け付け、ダウンロード可能なXLSXを生成できるか確認してください。画像対応のAPIがPDFアップロードにも対応するとは限りません。チャットに表示された表も、Excelの添付ファイルとは別です。画像だけ受け付けるツールでは各ページを画像にして、元の順番とページ番号を保ちます。1ページ目が処理できたからといって、2ページ目を省略してはいけません。
抽出前にExcelの構成を決める
印字された明細1行をExcelの1行にします。必要な列は invoice_id、sku、description、quantity、unit_price、line_amount、currency、source_file、source_page、review_status です。元の請求書に行番号がなければ、追跡できる行IDも付けます。同じ商品が複数行に現れる場合があるため、SKUだけを重複削除のキーにしないでください。
識別子は文字列、数量と金額は数値として保存し、通貨を別列にします。画面に 000101 と見えていても、セルの実値が数値の 101 なら、文字列として保持したことにはなりません。表示形式だけでゼロを補っていると、CSVへの書き出しで失われることがあります。
小計、税額、合計と出典は InvoiceSummary シートにまとめます。読めない値、計算の差異、重複の疑いは Exceptions シートに残します。「検証済み」という一言ではなく、何を確認したかを記録させます。例外シートが空でも、チェックを実行した証拠がなければ安心できません。
抽出と検算を具体的に依頼する
Ofox Chatで新しい会話を開き、合成サンプルのPDFだけを添付します。2ページ分が対象になっていることを確認してから送信してください。以下は再利用できる指示です。実行時には、その画面でファイルを扱えることと、最終的に添付が生成されたことも確認します。
添付した架空の請求書PDFを読み、全ページの印字された明細を、
ダウンロード可能なXLSXに抽出してください。外部検索は不要です。
次の3シートを作成してください。
1. LineItems: invoice_id, sku, description, quantity, unit_price,
line_amount, currency, source_file, source_page, review_status
2. InvoiceSummary: 印字された小計、税額、合計、税と丸めの説明、
それぞれの元ページ
3. Exceptions: 読めない値、金額の不一致、原稿の目視確認が必要な行
先頭ゼロを含む識別子は文字列で保存してください。
繰り返しの見出し、繰越額、小計、税額、合計を明細に含めないでください。
同じSKUでも、元の行が重複だと確認できなければ削除しないでください。
読めない数値は空欄にし、理由を記録してください。
合計を合わせるために値を推測しないでください。
数量×単価と印字された行金額を比較し、明細合計と小計、
小計+印字された税額と合計を照合してください。
不一致の場合は印字値と計算値を両方残してください。
ページ数と明細行数を明記し、Markdown表だけではなくXLSXを返してください。
元のPDFは変更しないでください。
この指示では、文字を読む処理と計算を分けています。AIが合計に合うよう印字値を変えてしまうと、抽出結果ではなくなります。「本来はこの値だろう」と推測できても、差異を残すことが必要です。
実際の請求書には、処理する権限のある情報だけを含めてください。作業に不要な銀行口座や個人情報は除きます。この公開サンプルを使えることは、自社の取引先文書も同じサービスに送ってよいという意味ではありません。
プレビューだけでなくダウンロードしたセルを確認する
返されたExcelの LineItems を開きます。明細は6行で、元ページ1と2がそれぞれ3行ずつあるはずです。000101 と 000108 を探し、表示形式だけでなくセルの実値や数式バーを確認します。説明、数量、単価、行金額も元ページに照合します。
金額はAIの説明とは別に計算します。このサンプルでは次のとおりです。
ページ1: 2 × 19.95 + 3 × 8.50 + 1 × 120.00 = 185.40
ページ2: 4 × 6.25 + 2 × 14.80 + 1 × 49.99 = 104.59
小計: 185.40 + 104.59 = 289.99
税額: 289.99 × 10% をセント単位に丸める = 29.00
合計: 289.99 + 29.00 = 318.99
合計が一致するだけでは不十分です。2つの誤りが相殺することも、SKUだけが間違って金額は合うこともあります。行の同一性、ページの網羅性、数値の関係を別々に確認してください。複数の請求書を集計する場合も、先に請求書単位・通貨単位で検算します。
数式が入ったExcelは、Excelなど互換性のあるアプリで再計算します。Pythonで数式のキャッシュを読むだけでは、空欄や古い値になることがあります。openpyxlの公式説明(英語)でも、数式の書き込みと評価は区別されています。自動監査では十進数演算で期待値を計算し、数式の文字列を計算結果として扱わないでください。
実際のChat実行で得られた結果
2026年11月7日、Ofox ChatのBalanced設定に2ページの合成PDFだけを渡しました。正解JSONは渡していません。実際に生成されたExcelには、LineItems、InvoiceSummary、Exceptions の3シートがあります。

検証時の画面と出力は英語です。日本語の上記プロンプトは再利用用の翻訳であり、同じ入力を日本語で再実測したという意味ではありません。ダウンロードしたファイルを独立して確認したところ、SKU6件はすべて文字列で保存され、説明と数値は原稿に一致しました。元ページ列は各ページ3行でした。十進数で再計算した小計は289.99米ドル、合計は318.99米ドルで一致し、繰越額は購入明細に含まれていませんでした。
Exceptions は完全な空シートではなく、「No exceptions」という説明用の1行を含みます。これを失敗した明細1件と数えないでください。小計などは印字値と計算値が分けて保存されています。この結果が示すのは、読みやすい英語の合成請求書での動作です。手書き、傷んだスキャン、日本語の帳票、複数取引先での精度は確認していません。
問題があった部分だけ修正する
| 症状 | 最初に確認する箇所 | 対応 |
|---|---|---|
| 明細が7~8行ある | 繰越額や小計が明細になっていないか | 元の位置を確認し、集計行だと分かったものだけを除く |
| 合計は合うがSKUが違う | 認識結果とセルの型 | 原稿から訂正し、文字列として保存する |
| 明細が3行しかない | 2ページ目の処理漏れ | 2ページ目を渡し直し、出典付きで確認済みの行を追加する |
| 数量×単価が合わない | OCR、値引き、単位換算、原稿自体の不一致 | 印字値を残し、業務上の扱いを決める前に差異を記録する |
| 合計が504.39米ドル | 185.40の繰越額の重複計上 | 追加額の由来を確認する。機械的に差し引かない |
| Excelのリンクがない | ファイルの生成・受け渡し | XLSXを再依頼する。非対応なら文字列列を保持できるCSV取込手順を使う |
「もう一度」より、対象を絞った修正依頼の方が結果を確認しやすくなります。次は繰越額を誤って明細に入れた場合の例で、今回の実測で発生した失敗ではありません。
元の請求書の2ページ目を再確認してください。
185.40の繰越額は明細ではありません。元の位置で繰越額だと確認できた場合だけ、
LineItemsからその行を除いてください。印字された6件の明細、SKU、元ページは保持します。
検算をやり直し、invoice-reviewed-v2.xlsxとして出力し、変更点を説明してください。
修正前後のファイルは両方残します。文字が読めない場合、プロンプトを変えるだけでは改善しません。より鮮明なスキャンを入手するか、人が原稿を確認します。モデルが示す信頼度の数値で、その確認を代用しないでください。
1件の検証を繰り返せる手順にする
フォルダ全体を処理する前に、返金・マイナスの請求、複数通貨、別取引先の同じ請求書番号、値引き、複数ページの表も試します。負の値を許す条件と、重複請求書を識別する方法を決めてください。英語6行のサンプルだけで、こうしたケースや日本語・ロシア語の原稿への対応は判断できません。
抽出を確認してから、Excelデータ分析の手順で集計やグラフに進みます。ファイルをまとめる場合はExcelの結合手順で出典を保ちます。APIで処理するなら、OCRの後にテキストからJSONへの検証(英語)を組み込みます。JSONが正しい形式でも、請求書としての検算は必要です。
完成物は、他の担当者が元の請求書までたどれるExcelです。Ofox Chatでサンプルを試し、実務に使う前にも同じ確認を行ってください。


