PHPでExcelに正しく開けるCSVファイルを作成|文字化け・ダブルクォート・ゼロ落ち・改行対策
PHPでCSVファイルを作成する際に、
Excelでダブルクリックして開くと文字化けする、
セル内に半角ダブルクォートが正しく反映されない、
0から始まる数値がゼロ落ちしてしまう、
セル内の改行が正しく処理されない
という問題に直面することがあります。
本記事では、これらの問題をすべて解決する方法を具体的なソースコードと共に詳しく解説します。
正しくExcelに表示できるCSVファイルを作成したい方は必見です!
ダブルクリックで開いて文字化けしない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;
