領収書OCRでCSVに変換し、会計ソフトに取り込む
領収書・レシートの手入力、Excelの文字化け、明細が1セルに潰れる、PDFがコピーできない ── その月末の作業を「撮影→列を定義→1枚=1行→CSV出力→freee/マネーフォワード/弥生へCSV取り込み」に置き換える実務ハウツー。明細は配列列で1商品=1行に展開、UTF-8 BOMで文字化け対策、値ごとにbbox+match_ratioで原本照合。1枚¥10・失敗時無課金・無料枠100枚/月。
月末。財布や引き出しから出てきた領収書とレシートの束。これを一枚ずつ会計ソフトに手入力していく、あの作業を思い浮かべてください。店舗名を打ち、日付を打ち、合計を打ち、また次の一枚へ。30枚もあれば集中力は途切れ、桁を一つ打ち間違えても気づかない。「領収書 手入力」が地獄なのは、量ではなく「単純なのに間違えられない」という性質にあります。
スキャンしてExcelに貼ろうとすれば、今度は別の壁が来ます。CSVを開くと日本語が文字化けする。レシートの明細(買った商品の一覧)が、改行ごと潰れて1セルに収まってしまう。PDFで送られてきた領収書はコピーすらできない。結局、画面の隣に原本を並べて、目で追いながら打ち直す ── これでは何のためのデジタル化か分かりません。
この記事は、その作業を 「領収書を撮る → 列を一度決める → アップロードで1枚=1行 → CSVで書き出して freee / マネーフォワード / 弥生 に取り込む」 という流れに置き換えるための、実務ハウツーです。製品の説明書ではなく、月末のあの束をどう片付けるか、という話として読んでください。
まずは触ってみる(アップロード不要・10秒)
下のサンプルは、実際の領収書2枚をOCRにかけた結果です。各フィールド(店舗名・日付・合計・明細)にカーソルを合わせると、その値を画像のどこから読み取ったかが原本の上にハイライトされます。アップロードもログインも要りません。まずは「読み取った値が、ちゃんと原本のその場所を指しているか」を確かめてみてください。

Every value carries a verified on-page location — bbox + 4-point vertices + match_ratio — on a 0–1000 normalized grid (0,0 top-left → 1000,1000 bottom-right), the same shape the live API returns. Hover a field to trace it back to the pixels it came from.
領収書OCRからCSVまで、実際の4ステップ
やることは多くありません。手順を順に動画で見ていきます。
- 元画像をアップロード ── 撮影またはスキャンした領収書を、決めておいた列(店舗名・日付・合計・明細…)に流し込む。
- 抽出シートで確認 ── 1枚が1行になり、列が自動で埋まる。
- bboxで原本照合 ── 怪しい値はセルをクリックすると原本の該当箇所が光り、目視で即チェック。
- CSVで書き出し ── そのまま会計ソフトへ取り込めるCSVに出力。
まずステップ1、撮影/スキャンした領収書をアップロードすると、各画像が定義した列に沿って構造化されます。
列(スキーマ)は一度だけ決めればいい
ポイントは、列を最初に一度決めておくことです。「店舗名・支店名・日付・合計・明細」のように欲しい項目を定義しておけば、その後にアップロードした領収書はすべて同じ形(同じスキーマ)で1行に揃います。レイアウトが店ごとにバラバラでも、出てくる行の形は同じ。だからこそ、最後に1枚のCSVへまとめられます。
「明細が1セルに潰れる」問題の正体
手作業のExcelで一番つらいのが、レシートの**明細(買った商品の一覧)**です。1枚の領収書に商品が10行あると、それを1セルに押し込むか、手で10行に割るしかない。
space-ocr では、明細は配列(array)型の列として定義します。CSVに書き出すとき、この配列列は 明細.商品名 明細.単価 明細.数量 のように子フィールドへ展開され、商品1点=1行として縦に広がります。つまり「1セルに潰れる」のではなく、最初から会計や集計で扱える行の形で出てきます。
{
"columns": [
{ "name": "店舗名", "type": "string" },
{ "name": "支店名", "type": "string" },
{ "name": "日付", "type": "string" },
{ "name": "合計", "type": "string" },
{
"name": "明細",
"type": "array",
"children": [
{ "name": "商品名", "type": "string" },
{ "name": "単価", "type": "string" },
{ "name": "数量", "type": "string" }
]
}
]
}怪しい値は、クリックで原本に飛んで確かめる
読み取りが終わったら、全部を信じる必要はありません。気になるセルをクリックすると、原本画像の「そこから読んだ」位置がハイライトされます。目線が一気にその場所へ飛ぶので、束のスポットチェックが速い。
これが効くのは、値ごとに**読み取り位置(bbox)と一致度(match_ratio)**が一緒に返ってくるからです。値が画像のどこから来たのかを、人もシステムも後から追える ── つまり監査できる、ということです。
座標は、AIが「ここにあったはず」と答えた数字ではありません。 言語モデルが返すのは、値のテキストと、参照した単語トークンのヒント(wid)だけです。座標そのものは作りません。エンジンはまず、その値のテキストを Vision OCR が実際にページ上で検出した文字(シンボル)と一文字ずつ照合し、見つかった実際のピクセル位置にボックスを置きます。そのうえで値ごとに match_ratio(一致度・0〜1.0) を付けます。1.0 は全文字が原本上で見つかったという意味で、0.85以上を確信マッチとして扱います。言語モデルのトークンヒントは、見つかったトークンの位置を補助的に上書きするのに使うことはありますが、鵜呑みにはしません ── とくに同じ値が並ぶ列ではヒントがぶれやすいため、列のまとまりや行の整合性でチェックし、ずれていれば文字照合の結果に戻します。座標は xmin / ymin / xmax / ymax の 0〜1000 正規化グリッド(0,0=左上、1000,1000=右下)で返るので、画像の解像度に依存しません。要は 「AIが間違えない」のではなく、「すべての値を原本に照らし、どれだけ一致したかを数値で示す」 ということです。
CSVで書き出して、会計ソフトへ取り込む
確認が済んだら、シートをCSVに書き出します。ヘッダーはスカラー列+配列の子列(明細.商品名 のように展開)で構成され、明細は1商品=1行に縦展開されます。手で直したセルがあれば、その修正値が優先されます。
そして文字化け対策。出力CSVは UTF-8 BOM 付きなので、Excel で開いても日本語が化けません。これが「Excelで文字化け」をそもそも起こさない理由です。
freee / マネーフォワード / 弥生 への取り込み
書き出したCSVは、各会計ソフトの**「CSVインポート(取り込み)」機能**から読み込みます。これは公式API連携ではなく、汎用のCSV取り込みです。だからこそ会計ソフト側のバージョンやプランに依存しにくく、列の対応づけ(マッピング)さえ合わせればそのまま入ります。
月末に溜めた領収書を、撮影 → 1シート → 1つのCSV → ソフトに一括取り込み。手入力していた時間が、確認の時間に変わります。
画像ではなくスキャンPDFが手元にある場合は、スキャンPDFをExcelに変換する手順も合わせてどうぞ。請求書・納品書をAPIで自動処理したいなら請求書・納品書OCR APIの記事が参考になります。
PDFの領収書も、そのまま扱える
メールで届いた領収書がPDFで、コピーもできない ── これもよくある詰まりどころです。アプリにPDFをドロップすれば、各ページが自動で画像化されてからOCRにかかります。だから「PDFはコピー不可」という壁を、こちら側で意識する必要はありません。複数ページのPDFはページごとに処理され、結果としてシートに積み上がります。
料金は明朗、失敗したら課金されない
- 1枚 ¥10 の従量課金(call/image 単位)。
- 失敗時は無課金 ── 結果が出なかった画像には課金されず、エンジンエラーは自動で返金されます。
- 無料枠は月100枚(クレジットカード不要、毎月リセット)。
- 定額で使うなら Pro $39/月。
「とりあえず今月の領収書を試したい」なら、無料枠の範囲でそのまま回せます。
領収書・請求書の電子化は、インボイス制度や電子帳簿保存法に沿った運用づくりの実務で役立ちます。原本のどこから読んだ値かを match_ratio 付きで後から追える点は、社内チェックや確認のしやすさにつながります。ただし本記事は会計・法務の助言ではなく、法的要件の充足や認証を保証するものではありません。制度対応の最終判断は、必ず顧問税理士など専門家にご確認ください。
月末の領収書を、撮るだけで終わらせる
- 列(スキーマ)を一度だけ定義する店舗名・支店名・日付・合計に加え、明細は配列(array)型の列として「商品名・単価・数量」を子フィールドに定義します。これで以後のすべての領収書が同じ形で1行に揃います。
- 領収書を撮影・スキャンしてアップロードするスマホ撮影でもスキャンでも構いません。PDFはドロップすれば各ページが自動で画像化されてからOCRされます。1枚=1行として読み取られ、列が自動で埋まります。
- 怪しい値を原本で確認するセルをクリックすると、原本画像のその値を読み取った位置(bbox)がハイライトされます。match_ratioが0.85未満の値は一致が弱いサインなので、優先的に確認・修正します。手で直した値は元のOCR値と分けて保存されます。
- CSVに書き出すシートをCSVに書き出します。明細などの配列列は「明細.商品名」のように展開され、商品1点=1行に縦展開されます。出力はUTF-8 BOM付きなので、Excelで開いても日本語が文字化けしません。
- 会計ソフトのCSVインポートで取り込むfreee・マネーフォワード・弥生などの「CSVインポート(取り込み)」機能から読み込みます。公式API連携ではなく汎用のCSV取り込みなので、列の対応づけを合わせればそのまま取り込めます。