
あなたの神Excelは何点?~機械可読性ルール適合チェックツール「Harunobu」を試してみた~
概要
こんにちは、クラスメソッド製造ビジネステクノロジー部の田中聖也です。
デジタル庁が「行政データにおける機械可読性に関するルール」をコード化した判定ツール「Harunobu」を公開していると知って、製造現場でよく見かける印刷前提のExcelは何点取れるんだろうと気になったので試してみました!

準備
Harunobuとは
Harunobuは、デジタル庁のFact & Data Unitが開発し、GitHubで公開しているツールです。
ルールに沿ってExcelやCSVを点検し、違反している箇所とその理由を教えてくれます。使い方は3種類あります。
| 使い方 | 概要 |
|---|---|
| ブラウザ画面(Streamlit UI) | ファイルをアップロードして画面上で採点結果を確認する |
| コマンドライン(CLI) | harunobu analyze データ.xlsx のように実行する |
| Python API | プログラムに組み込んで呼び出す |
今回はブラウザ画面(Streamlit UI)を使います。
なお、公式ページには「ルールをベースにした実装例であり、判定ロジックがルールそのものではない」「機械的な判定が難しいルールは判定対象外」と書かれています。
環境
| 項目 | バージョン・内容 |
|---|---|
| OS | Windows |
| Python | 3.12.12 |
| パッケージ管理 | uv |
| Harunobu | 0.2.2 |
| Streamlit | 1.57.0 |
| AI判定補助機能 | 使用しない(OFF) |
AI判定補助機能(外部のAIサービスのAPIを使って判定を補う任意の機能)は、有効にしたときだけデータが外部に送信される仕組みです。今回はOFFのままで、ツール単体の機械的な判定だけで試しています。
セットアップ
READMEの手順どおり、uvでローカル起動しました。uvが入っていない場合は、先にPowerShellでインストールします。
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
リポジトリをクローンして、Streamlit UIを起動します。
git clone https://github.com/digital-go-jp/machine_readability_rule.git
cd machine_readability_rule
uv sync --extra ui
uv run streamlit run app.py
ブラウザが開いて、冒頭の画面が表示されれば準備完了です。
画面の流れと採点モード
画面左のワークフローは、アップロード→データプレビュー→レイアウト検出→チェック実行→採点結果の5ステップです。
チェック実行では3つのモードから選べて、モードによって対象になるルールのレベルが変わります。
| モード | 対象レベル | 内容 |
|---|---|---|
| 軽量チェック | レベル1 | 簡易チェック |
| 標準チェック(デフォルト) | レベル1とレベル2 | 構造とデータ品質のチェック |
| 詳細チェック | レベル1からレベル3 | 詳細分析 |
レベル1はセル結合・空白行・ヘッダーの有無といった「表の構造」、レベル2は数値列に文字列が混ざっていないかといった「データの品質」、レベル3は単位の記載や縦持ち形式かどうかといった、より踏み込んだ内容です。
採点は、レベルごとに100点からの減点方式で行われます。
検証に使うExcel
今回は、製造現場でよくある帳票を想定して3つのExcelを用意しました。
| ファイル | シート数 | 内容 |
|---|---|---|
| 生産日報.xlsx | 3 | 素直な表のベースライン(結合セルなし) |
| 設備日常点検簿.xlsx | 1 | 印刷前提の点検簿(結合セル312箇所) |
| 発注依頼書.xlsx | 13 | ポンプ部品の発注計画表と発注書(計算式・結合セル多数) |
やってみた
検証1: 生産日報(素直な表)
まずはベースラインとして、素直な表の生産日報で試してみます。
「生産実績」「担当者」「項目定義」の3シート構成で、どのシートも1行目がヘッダー、2行目以降がデータの形です。結合セルはありません。
↓が生産実績シートです。

↓が担当者シートです。

↓が項目定義シートです。項目ごとのデータ型や単位、説明を書いています。

ファイルをアップロードします。

データプレビューでは、シートを選んで中身を確認できます。生産実績シートは7行×9列で、結合セルは0箇所と表示されました。

レイアウト検出では、表の範囲を自動で推定してくれます。生産実績シートはA1:I7が1つの表として、検出精度100%で認識されました。表の外にあるセルも0件です。

チェックのレベルは、デフォルトの標準チェックのまま実行します。

結果は、レベル1が100点(36/36合格)、レベル2が100点(12/12合格)でした。違反箇所もありません!

シートごとに開くと、ルールごとの合否が見られます。L1-09(空白とゼロの区別)だけは「AIモードON時のみ判定」のため判定対象外になっています。

正直、素直な表なので100点は想定どおりでした。
ただ、実際の現場の日報にはセル結合がありそうなので、このファイルはかなり簡単な部類だと思っています。
検証2: 設備日常点検簿(印刷前提の神Excel)
次が本命です。
製造業で働いていた頃に自分が作っていた形式の設備日常点検簿で試します。
プレス機の日常点検簿で、紙に印刷して日ごとに〇をつけ、あとでExcelに転記する運用でした。
↓が点検簿です。タイトル、日付と曜日の見出し、点検項目、承認欄がすべて結合セルで綺麗に配置されています。

人間にとっては見やすい点検簿ですが、Harunobuにはどう見えるのでしょうか。
アップロードしてデータプレビューを見ると、40行×46列で、結合セルは312箇所と表示されました。

レイアウト検出の結果が↓です。

点検項目の列(A列)は「isolated(孤立したセル)」と判定され、日付が並んでいる部分だけがヘッダーとボディの入り混じった表(mixed)として認識されています。
検出された表はI1:AO7で、検出精度は61%でした。タイトルや点検項目のセルは、表の外のセル(Others)として13件が一覧に出ています。

そして採点結果です。

レベル1もレベル2も0点で、どちらも強制0点でした。理由は↓のとおりです。
| レベル | 強制0点の理由 | 画面上の内容 |
|---|---|---|
| レベル1 | L1-12(セル結合) | データ領域にセル結合が9件(ヘッダ領域2件、データ領域9件) |
| レベル2 | L2-03(各列が一意に識別可能な項目名を持っているか) | ヘッダー行が複数行にまたがり、項目名が特定できない |
強制0点にはならなかったルールの結果も見てみます。レベル1は12項目中8項目が合格で、不合格は次の4つでした。
| ルールID | 内容 | 検出結果 |
|---|---|---|
| L1-03 | データ分断チェック | データ範囲内に空白行が2件 |
| L1-04 | データ範囲外情報チェック | テーブル外のセルが13件 |
| L1-05 | 列ヘッダーチェック | 4列でヘッダーが欠落 |
| L1-12 | セル結合チェック | データ領域にセル結合が9件 |
違反は全部で66件(error 51件、info 2件、warning 13件)でした。
件数が多いので、画面上はシートと重大度単位で要約表示され、全件の詳細はJSONのダウンロードで確認する形になっています。

違反セルをシート上に重ねて表示する機能もあります。↓の赤枠がL1-12(セル結合)、黄色の枠がL1-04(表の外の情報)で、2行目から5行目あたりがごっそり赤くなっています。

検証3: 設備日常点検簿を機械可読な形に作り直してみた
強制0点の設備日常点検簿を、機械可読な形に作り直してみます。
今回は生成AI(Opus 5.5)に修正してもらいました。すると、元の点検簿とは全然違う形式になりました。
修正版は、「点検結果」「点検項目」「承認記録」の3シート構成です。結合セルも計算式も使っていません。
まず、点検項目シートです。9つの点検項目を、1項目1行で並べています。



ただ、この修正版は印刷して現場で〇をつける運用には向かないなと思います。
機械可読性と人間可読性(運用を含む?)は全然違うものだと、改めて感じました。
人間にとっての読みやすさはおそらく印刷前提の見た目で、機械にとっての読みやすさは縦持ちの解析しやすい形になるんだろうなと思いました。
Excelのままで良いものの、機械用と人間用で2つのシートに分けて管理した方が良さそうだと感じました。
検証4: 発注依頼書(難易度が高そうな帳票)
最後は、発注依頼書です。
13シート構成のブックで、メモ、単価表、月次の発注計画表(2611シート)、発注依頼書、原紙、業者ごとのシート、集計シートが入っています。実務でもよくある、「計画表から発注書を作る」タイプの帳票です。
↓が月次の発注計画表(2611シート)です。計算式で発注数を求めていて、結合セルも多く使われています。

アップロードすると、13シートが読み込まれました。↓はメモシートのプレビューです。

今回はレベル3まで見るため、詳細チェックで実行しました。結果は↓のとおりで、レベル1・2・3のすべてが強制0点でした。

| レベル | スコア | 合格数 | 強制0点の原因となったルール |
|---|---|---|---|
| レベル1 | 0点 | 234/324 | L1-02(1シート1表)、L1-12(セル結合) |
| レベル2 | 0点 | 54/105 | L2-01(数値データは数値属性とし、文字列を含まない)、L2-02(項目名等の省略をしていない)、L2-03(各列が一意に識別可能な項目名を持つ) |
| レベル3 | 0点 | 104/135 | L3-01(項目名行から始まり、次行からデータ入力がされている) |
2611シートだけでも3つの表として検出されているなど、1つのシートに複数の表が同居しているため、L1-02(1シート1表)から違反になっています。計画表と発注書が一体になった帳票は、やはり難しそうですね。
失敗1: 結果ダウンロードでTypeErrorが発生
発注依頼書の採点結果をJSONでダウンロードしようとしたところ、エラーが出ました。採点結果の画面自体は表示されていて、下部の「結果ダウンロード」で落ちている状況です。
TypeError: Object of type datetime is not JSON serializable

原因を調べてみると、Excel側の問題ではなくHarunobu側のバグでした。
- N2セルに日付(2025-03-10)が1つだけ、表の外にポツンと置かれていた
- Harunobuはそのセルをテーブル外のセル(others、isolated)として扱い、値をExcelから読んだdatetimeのまま保持していた
- 結果をJSONにする処理(
json_writer.py)でjson.dumpsにdefaultが指定されておらず、datetimeを文字列に変換できずに落ちた
発生する条件は、「日付セルがある」「それが表の外と判定される」「JSONでダウンロードする」の3つがすべて揃ったときです。生産日報と設備日常点検簿では出なかったので、たまたま踏まなかっただけですね。
日付を表の外にポツンと置くのは帳票ではよくある形なので、神Excelらしいレイアウトがツール側のバグを炙り出した例だと思います。
対処するなら、json.dumps にdefaultを渡して、datetimeやdateを isoformat() で文字列に変換する形になりそうです。
from datetime import date, datetime, time
def _json_default(o):
# 日付・時刻はISO 8601形式の文字列にする
if isinstance(o, (datetime, date, time)):
return o.isoformat()
# Decimalなどその他の型は文字列にフォールバック
return str(o)
# json.dumps(..., default=_json_default)
補足説明
4つのファイルの結果まとめ
| ファイル | モード | レベル1 | レベル2 | レベル3 |
|---|---|---|---|---|
| 生産日報 | 標準 | 100点 | 100点 | 未チェック |
| 設備日常点検簿 | 標準 | 0点(強制0点) | 0点(強制0点) | 未チェック |
| 発注依頼書 | 詳細 | 0点(強制0点) | 0点(強制0点) | 0点(強制0点) |
試してみて気づいたこと
- 最初の関門は、表の位置を推定するレイアウト検出でした。結合セルやタイトルの多い帳票は、ここで検出精度が下がり、その後のルール判定にも影響する。
- Harunobuの判定は、かなり厳しめである。GitHubの既知の制限事項にも、表の前のタイトル行はテーブル外(others)として分離され、L1-04の違反として報告されると書かれている(仕様どおりの動作)
- 採点結果のJSONには、違反箇所と理由がすべて入ります。READMEでは、Excelを直すときの参照や、AIへの修正指示書として使うことが想定されているので、AIに修正指示をするのがかなり楽でした。
- 100点を取ることが目的ではなく、「人間用の見た目」と「機械用のデータ」を分けて考えるきっかけになるツールだと感じました。
まとめ
生産日報は100点、設備日常点検簿と発注依頼書はどちらも強制0点という結果でした。
点検簿は縦持ちに作り直すと100点になる一方で、現場で使う見た目とは別物になるので、機械用と人間用でシートを分けて管理するのが良さそうだと感じました!
手持ちのExcelをAIで解読させる前に是非、試してみてください。








