タグ別アーカイブ: csv

[PHP]エクセルで文字化けさせないCSVの作り方

タグ: , , , , | 投稿日: 投稿者:

おはこんばんにちは、いい年してモンハンしちゃってるモリです。

さて、今回はCMSの1機能としてよくあるCSVダウンロード機能に関する記事を書きたいと思います。
PHPで生成したCSVをエンドユーザーがダウンロードしてエクセルで開いたら文字化けしてる!って
事を無くす為のやり方です。

結論から言うとファイルの先頭にBOMを付与する事で文字化けを回避させることが出来ます。
エクセルにUnicodeと識別させるために付与します。
これがあるとエクセルは自動的に判別してくれます。
SIJISに変換する方法もありますが、UTF8のまま文字化け対応させるやり方です。

元データはこんな感じ
blog1

BOMなしのPHPソース

 
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=sample.csv");
$fp = fopen('php://output','w');
$data = array(
		array('項目1','項目2','項目3','項目4'),
		array('データ1','データ2','データ3','データ4'),
		array('データ5','データ6','データ7','データ8'),
		array('データ9','データ10','データ11','データ12')
);
foreach($data as $output){
	fputcsv($fp, $output, ',','"');
}
fclose($fp);

これをエクセルで見てみると見事に文字化け
blog2

さっきのソースのデータ書き込み前にBOMを付与します。

 fwrite($fp, '\xEF\xBB\xBF'); 

BOMありバージョンで見てみるとちゃんと読み込めていますね。
blog4

おまけ:BOMありのPHPソース

header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=sample.csv");
$fp = fopen('php://output','w');
fwrite($fp, "\xEF\xBB\xBF");
$data = array(
		array('項目1','項目2','項目3','項目4'),
		array('データ1','データ2','データ3','データ4'),
		array('データ5','データ6','データ7','データ8'),
		array('データ9','データ10','データ11','データ12')
);
foreach($data as $output){
	fputcsv($fp, $output, ',','"');
}
fclose($fp);

では。。。


[jQuery]CSVファイルを配列にする

カテゴリー: jQuery | タグ: , , , , | 投稿日: | 投稿者:

最近、怖い話を聞きながら寝るのにハマってるモリです。

今回、紹介するのはAjaxで読み込んだCSVのデータを配列に変換する方法です。

用意したデータは以下。

No 品種 原産国 補足

1

ブルーマウンテン ジャマイカ バランス型
2 キリマンジャロ タンザニア 酸味とコク
3 マンデリン インドネシア コクと苦み
4 コロンビア コロンビア 香りと角のないコク

 

用意するライブラリは本家jqueryと今回は「simple_csv」を使用します。

使い方はAjaxで読み込んだデータをsimple_csvに渡すだけ!

配列で返してくれます。

サンプルソース:

&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
	$.ajax({&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
	  url:&#39;sample.csv&#39;,&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
	  beforeSend:function(xhr){&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
	  xhr.overrideMimeType(&amp;amp;amp;amp;quot;text/html;charset=UTF-8&amp;amp;amp;amp;quot;);&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
	  }&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
	}).done(function (csv_data, status, error) {&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
	  var data = $.simple_csv(csv_data);&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
	  console.dir(data);&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
	});&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
	

beforeSendでCSVの文字コードをUTF-8にしてます。

simple_csv

でわ。。。