PHP、Excel: CSVの「0から始まる数字」の最初の「0」が消えるのをどうにかしたい

作成日:2021-10-21, 更新日:2021-10-21

やりたいこと

  1. プログラムでCSVをダウンロード
  2. Excelで開く

問題点

CSVをExcelで開くと「09012345678」という値が「9012345678」となる

対策

「09012345678」が数字だけだから「9012345678」のように数値として認識される
だから、数値として認識されないようにすればOK

・Excelでインポート時に対応
・プログラム側で対応
・その他

Excelでインポート時に対応

余計なことを何も考えなくていい。

Excelのバージョンによって手順が異なるので概要だけ。

・インポートするときに対象となる列の書式を「文字列」にする
※他の書式でもいけるかも?

プログラム側で対応

・対象箇所を「=""」で囲めばOKらしい
・Excelには数式として値が格納されるので、そこを気にしないなら問題無し・・・

Excelで表示したいのが「丸ごとシマウマ,001,350」の場合

CSVは下記のいずれかになる感じ

値を単純にCSVにする 丸ごとシマウマ,="001",350
一部の値を「"」で囲む場合 "丸ごとシマウマ","="""001""",350
すべての値を「"」で囲む場合 "丸ごとシマウマ","=""001""","=""350"""

※各値を「"」で囲む場合は「"」をExcel用のエンコードをする必要があるので「""」にする

PHPの場合(一例)

条件分岐とか考えるのが面倒なので、すべての値を「"」で囲む方針。

$filename = '〇〇〇.csv';
$list = array( // 「0」からはじまる数字は「=""」で囲む→Excel用のエンコードが必要なので「=""""」
  array('鳥精','=""001""','120',),
  array('砂ぎも','=""002""','110',),
  array('なんこつ','=""003""','120',),
  array('豚精','=""010""','120',),
  array('豚レバー','=""011""','110',),
  array('丸ごとシマウマ','=""020""','130',),
);

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);

$fp = fopen('php://output', 'w');

$csv = '';
foreach ($list as $fields) {
  mb_convert_variables('SJIS-win', 'UTF-8', $fields); // 文字化け対策
  $fix_fields = array_map(function($value){ return '"'.$value.'"'; }, $fields); // ダブルクォーテーションで囲む
  $csv .= implode(',', $fix_fields) . "\r\n";
}
fwrite($fp, $csv);
fwrite($fp, "\r\n");
fclose($fp);

exit;

その他

・Googleスプレッドシートで開いてから・・・ってのがあるらしい。未調査。