生成AI動向【2026年最新】Excel文書を生成AIで扱う3つの方法|openpyxl・PDF変換・LibreOfficeと設計OSへの組み込み

「Excel文書を生成AIに読ませても、肝心の表や枠線、オブジェクト内のテキストが拾えず回答精度が落ちる」——本記事はこの製造業の頻出課題に対し、openpyxlでのパース/PDF変換ベースの視覚解析/LibreOfficeを使ったページ区切り制御の3アプローチを、2026年版の選定基準と業務OS(設計OS/品質OS)への組み込み方まで含めて整理します。
製造業の見積書・仕様書・工程管理書はExcelで作られることが多く、RAG(検索拡張生成)の入力品質を決める最大の関門になります。コードレベルでの抽出方法を押さえつつ、「単発のパース処理ではなく業務基盤として運用する」視点で、ChatGPT・ClaudeなどLLM活用の精度を底上げするための実装ガイドです。
もくじ
LLMを悩ませる”Excel文書”とは——3カテゴリの構造
ここで言うExcel文書とは、純粋な表データ(CSV相当)ではなく、セルに文章を書く・図形オブジェクトでフローチャートを描く・画像やグラフを混在させるといった「人が見るためのレイアウト」を持ったExcelファイルを指します。製造業の見積書、仕様書、工程管理書、検査記録、是正処置報告書(8D/FMEA)などの大半はこのカテゴリに入ります。
Excel文書がコンピュータにとって扱いづらい理由は、セル単位の値だけでなく、枠線・オブジェクト・画像・ページ区切りなどの「視覚情報」に意味が埋め込まれているためです。openpyxlやpandasで素直に読むと、枠線で構造化された表が単なる文字列の羅列になり、フローチャートのつながりが失われ、テキストボックスの内容がそもそも拾えません。
下記では、製造業向けの生成AI(SPESILLなど)の開発現場で実際にトライしてきた中から、3つのアプローチを選んで解説します。サンプルExcel文書は説明用に作成したものです。
解析が難しいExcel文書の典型例(3パターン)
①枠線で構造化
枠線を使って文書の構造化を行っているExcel文書の事例で、工程管理書など製造業でよく利用されている代表例です。生成AIやLLMに読み取らせる際に難しいのは、個々のセルではなく枠線をテーブル境界として認識する必要がある点です。サンプルにあるように画像が挿入されている場合は、画像も含めて認識させる処理が必要になります。

②セルでフローチャート
オブジェクトやセルを駆使してフローチャートを作成している例です。セルの枠線・スタイル・配置に意味があるため、それらの幾何関係を生成AIやLLMに認識させる必要があります。

③オブジェクトや画像、グラフの混在
LLMにとって最も扱いづらいのが、オブジェクト・画像・グラフが混在しているExcel文書です。セルを直接読むのではなく、Excelそのものを画像として扱いLLMの画像入力で処理する方法が現実的です。フローチャート部分については、mermaid形式のテキストに変換することで構造化情報として保持できます。

ERPは「お金とモノの記録台帳」、PLMは「図面とBOMの保管庫」であり、いずれも「業務そのもの」を実行する仕組みではない。
業務OSとは何か——製造業ERPでもPLMでもない、第3の業務基盤の正体(roboin-fa.com)
Excel文書も同じです。Excel自体は「データを書く道具」であって、見積もり・FMEA・是正処置といった業務そのものを動かす仕組みではありません。だからこそ、生成AIで読みやすくする前処理は「個別のスクリプト」ではなく「業務基盤の前処理パイプライン」として設計する必要があります。後半でこの観点に戻ります。
アプローチ1:openpyxlなどを使ってExcelをそのままパースする
ステップ1:テキスト情報の抽出
Excel文書を扱う最もシンプルな方法は、openpyxl等のExcelパースツールで文字列のみを抽出する方法です。以下のコードでは、Excelファイルをopenpyxlで読み込み、各シート毎に文字列を抽出して保存しています。
from openpyxl import load_workbook
workbook = load_workbook("<Excelファイルのパス>", data_only=True)
extracted_data = {}
for sheet_name in workbook.sheetnames:
sheet = workbook[sheet_name]
sheet_text = []
for row in sheet.iter_rows(values_only=True):
for cell in row:
if cell is not None:
sheet_text.append(str(cell))
extracted_data[sheet_name] = "\n".join(sheet_text)
print(extracted_data)ステップ2:表として読み込む
上の方法ではすべてのセルをテキストとして結合しているだけのため、表としての情報が失われます。pandasを使うとExcelを表として読み込み、Markdownに変換できます。ただしセル単位で要素が格納されている前提のため、実例①で示したような手動で書かれた枠線に沿った表は意図通りには再構成されません。構造化されたテーブルデータならこの方法で十分です。
import pandas as pd
excel_data = pd.read_excel("<Excelファイルのパス>", sheet_name=None)
markdown_data = {}
for sheet_name, df in excel_data.items():
markdown_content = df.to_markdown(index=False, tablefmt="pipe")
markdown_data[sheet_name] = markdown_content
print(markdown_data)ステップ3:オブジェクト内のテキストの抽出
下のようなExcelファイルをChatGPTに与えて質問すると「ファイルが空である」という回答が返ってきます。何が起きているのでしょうか。

このExcelファイルは、セルに文字が書かれているのではなく、矩形オブジェクトの中にテキストが埋め込まれている形式になっています。そのため、セルのパースだけではなく、オブジェクト内テキストのパースも必要です。
Excelのオブジェクトはopenpyxlやpandasでは取得できないため、Excelファイル内部(xlsxはzip形式)に直接アクセスし、特定のXMLファイルをパースして取得する必要があります。
import zipfile
from xml.etree import ElementTree as ET
textbox_contents: list[str] = []
with zipfile.ZipFile("<Excelファイルのパス>", "r") as z:
for file_name in z.namelist():
if "drawings" not in file_name:
continue
ns_xdr = "{http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing}"
ns_a = "{http://schemas.openxmlformats.org/drawingml/2006/main}"
with z.open(file_name) as f:
try:
tree = ET.parse(f)
root = tree.getroot()
except ET.ParseError as e:
print(f"Error parsing XML from file {file_name}: {e}")
continue
for two_cell_anchor in root.iter(f"{ns_xdr}twoCellAnchor"):
for textbox in two_cell_anchor.iter(f"{ns_xdr}txBody"):
text_content = ""
for paragraph in textbox.iter(f"{ns_a}p"):
paragraph_content = ""
for text in paragraph.iter(f"{ns_a}t"):
if text.text:
paragraph_content += text.text
text_content += "\n" + paragraph_content
textbox_contents.append(text_content)
print(textbox_contents)ステップ4:グラフ情報の抽出
次はExcel内のグラフ情報の抽出です。

グラフは画像として抽出してもよいのですが、どのデータを参照しているかが分かるため、生成AIやLLMに与える上ではデータを抽出して与える方法が有効です。以下では同様にExcel内のzip構造から、チャート情報のXMLファイルを読み込み、pandasのデータフレームに変換しています。
import zipfile
import pandas as pd
from xml.etree import ElementTree as ET
def parse_xml_for_chart(xml_data):
try:
root = ET.fromstring(xml_data)
except ET.ParseError as e:
print(f"Error parsing XML: {e}")
return {}
ns = {"c": "http://schemas.openxmlformats.org/drawingml/2006/chart"}
data = {}
for series in root.findall(".//c:ser", namespaces=ns):
cv_elem = series.find("./c:tx/c:strRef/c:strCache/c:pt/c:v", namespaces=ns)
if cv_elem is None:
series_name = ""
else:
series_name = cv_elem.text
categories = [
pt.find("./c:v", namespaces=ns).text
for pt in series.findall("./c:cat/c:strRef/c:strCache/c:pt", namespaces=ns)
]
series_values = [
pt.find("./c:v", namespaces=ns).text
for pt in series.findall("./c:val/c:numRef/c:numCache/c:pt", namespaces=ns)
]
data[series_name] = dict(zip(categories, series_values))
return data
doc_zip = zipfile.ZipFile("<Excelファイルのパス>")
zipped_files = doc_zip.namelist()
chart_tables: list[pd.DataFrame] = []
for file in zipped_files:
if file.startswith(f"{file_type}/charts/chart") and file.endswith(".xml"):
xml_data = doc_zip.read(file)
data = parse_xml_for_chart(xml_data)
df = pd.DataFrame(data)
chart_tables.append(df)
print(chart_tables)アプローチ2:PDFに変換してPDFや画像として扱う
近年、画像や表を含んだPDFを視覚情報に基づいて高精度に解析できるツールが急増しました。そこで、ExcelをPDFに変換し、視覚解析対応のパーサに通すことで、枠線で構造化された表やフローチャートも構造化情報として抽出できます。

視覚情報を考慮したPDFパーサ・AIツールには以下のようなものがあります。商用利用時は必ず各ライセンスを確認してください。
- opendatalab / MinerU:https://github.com/opendatalab/MinerU
- DS4SD / docling:https://github.com/DS4SD/docling
- getomni-ai / zerox:https://github.com/getomni-ai/zerox
- run-llama / llama_parse:https://github.com/run-llama/llama_parse
- pymupdf / RAG:https://github.com/pymupdf/RAG
- kotaro-kinoshita / yomitoku:https://github.com/kotaro-kinoshita/yomitoku
- QwenLM / Qwen2-VL:https://github.com/QwenLM/Qwen2-VL
- ChatGPT-4o:https://openai.com/index/hello-gpt-4o/
- Anthropic PDF support:https://docs.anthropic.com/en/docs/build-with-claude/pdf-support
①MinerU、②docling、⑥yomitokuは、表や画像を検出する検出器とOCRを使ってパースします。yomitokuは日本語に特化した機械学習モデルが特徴です。③zerox・④llama_parseはChatGPTなどのLLMを内部で使ってパースし、⑦Qwen2-VLや⑧GPT-4oはPDFを画像化してOCR性能の高いVLMで読み取ります。Excel→PDFのプログラム変換にはunoconvやgotenbergなどが使えます。
- unoconv / unoconv:https://github.com/unoconv/unoconv
- Gotenberg:https://gotenberg.dev/
これらの方法を組み合わせることで、実例①の枠線で構造化されたデータやフローチャートも構造化情報として抽出できます。LLMを用いたPDF→Markdown変換を行うと、Excelの表は以下のようにMarkdown表として出力できます。

同様にフローチャート(実例②)はmermaid形式に変換できます。

アプローチ3:PDF変換時にページ区切りを明確に設定する
アプローチ2でExcelをPDFに変換する際、Excel側でページ設定がされていないと、変なところでページが切れる問題が発生します。たとえば防衛省が公開しているシステム経費の実績資料をそのままPDFに変換すると、下の図のように表が途中で切れたPDFになります。これは作成者がページ区切りを設定しておらず、Office側が自動で適当な位置で切ってしまうために起きる現象です。


unoconvやgotenbergはページ区切りまでは調整できないため、ページ設定を自動で整えてPDF変換するツールが必要です。APIが提供されているWebサービスとしては以下があります。
- Adobe Acrobat Services API:https://experienceleague.adobe.com/ja/docs/acrobat-services-learn/tutorials/overview
- iLoveAPI:https://www.ilovepdf.com/ja/blog/what-is-ilovepdf-developers
これらのツールは無料枠もありますが、プロダクト本番運用では有料課金が発生します。「Excel→PDF変換だけで課金したくない」「自社で挙動を調整できるようにしたい」という要件で、自前で実装するアプローチも実用的です。office-to-pdf-serveとしてGitHub上で公開しており、Dockerで動くExcel→PDF変換APIサーバとして利用できます。
この方法を使うと、先ほどの防衛省資料も下の図のように1枚に収まる形でPDFに変換できます。

仕組みとしては、LibreOffice(Linuxで動くフリーのOfficeライクなツール)を内部でサーバとして起動しておき、APIでセル情報・ページ情報にアクセス・編集して、最終的にPDFに変換するという流れです。LibreOfficeをサーバとして立ち上げるコマンドは以下です。
soffice --accept=socket,host=localhost,port=2002;urp;StarOffice.ServiceManager --headless立ち上げた状態で、unoというpythonパッケージを使うことで、セルやページ情報にアクセスできます。
import sys
sys.path.append("/usr/lib/python3/dist-packages/") # unoはLibreOfficeと一緒にシステムのPythonパッケージとしてインストールされるのでパスを登録しておく
import uno
local_context = uno.getComponentContext()
resolver = local_context.ServiceManager.createInstanceWithContext(
"com.sun.star.bridge.UnoUrlResolver", local_context
)
context = resolver.resolve(
f"uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext"
)
desktop = context.ServiceManager.createInstanceWithContext(
"com.sun.star.frame.Desktop", context
)
input_url = "file:///<Excelファイルのパス>"
document = desktop.loadComponentFromURL(input_url, "_blank", 0, ())
for sheet in self.document.Sheets:
cell = sheet.getCellByPosition(0, 0)
print(cell)ここまでの対策によって、複雑なExcel文書から精度高く情報抽出ができるようになります。
3アプローチの選定基準(2026年版)
3アプローチを実務で選定する際の評価軸を整理しました。単一アプローチではなく、Excel文書のカテゴリに応じて使い分けるのが基本になります。
| 評価軸 | ①openpyxlパース | ②PDF変換+視覚解析 | ③ページ区切り制御PDF |
|---|---|---|---|
| 実装難易度 | 低(標準ライブラリ) | 中(OSS組合せ) | 高(LibreOffice等の運用) |
| 枠線で構造化された表の解析 | △(テキスト列挙のみ) | ○(境界を視覚検出) | ◎(ページ完結で精度向上) |
| フローチャート(オブジェクト) | ×(drawings.xml直読が必要) | ◎(mermaid化可) | ◎ |
| グラフ・画像混在 | △(zip経由でデータ抽出可) | ◎(VLMで画像認識) | ◎ |
| 運用コスト | 低(Python単体) | 中(GPU推奨/API課金) | 中(コンテナ運用) |
| RAG構築での総合適性 | 定型表のみのRAG向け | 大半のExcel文書RAG向け | 長尺帳票・公的資料RAG向け |
| 業務OS(設計OS/品質OS)親和性 | △(個別スクリプト止まり) | ○(前処理パイプラインとして組込み) | ○(標準化された変換層として組込み) |
表が示すのは、「単一アプローチでExcel文書すべてをカバーしようとすると破綻する」という事実です。実運用では3アプローチを組み合わせ、Excel文書のカテゴリ判別→適切なパイプラインへの振り分け、という処理ルーティングを前処理層で実装することになります。
【2026年最新】Excel文書解析は「単発スクリプト」ではなく「業務OSの前処理層」として設計する
ここまで読むと、Excel文書を生成AIで扱う技術ピースは2026年時点で揃っていることが分かります。しかし、装置メーカー・設計部門・品質部門が直面する本質的な課題は、「Excelをパースできるか」ではありません。
設計者の業務時間の約4割は「情報の探索+メンテナンス+連絡」で溶ける——図面そのものを描く時間ではない。
設計部長が知らないと損する、図面検索の本当のコスト(roboin-fa.com)
Excel文書まわりでも同じ構造があります。見積書を作る、FMEAを書く、是正処置を記録する——これらの業務時間の多くは「中身を書く時間」ではなく「過去案件の類似Excelを探す/前任者に体裁を確認する/Excelの体裁を直す」に消えています。Excel解析を生成AIで高速化しても、業務フローが個別属人運用のままでは現場の業務時間は思ったほど減りません。
SPESILLのような製造業向け生成AIは、まさにこの「業務層から呼び出されるExcel前処理パイプライン」を持つことで、仕様書・FMEA・是正処置・見積書・各種ログといったExcel帳票全般を構造化+AI活用可能にする基盤として機能します。
設計OSは図面・部品表・設計変更を一気通貫で扱う業務エージェント基盤であり、PLM/CADのデータ層に対する「業務層」として位置する。
設計OSとは——図面・部品表・設計変更を一気通貫させる業務エージェント基盤(roboin-fa.com)
Excel文書解析もこれと同じ構造で、単発スクリプトとしてではなく、設計OS/品質OSの前処理層として組み込むことで「Excel資産の業務OS化」が実現します。
FAQ:Excel文書×生成AIの実務疑問
Q1. ChatGPTにExcelをそのまま添付すれば読めるのに、わざわざパース処理が必要ですか?
単発の質問なら直接添付で十分なケースが多いですが、RAG(検索拡張生成)として大量のExcel文書を継続的に扱う場合は前処理が必須です。Excelをアップロードした際の内部解析はLLM側のブラックボックスで、枠線で構造化された表やオブジェクト内テキストが拾えないことがあります。社内RAGや業務OSの中で扱う場合、自前のパイプラインで「どこまで構造化できたか」をログとして残せる構成が安全です。
Q2. openpyxlとpandas、Excel文書の解析にはどちらを使うべきですか?
用途で使い分けます。pandasは「すでに構造化されたテーブル」(CSV相当のシート)の処理に最適で、Markdown変換まで一発で書けます。openpyxlは「テーブル+オブジェクト+画像が混在するExcel文書」に対して、低レベルで細かい制御が必要な場合に向きます。実運用では「pandasで一次パース→失敗したらopenpyxlでZIP直読」のフォールバック構造が現実的です。
Q3. PDF変換せずに、Excelを直接GPT-4o/Claude 3に画像入力する方法はどうですか?
枠線・フローチャート・グラフ混在の解析精度は高くなりますが、「ページ区切りなしの大判Excelをそのまま画像化すると、画像の解像度がVLMの入力制約を超えて精度が落ちる」問題があります。アプローチ③(ページ区切り制御PDF)を経由してから画像化することで、各ページに最適化された解像度でVLMに渡せます。実用ではPDF経由が安全です。
Q4. 機密性の高いExcel文書をクラウドAIに渡すのが難しい場合の選択肢は?
オンプレ運用可能なOSSパイプラインで完結させます。openpyxl+yomitoku(日本語特化OCR)+LibreOffice+ローカルLLM(Qwen2-VL/Llama 3.2 Visionなど)を組み合わせれば、データを外部に出さずにExcel文書解析と要約・抽出までできます。社内GPUを共有する形が現実的で、業務OS側にはAPI経由でつなぐ構成にします。
Q5. 過去のExcel資産が数万件あります。どこから手を付ければいいですか?
全件を一度に処理しようとせず、業務頻度が高い帳票テンプレートから優先順位を付けるのが鉄則です。例えば見積書テンプレートが20種類あれば、案件件数の多い上位5種類だけRAG化するだけで業務時間短縮の8割を取れます。テンプレートごとに「アプローチ①でいけるか/②が必要か/③まで必要か」をマップ化し、対象テンプレート→アプローチ→検証の順で進めます。これは設計OS/品質OSの導入プロジェクトの典型的な進め方です。
関連記事:業務OSの最前線
- 業務OSとは何か——製造業ERPでもPLMでもない、第3の業務基盤の正体——Excel文書解析を業務OSの中に位置づける考え方の全体像
- 設計OSとは——図面・部品表・設計変更を一気通貫させる業務エージェント基盤——Excel仕様書をPLMの上位の業務層にどう昇格するか
- 【2026年最新】FMEA×生成AI完全ガイド|効率化の方法・支援ツール比較と品質OSへの組み込み——Excel帳票の代表例FMEAを業務OSに組み込む実践ガイド
次のアクション
Excel文書を生成AIで扱う技術は2026年時点で実用域に入っています。一方、本記事の3アプローチをそのまま単発スクリプトとして使うだけでは、現場の業務時間短縮効果は限定的です。業務OS(設計OS/品質OS)の前処理パイプラインとして組み込み、業務テンプレートと連動させることで、初めてExcel資産が「資産」になります。
SPESILLや設計OS/品質OSと自社のExcel帳票を組み合わせた構成検討にご関心があれば、業務診断(30分・無料)または設計OSページからご相談ください。


