2010年5月26日水曜日

PHPでExcel出力

WEBからExcel出力させたい!
既に色々なライブラリや参考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 件のコメント:

コメントを投稿