転載: http://blog.csdn.net/huyanping/article/details/7068356
データベースから Excel ファイルにデータをエクスポートする必要がある場合は、PHPExcel などのオープン ソース ライブラリを使用する方が確かに簡単ですが、大量のデータのサポートが非常に不十分であり、簡単にエクスポートできません。 PHP のメモリ使用量の上限に達しました。 fputcsvを使ってCSVファイルを書き込み、直接Excelファイルをブラウザに出力する方法です。
// Excelファイルのヘッダーを出力します。user.csvを任意のファイル名に置き換えることができます
header('Content-Type: application/vnd.ms-excel');
header ( 'Content-Disposition:attachment;filename="user.csv"');
header('Cache-Control:max-age=0');
// データベースからデータを取得します。メモリを節約します。一度にデータをメモリに読み込まず、ハンドルから一行ずつ読み込んでください
$sql = 'select * from tbl where ...';
$stmt = $db- >query($sql);
// PHP ファイルハンドルを開きます、php://output はブラウザに直接出力することを意味します
$fp = fopen('php://output', 'a') ;
// Excel列の名前情報を出力
$head = array('名前', '性別', '年齢', 'メール', '電話番号', '...');
foreach ($head as $i => $ v) {
// CSV Excel は GBK エンコードをサポートしています、変換する必要があります、変換しないと文字化けします
$head[$i] = iconv('utf-8', ' gbk', $v);
}
// fputcsvを通してファイルハンドルにデータを書き込む
fputcsv($fp, $head);
// カウンタ
$cnt = 0;
// $limit row ごとに、大きすぎず小さすぎずに出力バッファをリフレッシュします
$limit = 100000;
// メモリを無駄にせずに一行ずつデータをフェッチします
While ($row = $stmt->fetch( Zend_Db::FETCH_NUM)) {
$cnt ++;
if ($limit == $cnt) { //データ量が多すぎることによる問題を防ぐために出力バッファをリフレッシュします
ob_flush();
flush();
$cnt = 0;
}
foreach ($row as $i => $v) {
$row[$ i] = iconv('utf- 8', 'gbk', $v);
}
fputcsv($fp, $row);
}