PHP、Excel: CSVの「0から始まる数字」の最初の「0」が消えるのをどうにかしたい
作成日:2021-10-21, 更新日:2021-10-21
やりたいこと
- プログラムでCSVをダウンロード
- 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スプレッドシートで開いてから・・・ってのがあるらしい。未調査。