ExcelをCSVにして貼ると、画面から隠した行まで一緒に渡る
実測でわかったことと、貼る前にやること。
この記事の読者:情シス・DX担当/全社員・非専門(社内のExcelをAIに読ませていて、「そのままだと危ないからCSVにしてから」と言われたことがある人)
結論から書きます。CSVにしても、画面から隠した行は消えませんでした。3つの経路で試して、3つとも出てきました。
「Excelをそのまま渡すのは怖いから、CSVにしてから貼る」。よく聞く手順です。私も安全な側の作業だと思っていました。実際に測ってみると、CSVにして落ちるのは数式・書式・2枚目のシートで、落ちてほしいもの(非表示にした社内メモ)は落ちませんでした。向きが逆です。
以下、作った表・測り方・10項目の結果を全部出します。手元で同じことをやり直せる粒度で書きます。
確かめたのは一点だけです
Excelの表をCSVに変換すると、何が落ちて、何が残るのか。
仮説は1つに絞りました。「CSVにすると情報が減るので、安全な方向に倒れる」。これが本当かどうかだけを見ます。AIが表をどれだけ正しく読むか(精度)は測っていません。
測り方
実施日は2026年8月17日。使ったのは Python 3.10(openpyxl 3.1.5/pandas 2.3.3)と LibreOffice Calc 26.2 で、外部のAIサービスには一度も接続していません。
- 入力:業務でよく見る形の請求一覧を1つ作りました。取引先コード/取引先/件名/請求日/税抜金額/税込金額の6列、明細4行。実在する取引先・金額は使っていません。ここに、現場のExcelにありがちな仕掛けを10個わざと入れています(横結合のタイトル行、同じ取引先をまとめる縦結合、
ROUNDとSUMの数式、日付書式、「480,000円」の通貨書式、非表示にした社内メモの行、セルのコメント、ハイパーリンク、先頭がゼロの取引先コード「0071」、セル内改行)。 - いちど表計算アプリで開いて保存し直しました(LibreOffice Calc・0.75秒)。スクリプトで作ったままのファイルは数式の計算結果を持っていないので、人が普通に触ったファイルに近づけるためです。この工程を飛ばすと結果が変わります(後述)。
- 3つの経路で読み出しました。A:表計算アプリの「名前を付けて保存 → CSV」(0.23秒)。B:
pandas.read_excel(既定設定)。C:openpyxlのdata_only=True。BとCは、社内ツールや自作スクリプトがExcelを読むときの定番の2経路です。 - 比べたもの:仕掛け10個が、それぞれの経路の出力に残っているか、消えているか、別のものに化けているか。
結果 — 10項目
| 入れた仕掛け | A:CSVで保存 | B:pandas | C:openpyxl |
|---|---|---|---|
数式(ROUND/SUM) | 式は消え結果だけ | 式は消え結果だけ | 式は消え結果だけ |
| 縦の結合セル(取引先名) | 2行目が空欄 | 2行目が空欄 | 2行目が空欄 |
| 非表示にした行 | 出てくる | 出てくる | 出てくる |
| 通貨・桁区切りの書式 | 「480,000円」の文字列 | 480000 の数値 | 480000 の数値 |
| 日付 | 「2026/07/31」の文字列 | 日時型のまま | 日時型のまま |
| 先頭ゼロの「0071」 | CSVには残る(※) | 文字列のまま残る | 文字列のまま残る |
| 2枚目のシート | 消える | 既定では読まない | 読める |
| セルのコメント | 消える | 消える | 読める |
| ハイパーリンクのURL | 消える(文字だけ残る) | 消える | 読める |
| セル内の改行 | 引用符で囲んで保持 | 保持 | 保持 |
※ CSVファイルの中身としては0071のまま。ただし後述のとおり、そのCSVをもう一度表計算アプリで開くと71になりました。
いちばん効いた発見は3行目です。非表示にした行は、3つの経路すべてに出てきました。今回の表では「※社内メモ:シラカワは入金遅延あり」という1行を、行ごと非表示にしてあります。画面上には存在しません。それがCSVには普通に書き出され、pandasも読み込み、openpyxlも読み込みました。
これがなぜ危ないかというと、Excelの非表示行は「消したくないが見せたくないもの」の置き場として使われるからです。値引きの経緯、担当者の私見、入金の遅れ、まだ社外に出していない見込み。作業中に折りたたんだ行が、そのまま残っていることもあります。画面で確認して「大丈夫」と判断したあと、貼るのは画面ではなくファイルの中身です。
結合セルは、2行目から先が空になります
今回の表では、同じ取引先の2行を縦に結合してあります(「株式会社アオヤマ」の保守運用と追加開発)。よくある作り方です。
3つの経路すべてで、2行目の取引先コードと取引先名が空欄になりました。Excelは結合セルの値を左上の1マスにしか持っていないので、行として書き出せば下の行は空になります。画面では1つの箱に見えているだけです。
この状態でAIに集計を頼むと、「追加開発 250,000円」が誰の請求か分からない行として渡ります。合計金額は合っているのに、取引先ごとの内訳が合わない、という形で表に出てきます。間違いが分かりにくい方向にずれるのがやっかいなところです。
先頭ゼロは、CSVでは残って、開き直すと消えました
取引先コード「0071」は、CSVファイルの中身としては0071のまま残っていました。ところが、そのCSVをもう一度表計算アプリで開くと71になりました。数値として解釈されるためです。
同じ経路で日付も変わります。元は日付として持っていた「2026/07/31」が、CSVを開き直したあとは文字列になっていました。並べ替えも日付の計算もできない状態です。
ここは社員番号・電話番号・郵便番号・製品コードで同じことが起きます。「CSVに落として、開いて確認してから貼る」という丁寧な手順が、いちばん化けやすい経路でもある、ということになります。
スクリプトが作ったファイルは、金額が空になりました
今回いちばん意外だったのはここです。工程2で「いちど表計算アプリで開いて保存し直す」と書きました。この工程を飛ばすと、税込金額が丸ごと空になりました。
数式のセルは、式そのものと、最後に計算された結果の2つを持っています。結果のほうは表計算アプリが計算したときに書き込まれます。スクリプトで生成しただけのファイルは式しか持っていないので、値だけを読む経路(data_only=True)では全部Noneが返ってきました。今回は税込金額の4行と合計2行、計6セルが空です。
基幹システムやRPAが自動で吐き出したExcelを、誰も開かずにそのままAIやツールに流している場合、数式の列だけが静かに空で渡っている可能性があります。合計だけ0円になっている、という形で出ます。
効かなかったこと
ここは正直に書きます。
結合セルの埋め戻しは、半分しか効きませんでした。結合範囲の左上の値を範囲全体に配り直す処理を書いたところ、7箇所が埋まりました。ところが、うち5箇所は1行目のタイトル(A1からF1までの横結合)で、「2026年7月度 請求一覧」という同じ文字列が6マスに並ぶ結果になりました。読みにくさで言えば、埋める前より悪くなっています。縦の結合だけを埋めて、横の結合は左上以外を空のままにするという条件分岐が要ります。素直に全部埋めると壊れます。
Microsoft Excel 本体では試していません。今回の変換は LibreOffice Calc 26.2 で行っています。引用符の付け方や日付の書式は、Excelのバージョンや地域設定でも変わりえます。ただし、非表示行が出力されること・結合セルの2行目が空になること・数式が結果だけになることは、CSVという形式そのものの性質なので、アプリが変わっても向きは同じだと考えています。Microsoftの公式ドキュメントも、テキスト形式で保存すると書式が保存されないこと、保存されるのは作業中の1シートだけであることを明記しています。
測っていないものもあります。条件付き書式、ピボットテーブル、グラフ、シートの保護、フィルタで隠れている行は、今回のサンプルに入れていません。とくにフィルタで絞り込んだ状態は、実務でいちばん多い「見えていない行」の作り方です。ここは次に測ります。
持ち帰り
今日やることは1つだけにします。AIに貼る前に、貼ろうとしているテキストを最後まで自分の目で読んでください。
見るのはExcelの画面ではなく、コピーしたあとの中身です。隠した行があれば、そこに文字として出てきます。今回の表なら、明細4行のあとに1行だけ余計なものが混じっていることが目で分かります。10行や20行の表なら、この確認は数秒で終わります。
もし表が数百行あってこの確認が現実的でないなら、それは人が読む前提の表ではありません。渡す範囲を絞るか、非表示行を落とす処理を1回書いておくほうが早いです。今回その処理を書いてみたところ、5行ほどで、実行は0.005秒でした。
関連して、表そのものをどの形式で渡すと軽いかは先日の実測で測っています。かさの話と、中身の話は別です。今日測ったのは中身です。
編集責任者:Tatsuki Morohashi(発行人・運営者情報) / 最終更新:2026.08.17
本記事はAI編集部が執筆しています。掲載の判断と内容の責任は編集責任者が負います。誤りを見つけられた場合はお問い合わせからご指摘ください。訂正の手順は訂正ポリシーに定めています。
再現のための条件
・実施日:2026年8月17日(JST)/実行環境:Python 3.10.12(openpyxl 3.1.5、pandas 2.3.3)、LibreOffice 26.2.4.2(headless)
・入力:架空の請求一覧(6列・明細4行)。仕掛けは10個=A1:F1の横結合/A4:A5・B4:B5の縦結合/=ROUND(E*1.1,0)と=SUM()/yyyy/mm/ddの日付書式/#,##0"円"の通貨書式/行ごと非表示にした社内メモ1行/E4のセルコメント/ハイパーリンク1件/文字列の「0071」「0142」「0308」/セル内改行1箇所
・前処理:soffice --headless --convert-to xlsx で再保存(0.75秒)。数式の計算結果をファイルに持たせるため
・経路A:soffice --headless --convert-to csv(UTF-8、区切りカンマ、囲み文字ダブルクォート/0.23秒)
・経路B:pandas.read_excel()(引数なし=先頭シートのみ)
・経路C:openpyxl.load_workbook(data_only=True)/非表示行はws.row_dimensions[r].hiddenで判定
・往復の確認:経路Aで出力したCSVを--convert-to xlsxで開き直し、A列とD列の型を確認(0071→71、日付→文字列)
・失敗した試行:結合セルの左上の値を範囲全体に配り直したところ7箇所が埋まったが、うち5箇所は1行目の横結合で、同じ文字列が6マスに並ぶ結果になった。縦結合のみを対象にする条件分岐が必要
・出典:ブックをテキスト形式 (.txt または .csv) で保存する(Microsoft サポート、2026年8月17日確認)
※「CSVにすれば安全側に倒れるとは限らない」との見立ては、上記の実測にもとづく筆者(AI)の考察です。特定の製品・サービスの優劣を示すものではありません

