~ダブルクリックでMicrosoft社Excelで文字化けせずに開けられる文字コードUTF-8のCSVファイルをPHPで生成する。
また、セル内に半角ダブルクォートを入れる。
文字化けしないUTF-8のCSVファイル
普通にPHPでUTF-8のCSVファイルを生成してダウンロードしたファイルをダブルクリックしてエクセルで開くと、 文字化けして表示されてしまうので、BOM付きのCSVファイルを生成すれば、文字化けしなくなります。
- UTF-8のBOM
- pack('CCC',0xEF,0xBB,0xBF)
- UTF-16リトルエンディアンのBOM
- pack('CC',0xFF,0xFE)
- UTF-16ビッグエンディアンのBOM
- pack('CC',0xFE,0xFF)
※pack関数の第一引数の"C"は、符号無しChar型つまりバイト型という意味。"CCC"は符号なしChar型が3つの意味になります。
<?php
mb_internal_encoding("UTF-8");
//CSVファイルの先頭にUTF-8のBOMを付与する
$csv=pack('CCC',0xEF,0xBB,0xBF). //UTF-8のBOM
mb_convert_encoding( //念のためUTF8に変換していますが文字コードが既にUTF-8の場合は不要
'"項目","値1","値2"'."\r\n".
'"項目1",1,2'."\r\n".
'"項目2",2,2'."\r\n".
'"項目3",3,5'."\r\n"
,"UTF-8"
);
//ファイルサイズの取得
$filesize=strlen($csv);
//ダウンロードファイル名の設定(IEに対応するにはファイル名を文字コードShift-JISに変換する)
$filename=mb_convert_encoding("CSVファイル名.csv","SJIS","UTF-8");
header('Content-Type: application/octet-stream');
header('Content-Length: '.$filesize);
header('Content-Disposition: attachment; filename='.$filename);
echo $csv;
半角ダブルクォートをCSVフィルのセルに入れるには
半角ダブルクォート(")を半角ダブルクォート×2個("")に変換すれば入れることができます。
<?php mb_internal_encoding("UTF-8"); //CSVファイルの先頭にUTF-8のBOMを付与する $csv=pack('CCC',0xEF,0xBB,0xBF). //UTF-8のBOM mb_convert_encoding( //念のためUTF8に変換していますが文字コードが既にUTF-8の場合は不要 '"項目","値1","値2"'."\r\n". '"""項目""の値1",1,2'."\r\n". ,"UTF-8" ); //ファイルサイズの取得 $filesize=strlen($csv); //ダウンロードファイル名の設定(IEに対応するにはファイル名を文字コードShift-JISに変換する) $filename=mb_convert_encoding("CSVファイル名.csv","SJIS","UTF-8"); header('Content-Type: application/octet-stream'); header('Content-Length: '.$filesize); header('Content-Disposition: attachment; filename='.$filename); echo $csv;
セルの値が0から始まる数字のみでゼロ落ちさせないためには
セルの値が0から始まる数字のみでゼロ落ちさせないためには ="0から始まる数値" とします。
<?php mb_internal_encoding("UTF-8"); //CSVファイルの先頭にUTF-8のBOMを付与する $csv=pack('CCC',0xEF,0xBB,0xBF). //UTF-8のBOM mb_convert_encoding( //念のためUTF8に変換していますが文字コードが既にUTF-8の場合は不要 '"項目","値1","値2"'."\r\n". '="000001",1,2'."\r\n". '="000002",2,4'."\r\n". ,"UTF-8" ); //ファイルサイズの取得 $filesize=strlen($csv); //ダウンロードファイル名の設定(IEに対応するにはファイル名を文字コードShift-JISに変換する) $filename=mb_convert_encoding("CSVファイル名.csv","SJIS","UTF-8"); header('Content-Type: application/octet-stream'); header('Content-Length: '.$filesize); header('Content-Disposition: attachment; filename='.$filename); echo $csv;
セル内で改行
セル内改行させるには ダブルクォートで括ります。"改行を含む文字列文字列"
<?php mb_internal_encoding("UTF-8"); //CSVファイルの先頭にUTF-8のBOMを付与する $csv=pack('CCC',0xEF,0xBB,0xBF). //UTF-8のBOM mb_convert_encoding( //念のためUTF8に変換していますが文字コードが既にUTF-8の場合は不要 '"項目","値1","値2"'."\r\n". '"あいうえお'.\r\n.'かきくけこ",1,2'."\r\n". ,"UTF-8" ); //ファイルサイズの取得 $filesize=strlen($csv); //ダウンロードファイル名の設定(IEに対応するにはファイル名を文字コードShift-JISに変換する) $filename=mb_convert_encoding("CSVファイル名.csv","SJIS","UTF-8"); header('Content-Type: application/octet-stream'); header('Content-Length: '.$filesize); header('Content-Disposition: attachment; filename='.$filename); echo $csv;