既に色々なライブラリや参考WEBサイトがありますが、備忘録として。。
※参考
http://d.hatena.ne.jp/saicologic/20080606/1212715767
http://www.syuhari.jp/blog/archives/1621
http://journal.mycom.co.jp/articles/2009/03/06/phpexcel/index.html
以下、PHP Excel + Zend Frameworkの例です。
ここやここなんかを参考にPHP Excelのダウンロードと展開、パスの設定。
Excel95形式(.xls)を扱う限りはphp_zipは必要なさそうです。
PHP Excelに身を委ねてExcelファイルを生成。
生成した一時ファイルを返却。
Content-Typeは「application/vnd.ms-excel」らしい。
include 'PHPExcel.php';
class ExcelController extends Zend_Controller_Action
{
public function testAction()
{
// 一時ファイル
$fileName = '/tmp/output.xls';
$excel = new PHPExcel();
// シートの設定
$excel->setActiveSheetIndex(0);
$sheet = $excel->getActiveSheet();
$sheet->setTitle('sheet name');
// セルに値を入れる
$sheet->setCellValue('A1', 'あいうえお');
// Excel95 形式で出力
$writer = PHPExcel_IOFactory::createWriter($excel, 'Excel5');
$writer->save($fileName); // ホントはファイル出力せずにバイナリで返して欲しい
// ダウンロード
$this->getResponse()
->setHeader('Content-Type', 'application/vnd.ms-excel')
->setHeader('Content-Disposition', 'attachment; filename="test.xls"')
->appendBody(file_get_contents($fileName))
->sendResponse();
exit;
}
}
こんな感じで、
example.com/excel/test/
にアクセスでtest.xlsのダウンロード。
========================
2010/06/27追記
IEの場合、キャッシュ関係のヘッダがないとダウンロードできないらしい。
Pragmaヘッダが無いと、「このインターネットサイトを開くことができませんでした。要求されたサイトが使用できないか、見つけることができません。後でやり直してください。」とのエラー。
include 'PHPExcel.php';
class ExcelController extends Zend_Controller_Action
{
public function testAction()
{
// 一時ファイル
$fileName = '/tmp/output.xls';
$excel = new PHPExcel();
// シートの設定
$excel->setActiveSheetIndex(0);
$sheet = $excel->getActiveSheet();
$sheet->setTitle('sheet name');
// セルに値を入れる
$sheet->setCellValue('A1', 'あいうえお');
// Excel95 形式で出力
$writer = PHPExcel_IOFactory::createWriter($excel, 'Excel5');
$writer->save($fileName); // ホントはファイル出力せずにバイナリで返して欲しい
// ダウンロード
$this->getResponse()
->setHeader('Content-Type', 'application/vnd.ms-excel')
->setHeader('Content-Disposition', 'attachment; filename="test.xls"')
->setHeader('Cache-Control', 'no-cache') // IE
->setHeader('Pragma', 'no-cache') // IE
->appendBody(file_get_contents($fileName))
->sendResponse();
exit;
}
}
========================
2010/07/10追記
atachementのfilenameはそのまま送出するとブラウザによって文字化けする。
※参考
http://oku.edu.mie-u.ac.jp/~okumura/php/filename.php
http://d.hatena.ne.jp/guangda/20100106/1262762061
http://d.hatena.ne.jp/guccyon/20080530/p1
とりあえず、お手軽安全なのはSJISに変換か。。
Win環境以外は知らないことにしよう。
// ダウンロード
$fileName = mb_convert_encoding($fileName, 'SJIS');
$this->getResponse()
->setHeader('Content-Type', 'application/vnd.ms-excel')
->setHeader('Content-Disposition', 'attachment; filename="' . $fileName . '"')
->setHeader('Cache-Control', 'no-cache') // IE
->setHeader('Pragma', 'no-cache') // IE
->appendBody(file_get_contents($fileName))
->sendResponse();
0 件のコメント:
コメントを投稿