2011年5月16日月曜日

Excel で開く CSVファイルを UTF-8 で出力(PHP)

PHPでExcel用に出力するCSVファイルをSJISで出力すると「~」などの一部文字が文字化けしてしまいます。

そこで、UTF-8(BOMあり/BOM付き)で出力することで、最近のExcelなら文字化けせずに開くことができるようになります。
(古いバージョンでも「外部データの取り込み」でOKという情報あり(未確認))

BOM付きにするには、ファイルの先頭に 0xEF, 0xBB, 0xBF を入れてあげるだけです。

以下のサンプルコードは、mysqlからテーブルを取得して、CSVに出力するというものです。

<?php

$filename      = "csvtest" . date("YmdHis", time() ) . ".csv";
$col_separator = ",";
$row_separator = "\n";

$title = array("あ","い","う");

header("Content-Type: text/tab-separated-values");
header("Content-Disposition: attachment; filename=$filename");

// BOM 付き
print(pack('C*',0xEF,0xBB,0xBF));
print(implode($col_separator, $title));
print($row_separator);

// DB接続
$conn = mysql_connect('hoge.hoge', 'db', 'pass') or die(mysql_error());
mysql_query("SET NAMES utf8", $conn);
mysql_select_db('db') or die(mysql_error());

// data取得クエリの作成
$query = "SELECT `あ`,`い`,`う`
FROM `hogetable`";

// クエリの実行
$res = mysql_query($query);

$out = fopen('php://output', 'w');

// 結果を出力します。
while ($row = mysql_fetch_array($res, MYSQL_NUM)) {
 fputcsv($out, $row);
}

fclose($out);

// 結果セットを開放し、接続を閉じます。
mysql_free_result($res);
mysql_close($conn);

?>

※ややこしいですが、PHPファイルはBOMなしで記述してください。

0 件のコメント:

コメントを投稿