
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)
※携帯電話用のページを作成するのと同じ手順。
通常のページの出力かExcelデータのダウンロードするページを出力するかをURLで切り分けます。
通常の出力 = [/コントローラ名/アクション名/]
Excelの出力 = [/ex/コントローラ名/アクション名]
※「ex」部分は任意。
この判別を「/app/config/routes.php」で定義します。
$Route->connect('/ex/:controller/:action/*', array('webservices' => 'Excel'));
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」
通常と同様に作成する。
レイアウトの記述方法は、通常のレイアウトを作成する時と同じ。
[app/views/layouts]に小文字の[webservices名]ディテクトリを作成し、その中にレイアウトを設置する。
今回の場合だと,[app/views/layouts/excel]にレイアウトを設置する。
記述方法は通常のビューを作成するのと同じ。
設置もレイアウト同様、[app/views/コントローラ名/]以下に[webservices名]ディテクトリを作成して、設置する。
今回の場合だと,[app/views/コントローラ名/excel]にレイアウトを設置する。
上で作成した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にしておくべし。
この投稿への コメント/トラックバック はまだありません...
MICKです。
1983年1月24日生まれ。ウェブの世界にいるのは、偶然のようで必然なのかも。
好きなこと :
国民的人気を誇っている坂本龍馬の人気のきっかけを作った司馬遼太郎の小説「竜馬がゆく」で龍馬の人気の秘密がわかる!?。
[続きを読む!]

龍馬の金策日記―維新の資金をいかにつくったか (祥伝社新書)
よく推理小説とかだと読書を中断するタイミングが掴めない時があるんですが、この本も同じ感覚で読めました。
[続きを読む!]
人生って、一度しかないっていう単純なことに気がついた。
「あぁ、あの時どうして・・・」と悔やみながら人生を終わるのは嫌だと思った。
[続きを読む!]
なんで禁煙本が自己啓発やねん。と思われた方すみませんw
しかし、何を隠そう自分はこの本でタバコをやめたのです!
[続きを読む!]
| 位 | アクセス元 | 数 |
|---|---|---|
| bing.com | 286 | |
| twitter.com | 255 | |
| q.hatena.ne.jp | 120 | |
| 4 | b.hatena.ne.jp | 103 |
| 5 | fdays.blogspot.com | 91 |
| 6 | d.hatena.ne.jp | 68 |
| 7 | analytics-ja.blogspot.com | 59 |
| 8 | as.blog16.jp | 48 |
| 9 | cakephp.blog16.jp | 44 |
| 10 | 1kb.jp | 35 |
| 11 | moviereleases.mommyc・・・ | 31 |
| 12 | syuhari.jp | 29 |
| 13 | milds.net | 28 |
| 14 | blog.development-net・・・ | 26 |
| 15 | blog.absun.info | 22 |