トップへ(mam-mam.net/)

PHPで文字化けせずExcelで開けるUTF-8のCSVファイルの生成方法

検索:

~ダブルクリックで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;