AIが作ったExcelファイルが開けなかった ― 原因は「選択肢リストの引用符」と、日付チェックに紛れた数式のNaNだった
J-WORKSでは、AIが書いた設計データからExcelの商品ファイルを自動で生成している。生成したファイルがExcelで開けない問題を調べたところ、入力欄の選択肢リストの書き方と、日付の入力チェックに数式を渡したときの変換の2か所で、Excelが受け付けない中身が書き出されていた。2026年10月2日に原因を特定し、生成時の変換と、生成後の自動検査を加えた記録。
検証条件
J-WORKSでは、Excel形式の商品を作るとき、AIに「どのシートに、どんな表や計算式、入力のルールを置くか」という設計データを書かせ、その設計データからプログラムでExcelファイルを生成している。入力のルールとは、Excelの「データの入力規則」のことで、たとえば「この欄はリストから選ぶ」「この欄には今日以降の日付しか入れられない」といった制限である。生成したファイルは、さらに実際のExcelで開いて検証する流れになっている。ところが、生成したファイルが実際のExcelで開けない、という失敗が起きていた。
実行内容
まず、失敗の記録を見直した。これまでは「Excelそのものが起動できなかった」場合と「Excelは起動したがファイルを開けなかった」場合が同じ種類の失敗として扱われており、原因がパソコン側の環境にあるのか、生成したファイルの中身にあるのかを区別できなかった。そこで、この2つを別の失敗として記録し、エラーの文面も残すようにしたうえで、生成されたファイルの中身を調べた。Excelファイルは、中身が複数のXML(データを記述するテキスト形式)をまとめて圧縮したものになっている。この中の、入力規則を書いた部分を確認したところ、2種類の壊れ方が見つかった。
結果
1つ目は、リストから選ぶ入力規則の書き方である。選択肢を「A,B,C」のようにカンマで並べたとき、全体を引用符で囲まずに書き出すと、Excelはそれを選択肢の一覧ではなく、無効なセル参照として解釈してしまい、ファイルを開けなくなる。このことは、2026年10月2日に実機のExcelで確認した。2つ目は、日付の入力規則に数式を渡した場合である。設計データで「今日以降の日付」を表すために「=TODAY()」のような数式が指定されると、Excelファイルを書き出すライブラリが、その数式を日付として変換しようとして失敗し、本来日付が入るべき場所に「NaN」(数値ではない、という意味の値)を書き出していた。どちらも、Excelが受け付けない中身になる。
失敗原因
原因は、AIが書いた設計データの値を、Excelの決まりに合う形へ整えないまま、ライブラリへそのまま渡していたことにある。人間がExcelの画面で入力規則を設定する場合は、Excelが自動で正しい形に整えてくれるが、プログラムでファイルを直接書き出す場合は、その整形を自分で行う必要がある。AIは、人間が画面で入力するときと同じ感覚で「A,B,C」や「=TODAY()」と書くため、そのまま渡すと壊れたファイルになっていた。
改善
生成の処理に、2つの変換を加えた。リストの入力規則では、カンマを含み、引用符で囲まれておらず、セル参照でもない値だけを引用符で囲む。日付や時刻の入力規則に数式が渡された場合は、日付として変換させず、「任意の数式で判定する」種類の入力規則に置き換える。簡略化した例: 「選択肢 A,B,C → "A,B,C" として書き出す」「日付の入力規則で、今日以降 =TODAY() → 任意の数式の入力規則 A2>=TODAY() に置き換える」。さらに、設計データの検証の段階で、空の選択肢リストのような明らかに不正な値は、生成前に止めるようにした。そして、ファイルを書き出した後に、圧縮されたファイルの中のXMLを直接読み、「NaN」が残っていないか、引用符の無い選択肢一覧が残っていないかを自動で検査し、見つかった場合はファイルを削除して失敗として止めるようにした。あわせて、Excelが起動できないなど環境が原因の失敗では、商品づくりの試行回数を減らさずにやり直す扱いにした。
現在の結論
2026年10月2日の修正で確認できたのは、開けないExcelファイルの原因が、選択肢リストの引用符の欠落と、日付の入力規則に渡された数式のNaN化の2点だったこと、そして生成時の変換と生成後の自動検査を、自動テストで確認したことである。プログラムでExcelファイルを生成する場合は、画面で入力するときにExcelが自動で整えてくれている部分を、自分で整える必要があることに注意するとよい。また、生成したファイルをそのまま次の工程へ渡さず、書き出した中身を機械的に検査する段階を1つ挟んでおくと、壊れたファイルが利用者の手元に届く前に止められる。失敗を記録するときは、環境が原因の失敗と、作った物が原因の失敗を分けておくと、原因の切り分けが早くなる。同じような仕組みを作る場合は、(1)選択肢の一覧のように、Excelの画面では区切り記号だけで入力できるものが、ファイルの中ではどう書かれるべきかを確かめる、(2)日付や数値を期待する場所に、数式や文字列が渡されたときの動きを確かめる、(3)生成したファイルの中身を、実際のExcelで開く前に機械的に検査する、の3点を確認するとよい。
根拠
2026-10-02(JST)に実装し、同日に本体へ取り込んだコード修正の記録(変更内容とコミットメッセージ)と、その修正で追加した自動テストによる。