起きていることは 2 つあります。長い数字が 4.02177E+19 と表示されるのは表示形式の問題であることもあり、列幅を広げるか表示形式を「数値」にすれば変わります。しかし Excel は CSV を開くときに値そのものも変換します。数値セルが保持できるのは有効桁数 15 桁までで、先頭の 0 は数値の一部とみなされません。すでに置き換わった桁は、書式を変えても戻りません。値を残すには、Excel が変換する前に文字列セルにしておく必要があります。該当する列を「文字列」として取り込むか、CSV を Excel に変換するツールが既定で作るような、最初から文字列セルになっている XLSX を開いてください。
ID やコードが並ぶファイルを Excel はどう変えるか
CSV ファイルはセルの型を持たないただのテキストです。そのためダブルクリックで開くと、Excel は値ごとに数値・日付・文字列のどれかを推測します。下の架空のファイルには、この推測で誤って扱われやすい値を集めました。
| 値の種類 | CSV の中身 | Excel で CSV を開いた場合 | ViewCSV の XLSX のセル |
|---|---|---|---|
| 先頭が 0 のコード | 00412 | 412 | 00412 |
| 20 桁の受注番号 | 40217730091152400016 | 4.02177E+19 | 40217730091152400016 |
| その次の受注番号 | 40217730091152400017 | 4.02177E+19 | 40217730091152400017 |
| + 付きの電話番号 | +15550100234 | 15550100234 | +15550100234 |
| 日付に見える品番 | 3-12 | 12-Mar | 3-12 |
| E を含むロット番号 | 12E3 | 1.20E+04 | 12E3 |
| 数式に見える備考 | =SUM(F2:F3) | 17 | =SUM(F2:F3) |
2 つの受注番号はどちらも 4.02177E+19 と表示されますが、これは表示上の話にすぎません。内部では先頭 15 桁しか残っていないため、2 つのセルはどちらも同じ値 40217730091152400000 を持っています。列幅を広げても見えるのは元の数字ではなくこの 0 で、VLOOKUP や重複チェックでは 2 件の注文が 1 件として扱われます。
この行は変換ツールのサンプルと同じです。CSV をダウンロードし、お使いの Excel で開いて見比べてみてください。
指数表示は見た目だけ、失われた桁は本当に消えている
4.02177E+19 は、表示形式が「標準」で列幅が足りないときに大きな数値をこう表示しているだけで、列幅を広げるか表示形式を「数値」にすればもっと多くの桁が見えます。本当の損失はその前に起きています。Excel は数値を有効桁数 15 桁の精度で保存するため、変換の時点で 16 桁目以降はすべて 0 になります。16 桁のカード番号や口座番号なら、最後の 1 桁がすでに失われています。
- 先頭の 0 が消えるのは、
00412と412が数値としては同じだからです。00000のようなユーザー定義の表示形式で 5 桁に見せることはできますが、セルの値は 412 のままで、桁数がまちまちのコードはこの方法では戻せません。 - 桁数の多い ID は 16 桁目以降がすべて失われます。変換後に保存されたファイルからは、書式でも関数でもツールでも取り戻せません。
3-12や12E3のようなコード は日付や指数表記の数値になり、元の文字列はセルに残りません。=で始まる値 は数式として扱われ、計算結果に置き換わります。
代わりに文字列セルの XLSX を作る
CSV と違い、.xlsx ブックはセルごとに型を保存しており、文字列セルは書かれたとおりに Excel に表示されます。CSV を Excel に変換するツールは、既定ですべての値を文字列セルとして書き込みます。処理はブラウザー内で行われ、ファイルはアップロードされません。
- CSV を Excel に変換するツールで CSV を開きます。上の行で試すなら サンプルで試す を選びます。
- 入力 の表を確認します。ID、先頭の 0、コードがファイルのとおりに表示されています。
- 値の型 は すべての値を文字列のまま扱う のままにします。
- XLSX をダウンロード を選び、ブックを Excel で開きます。
ブックでは 00412、2 つの受注番号の 20 桁すべて、+15550100234、3-12、12E3、=SUM(F2:F3) がいずれも文字列セルです。数式のような値もただの文字列として保存されるので、ファイルを開いても計算されません。数字に見える文字列には Excel が小さな緑の三角(「文字列として保存されている数値」)を付けることがありますが、値は変わりません。
quantity や unit_price で計算したい場合は、Excel で列ごと変換するのではなく次の節を読んでください。Excel でまとめて変換すると、うっかり選んだ ID 列まで変換されてしまいます。数値として計算もしたい場合
数値と true/false を判定する は、列のすべての値が Excel でそのまま保存できる単純な数値である場合にだけ、その列を数値にします。サンプルでは quantity と unit_price が数値になり、customer_id(先頭の 0)、order_ref(15 桁超)、part_code、note は文字列のまま残ります。
判定は値の意味ではなく書き方を見て、列単位で行われます。+15550100234 のような値だけの列は符号付きの整数、12E3 のような値だけの列は指数表記と読めるため、サンプルでも phone と lot_code は数値になってしまいます。こうしたファイルでは既定のままにして、数量のセルだけを Excel で変換してください。セルを選び、エラー アイコンから 数値に変換する を選びます。
Excel で CSV から始めるしかない場合
変換したブックが使えないときは、CSV をダブルクリックせずにインポートし、読み込む前に危ない列を「テキスト」に設定します。現在の Microsoft 365 版 Excel なら、データ > テキストまたは CSV から > データの変換 と進み、自動で追加される 変更された型 ステップを削除して、ID の列をテキストにしてから読み込みます。この手順と従来のテキスト ファイル ウィザードは、CSV ファイルを Excel にインポートする方法で説明しています。
最近の Microsoft 365 版 Excel と Excel 2024 には、データのオプションに「自動データ変換」の設定があり、先頭の 0、桁数の多い数字、E を含む表記、日付に見える文字列の変換を止められます。どの項目があり、どう呼ばれるかはバージョンとプラットフォームによって異なります。また、変わるのは自分の Excel の設定だけで、同僚の Excel には影響しません。
値を守ってくれない方法
- 値を囲む二重引用符(
"00412")は、CSV を読むプログラムに値の始まりと終わりを伝えるだけです。引用符で囲まれた数字も Excel は同じように変換します。 - UTF-8 の BOM は、Excel が日本語などの文字を正しく読むのに役立ちますが、セルの型には関係しません。
- 開いたあとで列を「文字列」にする のでは遅すぎます。変換はすでに終わっています。
="00412"のような数式で囲む方法 は、数式を計算する表計算ソフトでしか効きません。ほかの CSV リーダー、データベース、スクリプトには="00412"という文字列がそのまま渡るため、ファイルのデータはもう ID ではなくなります。- 先頭のアポストロフィ(
'00412)は数式ではありません。Excel で入力すると文字列の目印になり、表示はされません。ところが CSV ファイルの中ではただの文字で、ほかのプログラムには'00412という値が渡ります。 - XLSX の本物の文字列セル なら、余計な文字なしで
00412という値をそのまま保持できます。変換ツールが書き込むのはこの形式で、ViewCSV は数式の囲みもアポストロフィも付けません。
制限
変換ツールが扱えるのは最大 25 MB、100,000 行、250 列、200 万セルまでで、1 ブックに 1 シートです。丸められた ID や消えた 0 のまま保存されたファイルは、変換しても直りません。元のシステムからもう一度エクスポートしてください。ViewCSV のテストでは、生成した XLSX のセルの型を独立した読み取りツールで確認しています。各バージョンの Excel が画面上でどう表示するかは異なる場合があります。
出典
Microsoft のドキュメントを独自の言葉で要約しています。メニュー名はお使いの Excel のバージョンによって異なる場合があります。