一文で言えば、CSVはカンマ区切りのテキストファイルで、XLSXは表計算ソフトにしか読めないXMLをZIPで固めたものです。 実際の違いのほとんどは、ここから説明がつきます。
本当に知りたいのは「どちらが優れているか」ではありません。「このファイルを誰に渡すのか、そして途中で何が失われずに済むのか」です。
結論を先に
- プログラムにデータを渡す(インポート、API、スクリプト、データベース):CSV。
- 人に書類として渡す(書式、数式、複数シート):XLSX。
- ファイルが大きい(目安は100MB超、または50万行超):CSV。
- 値を入れたとおりに戻したい(郵便番号、商品コード、電話番号、長いID):CSV。ただし、その旨を必ず伝えてください。値を壊すのは受け取る側の表計算ソフトだからです。
それぞれの正体
CSVは、1行が1レコードで、値をカンマで区切り、カンマを含む値は引用符で囲みます。テキストエディタで読めますし、echoでも書けます。仕様としてはRFC 4180がありますが、その一部は無視するのが暗黙の了解になっています。国によって区切り文字が違うのも、壊れたCSVが独立したテーマになるのもそのためです。
保存されるのは値だけです。型も、書式も、数式も、色も、2枚目のシートもありません。007と入力されたセルと数値の7のセルは、書き出した時点で区別がつきません。どちらも2つのカンマの間にある文字でしかなく、その後どうなるかは読み込む側に完全に左右されます。
XLSXはZIPアーカイブです。拡張子を.zipに変えて展開すると、XMLのフォルダが現れます。ワークシートごとに1ファイル、共有文字列テーブル、スタイルテーブル、リレーションシップのファイルなどです。表計算ソフトが扱うものはすべて保存されます。セルの型、表示形式、数式とそのキャッシュされた計算結果、グラフ、条件付き書式、ウィンドウ枠の固定、.xlsmならマクロも含まれます。
並べて比較
| CSV | XLSX | |
|---|---|---|
| ファイルの種類 | プレーンテキスト | 圧縮されたXMLアーカイブ |
| 行数の上限 | なし | 1シートあたり1,048,576行 |
| 列数の上限 | なし | 16,384列 |
| 複数シート | 不可 | 可 |
| 数式 | 不可 | 可 |
| 書式、グラフ | 不可 | 可 |
| データ型 | なし(すべてテキスト) | セルごとに明示 |
| サイズ(100万行 × 10列) | 約150MB | 約40MB |
| テキストエディタで開ける | 開ける | 開けない |
| 20年後も読めるか | ほぼ確実 | おそらく |
| gitでの差分 | きれいに出る | まったく見られない |
この表のうち2行は補足が必要です。
サイズと、答えが逆転する理由
XLSXは圧縮されるので、同じデータならディスク上では小さくなるのが普通で、3〜4倍小さいことも珍しくありません。そのため大きなデータにCSVは不向きに見えますが、実際は逆です。
大きなファイルで重要なのは、ディスク上のサイズではなく、開くときに何が起きるかです。XLSXは、1行目が見えるようになる前に、解凍してオブジェクトモデルへ解析する必要があり、全体がメモリに載ります。CSVは1行ずつ読めるので、メモリに収まらない5GBのファイルでもストリーミングで処理できます。「このファイルをDuckDBで処理する」という解説がどれもCSVから始まるのは、このためです。上の行数の上限が効いてくるのも同じ理由で、300万行のエクスポートは、サイズに関係なく1シートのXLSXにはなりえません。
型と、データを食いつぶす往復
実際に手間を増やすのは、この違いです。
CSVには型がないので、表計算ソフトはインポート時に推測するしかありません。その推測は一貫していて、しかも一貫して次の4通りに間違います。
01234が1234になる:郵便番号の先頭のゼロが消えます。4019283746501928が4.01928E+15になる:IDが指数表記になり、下の桁は隠れたのではなく失われます。3/4/2026が、ロケールによって3月4日にも4月3日にもなる。MAR1、SEPT2、DEC5が日付になる。このせいで、2020年には遺伝子研究者がヒトの遺伝子27個の名前を変更しました。
CSVをExcelで開いてCSVとして保存し直すと、これらの変更はファイルに恒久的に残ります。CSVがデータを失ったのではありません。開いた表計算ソフトが失わせたのです。 だからこそ、CSVは表計算ドキュメントとしてではなく、CSVとして読むツールで読む意味があります。
ファイルをインポートせず、CSVとして読み込みます。型の自動変換も、ロケールによる日付の推測もありません。書かれたままの値に対して、SQLや普通の言葉で質問できます。
できること状況別の選び方
CSVを使う場合:
- 相手が自動化されたもの(データベースへのインポート、スクリプト、API)である。
- ファイルが大きい、または増え続ける。
- データをバイト単位で正確に往復させたい。
- バージョン管理に入れて、変更点を確認したい。
- ソフトウェアの前提なしに、10年後も読めるようにしたい。
XLSXを使う場合:
- 人が開き、レイアウトも伝える内容の一部である。
- 数式を生かしたままにしたい。
- データが本当に複数シートで構成されている。
- セルの型が重要で、何で開かれるかをこちらで制御できない。これがXLSXを選ぶ正直な理由です。受け取る側が間違えようのない型を持てます。
- グラフ、フィルター、条件付き書式をファイル内に持たせたい。
どちらも使わない場合:データが表計算ソフトの手に余る大きさで、何度も問い合わせる場合です。これはParquetやデータベースの出番です。Parquetは列指向で、型があり、圧縮されており、DuckDBもpandasもそのまま読めます。
よくある誤解
「CSVはExcelの形式だ」:違います。Excelはただ開けるだけで、そのせいで上のような型の変換が起きます。CSVはExcelより20年ほど古い形式です。
「XLSとXLSXは同じもの」:XLSは2007年より前のバイナリ形式で、古いシステムから今も出てきます。XLSXはOOXMLによる後継です。.xlsを渡されたら変換してください。最近のExcelでも警告付きで開き、完全に拒否するツールもあります。
「XLSXは本物の形式だから安全だ」:XLSXにはマクロ、外部リンク、DDEペイロードを含められます。CSVは動かないテキストですが、数式インジェクションだけは別で、=、+、-、@で始まる値は、開いた表計算ソフトに実行されます。どちらも注意が必要で、向きが違うだけです。
「変換しても何も失われない」:XLSXからCSVにすると、すべての数式(最後に計算された値は残ります)、2枚目以降のシート、書式がなくなります。CSVからXLSXにすると、データにはなかった型が付き、そこで値が壊れます。スマホでCSVをExcelに変換するでは、壊さずに行う方法を紹介しています。
身につけたい習慣は一つだけ
コード、ID、日付を含むCSVを送るときは、メッセージにひと言添えてください。「インポート機能で開いて、ID列を文字列に設定してください」。メール2行で、オフィス業務で最も多いデータ品質の事故を防げます。形式の選び方だけでは防げません。