今でもCSV形式でダウンロードさせるシステムは多いと思います。よく使うのでサンプルを書きました。
こちらにCSVを読み込むサンプルも書きました。併せて参考にしてみてください。
■このサンプルの特徴
▼エクセルで開いても文字化けしない
エクセルで開いた時にも文字化けしないような考慮をしています。
▼データ内に改行を含むCSVもエクセルで開ける
fputcsv関数を使って実装しています。CSVのデータ内に改行を含んでいても、エクセルで開けるようになっています。
▼メモリを気にせず利用できる
テンポラリファイルを作成、CSV出力後にそこからダウンロードさせる方式を採っています。/tmp/直下に一時ファイルを作成するので、ある一定程度時間が経過すれば自動で消えます。テンポラリファイルにCSV形式で一旦出力するので、メモリ不足になることも少ないと思います。
■サンプルコード
関数名など適宜いろいろ変更しながら、自分のプログラムに組み込んでいってみてください。
<?php
sampleCsv();
function sampleCsv() {
try {
//CSV形式で情報をファイルに出力のための準備
$csvFileName = '/tmp/' . time() . rand() . '.csv';
$res = fopen($csvFileName, 'w');
if ($res === FALSE) {
throw new Exception('ファイルの書き込みに失敗しました。');
}
// データ一覧。この部分を引数とか動的に渡すようにしましょう
$dataList = array(
array('hogehoge','mogemoge','mokomoko','aaa'),
array('ddd','sss','eeeeee','ffff'),
);
// ループしながら出力
foreach($dataList as $dataInfo) {
// 文字コード変換。エクセルで開けるようにする
mb_convert_variables('SJIS', 'UTF-8', $dataInfo);
// ファイルに書き出しをする
fputcsv($res, $dataInfo);
}
// ハンドル閉じる
fclose($res);
// ダウンロード開始
header('Content-Type: application/octet-stream');
// ここで渡されるファイルがダウンロード時のファイル名になる
header('Content-Disposition: attachment; filename=sampaleCsv.csv');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($csvFileName));
readfile($csvFileName);
} catch(Exception $e) {
// 例外処理をここに書きます
echo $e->getMessage();
}
}
では。参考になればと思います。