【PHP】誰にでも簡単に使える【CSVをダウンロードさせるサンプル】を書いた

      2016/03/29

PHPのCSVダウンロードサンプル

今でも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();

	}
}

 

 

では。参考になればと思います。

 

megane

megane

エンジニア歴13年位です。PHPとかMysqlを使ってWebシステムを構築します。 Javaも書きます。 CakePHPも使います。 サーバのチューニングもごりごりやります。 あと、お肉と自動車が好きです。Twitterとか申請どうぞ。

 - PHP , , , ,