- 技術 💻
CSVをExcelで開くと先頭の0が消える|日付・指数表示の防ぎ方
CSV をダブルクリックで開くと、表計算ソフトは「数字に見える値」を数値に変えます。 そのため、00123 は 123 に、長い番号は桁が失われ、12/2 のような値は日付になります。CSV のファイル自体は壊れていません。開くときに変換されています。
| 元の値 | 開いたあと | 起きていること |
|---|---|---|
社員番号 00123 |
123 |
先頭の0が消える(数値になる) |
郵便番号 0600001 |
600001 |
同上 |
電話番号 09012345678 |
9012345678 |
同上 |
口座・カードなど19桁 1234567890123456789 |
1.23456789012346E+18 |
16桁目以降が失われる(数値の精度は15桁まで) |
品番 1E5 |
100000 |
指数(1×10の5乗)と見なされる |
12/2 |
日付(12月2日) | 日付と見なされる |
一度上書き保存すると、変換後の値で CSV が書き直されます。 0 が消えた CSV を別のシステムに取り込むと、データが壊れます。開いたら「上書き保存しない」が最初の対策です。
確認環境:同じ CSV を LibreOffice Calc 24.2 で数値として取り込み、変換される様子を再現しました。Excel の動作と設定は Microsoft の公式サポートページで確認しています(確認日 2026年10月10日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「CSVをExcelで開くと先頭の0が消える|日付・指数表示の防ぎ方」
再現:同じ CSV を開いたときの変化
社員番号,郵便番号,電話番号,JAN,品番,口座,カード
00123,0600001,09012345678,4901234567894,1-2,1234567890123456789,1E5
この CSV を、表計算ソフトで数値として取り込み、もう一度 CSV に書き出すと、次のようになりました。
社員番号,郵便番号,電話番号,JAN,品番,口座,カード
123,600001,9012345678,4901234567894,1-2,1.23456789012346E+018,100000
| 列 | 結果 |
|---|---|
| 社員番号・郵便番号・電話番号 | 先頭の0が消えた |
| 口座(19桁) | 指数表示になり、...6789 の部分が失われた(元に戻せない) |
カード 1E5 |
100000 に変わった |
開く側の対策:ダブルクリックで開かない
| 方法 | 手順(Excel for Windows) | 向いている場面 |
|---|---|---|
| データの取り込みで列を「文字列」にする | 「データ」→「テキストまたは CSV から」→「データの変換」→ 列を選んで、データ型を「テキスト」→「閉じて読み込む」 | 毎回同じ形の CSV を開く |
| 自動データ変換の設定を切る | 「ファイル」→「オプション」→「データ」→「自動データ変換」 | Microsoft 365・Excel 2024 を使っている |
| 入力するセルを先に「文字列」にする | セルを選んで Ctrl + 1 →「表示形式」→「文字列」 |
手で入力する場合(すでに入った値には効かない) |
先頭に '(アポストロフィ)を付けて入力 |
'00123 と入力 |
手で1件ずつ入れる場合 |
自動データ変換の4つの設定
Microsoft 365 と Excel 2024 では、「ファイル」→「オプション」→「データ」→「自動データ変換」で、次の変換を止められます(項目名は Microsoft の英語版ページの表記を訳したもの)。Microsoft の公式ページでも、CSV ファイルを開いたときの変換が対象とされています。
| 設定 | オフにすると |
|---|---|
| 先頭のゼロを削除して数値に変換する | 00123 を文字列のまま残す |
| 長い数値の最初の 15 桁を保持する | 16 桁以上の数値を文字列のまま残す(桁が失われない) |
| 文字 "E" を囲む数字を指数表記に変換する | 123E5 などを文字列のまま残す |
| 文字と数字の連続した組み合わせを日付に変換する | JAN1 などを文字列のまま残す |
12/2 のような数字だけの日付らしい値は、この設定では止まりません。 Microsoft の公式ページでも「日付への変換を止める方法は無い」とされ、文字列の書式にしておく、先頭に ' を付けるなどの方法が案内されています。CSV を開く場合は、上の「データの取り込みで列を文字列にする」方法を使います。
消えた0を「見た目だけ」戻す方法と、その限界
| 方法 | 結果 |
|---|---|
表示形式「ユーザー定義」で 0000000 |
郵便番号のように桁数が決まっている値なら、0 を付けて表示できる。値そのものは数値のまま |
=TEXT(A2,"0000000") |
0 を付けた文字列を別の列に作れる |
| 16桁以上の番号 | 失われた桁は戻らない。元の CSV から取り込み直す |
桁数が決まっていない社員番号(0123 と 00123 が両方ある、など)は、見た目では区別できません。元の CSV から取り込み直します。
出力する側の対策:受け取る人が何もしなくても崩れない形で渡す
CSV を出力するシステムの側で手を打てば、受け取る人の操作に頼らずに済みます。
| 渡し方 | 先頭の0・桁 | 他のシステムでの読み込み | 向いている場面 |
|---|---|---|---|
| xlsx で、文字列のセルとして出す | 崩れない | xlsx を読めるなら問題ない | 人が Excel で見るのが主な用途 |
CSV で ="00123" の形にする |
Excel では崩れない | ="00123" という文字のまま読まれる |
Excel で見るだけの CSV |
| CSV のまま、取り込み方を案内する | 開き方しだい | 問題ない | システム間の連携にも使う CSV |
xlsx で、文字列のセルとして出す(Python)
from openpyxl import Workbook
rows = [("社員番号", "郵便番号", "電話番号", "JAN", "品番", "口座番号", "金額"),
("00123", "0600001", "09012345678", "4901234567894", "1-2", "1234567890123456789", 12800)]
wb = Workbook()
ws = wb.active
for r, row in enumerate(rows, start=1):
for c, v in enumerate(row, start=1):
cell = ws.cell(row=r, column=c, value=v) # str はそのまま文字列として書かれる
if isinstance(v, str):
cell.number_format = "@" # 書式も「文字列」にしておく
wb.save("output.xlsx")
読み込み直した結果(openpyxl 3.1.5)
('00123', 's', '@') ('0600001', 's', '@') ('1234567890123456789', 's', '@') (12800, 'n', 'General')
↑ s = 文字列のセル、@ = 書式「文字列」。金額は数値のまま
この xlsx を表計算ソフトで開いて CSV に書き出しても、00123,0600001,...,1234567890123456789,12800 のまま崩れませんでした。番号は文字列、金額や数量は数値と、列ごとに型を分けて書くのがポイントです。番号まで数値で書き込むと、xlsx でも 0 は消えます。
CSV で ="00123" の形にする
社員番号,郵便番号
="00123",="0600001"
表計算ソフトは ="00123" を「文字列 00123 を返す式」として扱うため、0 が消えません。確認環境でも、表示は 00123・0600001 のままでした。
ただし、この CSV を他のプログラムで読むと、="00123" という文字がそのまま入ります。
import csv
print(next(csv.reader(open("eq.csv", encoding="utf-8")))[:2]) # 2行目
# ['="00123"', '="0600001"']
システムへの取り込みにも使う CSV では使わず、「Excel で見る用」と「システム連携用」を別のファイルにするのが安全です。
文字化けも一緒に起きるとき
日本語が文字化けする場合は、文字コード(UTF-8 か Shift_JIS か、BOM の有無)の問題で、0 が消える問題とは別の原因です。「データの取り込み」で開くと、文字コードも列の型も指定できるため、両方を一度に防げます。
確認の手順(チェックリスト)
| 順番 | 確認すること | 方法 |
|---|---|---|
| 1 | CSV 自体に 0 があるか | メモ帳などのテキストエディタで開いて見る |
| 2 | 上書き保存していないか | 保存していたら、元の CSV を取り直す |
| 3 | 開き方 | ダブルクリックではなく「データの取り込み」で列を文字列に |
| 4 | Excel の版 | Microsoft 365・2024 なら自動データ変換の設定 |
| 5 | 出力する側で直せるか | xlsx で文字列のセルとして出す |
| 6 | 16桁以上の番号 | 数値にした時点で桁が失われる。必ず文字列で扱う |
よくある質問
Q. 一度消えた 0 は戻せますか。
A. 郵便番号(7桁)のように桁数が決まっていれば、=TEXT(A2,"0000000") で戻せます。桁数が決まっていない番号や、16桁以上の番号は、元の CSV から取り込み直します。
Q. 全部の列を文字列にすると、金額の合計が出せなくなりませんか。
A. なります。文字列にするのは番号の列(社員番号・郵便番号・電話番号・JAN・口座番号など)だけにします。上の Python の例では、金額は数値(12800、型 n)のまま書いています。
まとめ
- 0 が消えるのは CSV ではなく、開いたときの変換。上書き保存すると CSV も壊れる
- 16桁以上の番号は、数値にした時点で桁が失われ、戻せない
- 開く側は「データの取り込み」で列を文字列に。Microsoft 365・2024 は自動データ変換の設定も使える
12/2のような日付らしい値は、設定では止まらない。文字列として取り込む- 出力する側はxlsx で文字列のセルとして出すのが確実。
="00123"は Excel で見る専用 - 番号は文字列、金額は数値と、列ごとに型を分ける
参考・出典
確認日はいずれも 2026年10月10日です。
- Microsoft サポート「Set automatic data conversions」:https://support.microsoft.com/en-us/office/33d1d872-9926-4ef3-9364-492444d0c7ea
- Microsoft サポート「Keeping leading zeros and large numbers」:https://support.microsoft.com/en-us/office/keeping-leading-zeros-and-large-numbers-1bf7b935-36e1-4985-842f-5dfa51f85fe7
- Microsoft サポート「Stop automatically changing numbers to dates」:https://support.microsoft.com/en-us/office/stop-automatically-changing-numbers-to-dates-452bd2db-cc96-47d1-81e4-72cec11c4ed8
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「CSVをExcelで開くと先頭の0が消える|日付・指数表示の防ぎ方」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。