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スプレッドシートで開いてから・・・ってのがあるらしい。未調査。