CakePHPでHTMLをExcelファイルで出力する方法

8641 回閲覧 このエントリーをはてなブックマークする この記事のブックマークユーザー 永続的リンク2008/06/09 06:54:20 カテゴリ: PHP, CakePHP
スポンサード リンク

CakePHPでExcel


Webアプリから2行でExcelファイルを出力する方法にあるように、WebアプリからHTML出力する時に、HTTPヘッダーに以下の2行を加えるだけExcel(またはWord)のファイルを出力することができる。

Content-Type: application/vnd.ms-excel
Content-Disposition: attachment; filename="hoge.xls"

※Excelは対応文字コードがShift-JISなので、内部エンコーディングがUTF-8やEUC-JPなど場合は変換する必要がある。

目的と結果

現在のバージョンは1.1.18。


やりたいこと

既に作成してあるコントローラを使って、Excelファイルを出力するページを作成すること。

やったこと

webservicesを利用して、コントローラは同一のものを使って出力を切り替える。

はまったところ

文字化け

文字化けの原因は以下。詳しくは後半で。
afterRenderメソッド

ビューテンプレートの出力の変更はできるが、レイアウトファイルの出力は変更できない



※CakePHP1.2ではCakePHP webservicesの機能が無くなるとのこと。
⇒1.2からはwebservicesに替わりprefixをURLルーティングで使用するようです。(CakePHP 1.2で携帯用ビューを表示する | Shin x blog)


[続き:]

今回の手順

  1. Excelデータ出力用のルーティングの設定 [app/config/routes.php]
  2. webservicesを有効にするので、コンポーネント,ヘルパーを作成する
  3. レイアウトの作成
  4. ビューの作成
  5. 出力文字エンコーディングを変換、HTTPヘッダーの追加

※携帯電話用のページを作成するのと同じ手順。

1、Excelデータ出力用のルーティングの設定


通常のページの出力かExcelデータのダウンロードするページを出力するかをURLで切り分けます。


通常の出力 = [/コントローラ名/アクション名/]

Excelの出力 = [/ex/コントローラ名/アクション名]
※「ex」部分は任意。


この判別を「/app/config/routes.php」で定義します。

$Route->connect('/ex/:controller/:action/*', array('webservices' => 'Excel'));

2,コンポーネント,ヘルパーを作成する

webservicesが有効になっているリクエストでは、専用のコンポーネント・ヘルパーが自動的に読み込むので、必ず作成が必要になる。

コンポーネントの作成

[app/controllers/components/excel.php]

<?php     
class ExcelComponent extends Object    
{     
}    
?>

※クラス名は「webservices名+Component」、ファイル名は「webservices名(camel_case).php」
通常と同様に作成する。

ヘルパーの作成

[app/views/helpers/excel.php]

<?php     
class ExcelHelper extends Helper    
{     
}    
?>

※クラス名は「webservices名+Helper」、ファイル名は「webservices名(camel_case).php」
通常と同様に作成する。

3、レイアウトの作成

レイアウトの記述方法は、通常のレイアウトを作成する時と同じ。
[app/views/layouts]に小文字の[webservices名]ディテクトリを作成し、その中にレイアウトを設置する。


今回の場合だと,[app/views/layouts/excel]にレイアウトを設置する。

4、ビューの作成

記述方法は通常のビューを作成するのと同じ。


設置もレイアウト同様、[app/views/コントローラ名/]以下に[webservices名]ディテクトリを作成して、設置する。


今回の場合だと,[app/views/コントローラ名/excel]にレイアウトを設置する。


5、出力文字エンコーディングを変換、HTTPヘッダーの追加

上で作成したhelperに以下のように書きます。

class ExcelHelper extends Helper
{
    function afterRender()
    {
        
        $out = ob_get_clean();
        $out = mb_convert_encoding($out,"SJIS","EUC-JP");
        ob_start();
        
        header("Content-type: application/vnd.ms-excel");
        header("Content-Disposition: attachment; filename=\"hoge.xls\"");        
        echo $out;
    }

}

このafterRenderメソッドは、ビューの出力内容が確定した後に呼び出されるので、出力内容全体に対して処理することができます。


が、


文字化けしました。



最初でも書きましたが、

ビューテンプレートの出力の変更はできるが、レイアウトファイルの出力は変更できない

つまり、上記の処理の文字コードの変更は、レイアウトファイルへは行われないということ。


今回はレイアウトの部分に日本語が書かれていました。


そのまま出力すると、ExcelファイルはShift-JISなので、文字化けが発生ということです。


対策としては、レイアウトファイルに日本語を使わない。


使いたいのなら、afterRenderメソッドではなく、appControllerなどで定義するとか。


あと、DEBUGも0にしておくべし。

協力者(感謝)& 参考

 →ツイッターのフォローはこちら
スポンサード リンク
         

関連記事

↑ページ上部へ

アクセスカウンター

今日 : 105 昨日 : 14

ブログ内容

主にウェブ関係のことを書いてます。たまにブレイクダンスとか他のことも書いています。

プロフィール

MICK

MICKです。

1983年1月24日生まれ。ウェブの世界にいるのは、偶然のようで必然なのかも。

好きなこと :
 挑戦すること。物事に没頭すること。勉強すること。
嫌いなこと :
 自慢話を聞くこと。人の悪口を言うこと。

運営サイト

      

カテゴリ一覧

サイト広告

オススメの書籍とか

感想

紹介

色々

最近のコメント

最新記事

注目記事

人気記事

最近の人気記事

人気の記事

関連サイト

運営サイト

色々

最近のトラックバック