CakePHPでエクセルファイルの出力 [CakePHP]
超久しぶりにCakeの小ネタ。
DBのデータをCSVで出力することは多いと思うけど、どうせ社内で使うならエクセル形式の方が良いので.xlsで出力する。
つっても、中身は XMLスプレッドシート(2004)形式。
だから本当は拡張子は .xml なのだけど、それだとATOMや普通のXMLとごっちゃになるので、.xlsで書き出す。
メリットは、
・罫線とか最初から設定してあると嬉しい。
・utf-8で書き出せるから、文字コードのコンバートが要らない。
・1ファイルでもワークシートごとに書き出せる。
・.xls だとエクセルと紐づいてるので、素人にも説明が楽。
デメリットは、
・OOoは拡張子と実際のファイル形式が違うとダメなので、OOoのときは .xml にしないとだめ。
まずは、ルータに下記を追加
/app/config/routes.php
テンプレートは、例えばこんな感じ
/app/views/layouts/xls/default.ctp
/app/views/users/xls/admin_index.ctp
ワークシートごとにしたい場合は、基本的には <Worksheet> 〜 </Worksheet> を繰り返せば、複数のワークシートが出来る。
アクセスする時は、.xls をつければ良いわけだから、
http://xxx.com/admin/users/index.xls
ページネートしたのを出力したい時は、
http://xxx.com/admin/users/index/page:3.xls
みたいなURLになるが無問題。
これでオッケー!超簡単!と思ってたら、出力されない??エラーも出ない。。なぜ?
CSVやXMLはこの手順だけだったのに?
わかんなければ、ソースを見るのがCakePHPの基本
あった、あった。
request_handler.php でファイルの定義をしてたのね、知らなかった。
そんで、当然.xlsはない。
追加すべきなんだけど、どっかのブログで beforeFilter() でやらないとダメというのを見かけたので(未確認)beforeFilterに追記する。
これで問題無く、.xls でダウンロードできた。
よかったよかった。
DBのデータをCSVで出力することは多いと思うけど、どうせ社内で使うならエクセル形式の方が良いので.xlsで出力する。
つっても、中身は XMLスプレッドシート(2004)形式。
だから本当は拡張子は .xml なのだけど、それだとATOMや普通のXMLとごっちゃになるので、.xlsで書き出す。
メリットは、
・罫線とか最初から設定してあると嬉しい。
・utf-8で書き出せるから、文字コードのコンバートが要らない。
・1ファイルでもワークシートごとに書き出せる。
・.xls だとエクセルと紐づいてるので、素人にも説明が楽。
デメリットは、
・OOoは拡張子と実際のファイル形式が違うとダメなので、OOoのときは .xml にしないとだめ。
まずは、ルータに下記を追加
/app/config/routes.php
Router::parseExtensions('csv','xml','xls');
テンプレートは、例えばこんな感じ
/app/views/layouts/xls/default.ctp
<?='<?xml version="1.0"?>'?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
<Author>Sandman</Author>
<LastAuthor>Sandman</LastAuthor>
<Created><?=(date('Y-m-d').'T'.date('H:i:s'))?></Created>
</DocumentProperties>
<OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
<AllowPNG/>
</OfficeDocumentSettings>
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
<WindowHeight>21660</WindowHeight>
<WindowWidth>22580</WindowWidth>
<WindowTopX>6680</WindowTopX>
<WindowTopY>-520</WindowTopY>
<Date1904/>
<AcceptLabelsInFormulas/>
<ProtectStructure>False</ProtectStructure>
<ProtectWindows>False</ProtectWindows>
</ExcelWorkbook>
<Styles>
<Style ss:ID="Default" ss:Name="Normal">
<Alignment ss:Vertical="Bottom"/>
<Borders/>
<Font ss:FontName="MS Pゴシック" x:CharSet="128" ss:Size="11.0"/>
<Interior/>
<NumberFormat/>
<Protection/>
</Style>
</Styles>
<?php
echo $content_for_layout;
?>
</Workbook>
/app/views/users/xls/admin_index.ctp
<Worksheet ss:Name="ユーザ一覧">
<Table ss:DefaultColumnWidth="77.0" ss:DefaultRowHeight="17.0">
<?php
foreach ($users as $u){
$id = $u['User']['id'];
$name = $u['User']['name_0']." ".$u['Users']['name_1'];
$mail = $u['User']['email'];
$created = $u['User']['created'];
$city = $cities[$u['User']['city']];
?>
<Row>
<Cell><Data ss:Type="String"><?=$id?></Data></Cell>
<Cell><Data ss:Type="String"><?=$name?></Data></Cell>
<Cell><Data ss:Type="String"><?=$mail?></Data></Cell>
<Cell><Data ss:Type="String"><?=$city?></Data></Cell>
<Cell><Data ss:Type="String"><?=$created?></Data></Cell>
</Row>
<?php
};//foreach ($Users as $u)
?>
</Table>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<PageSetup/>
<Print>
<ValidPrinterInfo/>
<PaperSizeIndex>0</PaperSizeIndex>
<HorizontalResolution>-4</HorizontalResolution>
<VerticalResolution>-4</VerticalResolution>
</Print>
<PageLayoutZoom>100</PageLayoutZoom>
<Selected/>
<Panes>
<Pane/>
</Panes>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
ワークシートごとにしたい場合は、基本的には <Worksheet> 〜 </Worksheet> を繰り返せば、複数のワークシートが出来る。
アクセスする時は、.xls をつければ良いわけだから、
http://xxx.com/admin/users/index.xls
ページネートしたのを出力したい時は、
http://xxx.com/admin/users/index/page:3.xls
みたいなURLになるが無問題。
これでオッケー!超簡単!と思ってたら、出力されない??エラーも出ない。。なぜ?
CSVやXMLはこの手順だけだったのに?
わかんなければ、ソースを見るのがCakePHPの基本
あった、あった。
request_handler.php でファイルの定義をしてたのね、知らなかった。
そんで、当然.xlsはない。
追加すべきなんだけど、どっかのブログで beforeFilter() でやらないとダメというのを見かけたので(未確認)beforeFilterに追記する。
function beforeFilter() {
parent::beforeFilter();
<中略>
if(isset($this->params['url']['ext']) && $this->params['url']['ext'] == 'xls'){
$this->RequestHandler->setContent('xls', array('application/vnd.ms-excel', 'text/plain'));
}
}
これで問題無く、.xls でダウンロードできた。
よかったよかった。
WordPressを始めてみた [WordPress]
CMSといえば、いままではずぅっっっっっとMTばかりで、他にはExpressionEngineを使った事がちょっとあったくらい。
MTは何かと処理の重さが気になるけど、それ以外は正直便利だし、手が届かないところがあっても、どうにかこうにか工夫したり、最悪プラグインを作ったりして対応できるので、かなり使い込んでいる。
特に、テンプレート周りは秀逸だと思う。DreamWeaverとの相性もいいし。
でも、それでは視野が狭くなってしまうので、食わず嫌いしていたWPをプライベートのプロジェクトで使ってみようと思い、3.1をインストールしてみた。
…まあ、初めてのシステムってのは、どうしても使いづらく感じてしまうよね。
結局は好き嫌いと慣れの問題だと思う。
複数ブログの管理がしづらいとかもあるけど、そもそもの設計思想の問題だと思うので、しょうがないし。
でも、テンプレートに生PHPを書くのは信じられない。とても。
せめてsmarty使えよとか、やりようはあったろうに。
EEのテンプレートの方が、良かったなー。
(EEが有料にさえならなければ…)
まあ、がんばってみるけど、仕事にはならなさそうな気がする。
MTは何かと処理の重さが気になるけど、それ以外は正直便利だし、手が届かないところがあっても、どうにかこうにか工夫したり、最悪プラグインを作ったりして対応できるので、かなり使い込んでいる。
特に、テンプレート周りは秀逸だと思う。DreamWeaverとの相性もいいし。
でも、それでは視野が狭くなってしまうので、食わず嫌いしていたWPをプライベートのプロジェクトで使ってみようと思い、3.1をインストールしてみた。
…まあ、初めてのシステムってのは、どうしても使いづらく感じてしまうよね。
結局は好き嫌いと慣れの問題だと思う。
複数ブログの管理がしづらいとかもあるけど、そもそもの設計思想の問題だと思うので、しょうがないし。
でも、テンプレートに生PHPを書くのは信じられない。とても。
せめてsmarty使えよとか、やりようはあったろうに。
EEのテンプレートの方が、良かったなー。
(EEが有料にさえならなければ…)
まあ、がんばってみるけど、仕事にはならなさそうな気がする。
とっくに明けてますがおめでとう [ActionScript]
このブログの存在を、まるっきり忘れてましたが、みなさん如何お過ごしでしょうか?
本年も宜しくお願いします。
昨年と同じく、クルクルまわるだけですが。
http://pub.sandman.jp/2011/newyear.html
本年も宜しくお願いします。
昨年と同じく、クルクルまわるだけですが。
http://pub.sandman.jp/2011/newyear.html
iPad 終了〜
iPadをiTunesに接続すると、すごく調子が悪い。
とにかく、接続がしょっちゅう解除されてしまい、バックアップ取るのも一苦労。
同期->切断->再同期ー>また切断…の繰り返しで、鬱陶しいことこの上ない。
ソフトかOSが不安定なのかと思ったので、iPadを初期状態に復元して、再度アプリを追加しようと思い、復元を実行したら…!
(わかりづらいけど、復元中の画面)
復元中に切断されてしまい、以後何をどうやってもこの画面のまま、まったく反応せず。
HDを初期化したところで切断したっぽいので、再度つなげてもiTunesでも認識しない…。
(iPadの)電源も切れないし、どうやったらいいんだ!?
今週末、AppleStoreに行かなきゃ駄目かな〜〜〜〜
とにかく、接続がしょっちゅう解除されてしまい、バックアップ取るのも一苦労。
同期->切断->再同期ー>また切断…の繰り返しで、鬱陶しいことこの上ない。
ソフトかOSが不安定なのかと思ったので、iPadを初期状態に復元して、再度アプリを追加しようと思い、復元を実行したら…!
(わかりづらいけど、復元中の画面)
復元中に切断されてしまい、以後何をどうやってもこの画面のまま、まったく反応せず。
HDを初期化したところで切断したっぽいので、再度つなげてもiTunesでも認識しない…。
(iPadの)電源も切れないし、どうやったらいいんだ!?
今週末、AppleStoreに行かなきゃ駄目かな〜〜〜〜
PowerBookG3+UBUNTU10.04+Redmine0.9.4 [インターネット]
事務所の片隅に転がっていたPBG3(私物)…。
数年前まではMac OS9の確認用として、微妙に活躍もしたのだけど、さすがにそれも無くなって来て、OSXも新しいのを入れられなくて、放置するより無かったんだけど。
ふと、ローカル共有できるRedmine機にしようと思い立って、やってみた。
下記からDLする。今回は、デスクトップはいらないので、サーバ版にした。
http://cdimage.ubuntu.com/ports/releases/lucid/release/
isoイメージをCD-Rに焼いて、ブート時にオプションを押し上げながら起動した状態。
勿論、デュアルブートにする気は毛頭ないし、パーティションを切り直したから、この光景はここだけだけど。
UBUNTUはすんなりインストール完了して、次はRedmineを入れる準備。
ほとんど、下記のページを参考にして、そのまま出来た。
http://retujyou.com/2010/05/07/ubuntu-10-04-でインストールしたソフト、設定一覧/
ついでにphpmyadminもインストールした。
sudo apt-get install phpmyadmin
そうすると、/etc/phpmyadmin/ にインストールされるのだけど、そのままだとウェブからアクセスできない。
/etc/phpmyadmin/apache.conf を使えばいいだけで、方法はいろいろありそうだけど、自分は素直に/etc/apache2/httpd.confに
include /etc/phpmyadmin/apache.conf
として、apacheを再起動すると、http://192.168.1.X/phpmyadmin/ からアクセスできた。超簡単〜。
動作確認ついでに、redmine用のDBを作成する。
で、本命のRedmineのインストール。
http://redmine.jp/tech_note/install/
できたよ!しかも、思った程重くない!結構感動した。
これからも当分の間は、Redmineサーバとしてがんばってほしいなぁ。
GEEKs in TOKYOに行って来た [ActionScript]
GEEKs in TOKYO
Flash モーションプログラミング
http://event.67.org/geeks/flashmotion/
に行って来た。
Flashデベロッパー系のイベントには、初めて行くのでちょっとドキドキ。
客層は、おしゃれな人が多い印象かな。オタクでも、見かけには気を使っているタイプ。
プログラム系とは違い、女の子多し。
内容は、お金だしても行って良かったと思える内容。
奥田さんのプレゼンも楽しくてそれで良かったけど、城戸さんのプレゼンは、視点というものを考え直す、良いきっかけになった気がする。
はやく、プレゼン資料アップされないかなー。
んで、帰って来てから、ちょっとヘコんだ。
もちろん、彼らが出来ること(すべきこと)とオレのそれとは違うのだから、ヘコむ必要は無いのだけど、まー、ヘコむのも次への動力源ってことで。
#アフターパーティで相手してくれた方々は、どうもありがとうございました。
Flash モーションプログラミング
http://event.67.org/geeks/flashmotion/
に行って来た。
Flashデベロッパー系のイベントには、初めて行くのでちょっとドキドキ。
客層は、おしゃれな人が多い印象かな。オタクでも、見かけには気を使っているタイプ。
プログラム系とは違い、女の子多し。
内容は、お金だしても行って良かったと思える内容。
奥田さんのプレゼンも楽しくてそれで良かったけど、城戸さんのプレゼンは、視点というものを考え直す、良いきっかけになった気がする。
はやく、プレゼン資料アップされないかなー。
んで、帰って来てから、ちょっとヘコんだ。
もちろん、彼らが出来ること(すべきこと)とオレのそれとは違うのだから、ヘコむ必要は無いのだけど、まー、ヘコむのも次への動力源ってことで。
#アフターパーティで相手してくれた方々は、どうもありがとうございました。
尾を引く残像 After Image [ActionScript]
Flashできれいに尾を引く残像を作りたかったのだけど、なかなか良いサンプルが無いので、試行錯誤してみた。
お、重い!
尾の部分をまともにShapeで作って、それを一つ一つ徐々に透明にしているので、光源は3つで限界。
尾をまとめてBitmapにしないとダメなんだろうが、今後の課題。
折角なので、wonderflに初めて投稿してみた。
wonderflは以前からぼちぼち参考にさせてもらっていて、自分でもちょっと使いたくなったので。
これ、ちょっとしたのを作るなら、普通のエディタより便利かも。
http://wonderfl.net/
お、重い!
尾の部分をまともにShapeで作って、それを一つ一つ徐々に透明にしているので、光源は3つで限界。
尾をまとめてBitmapにしないとダメなんだろうが、今後の課題。
折角なので、wonderflに初めて投稿してみた。
wonderflは以前からぼちぼち参考にさせてもらっていて、自分でもちょっと使いたくなったので。
これ、ちょっとしたのを作るなら、普通のエディタより便利かも。
http://wonderfl.net/
寒中見舞いで使ったライブラリとか [ActionScript]
というわけで、間があいてしまったけど、寒中見舞いで使用したライブラリやソース元のご紹介です。
基本的には、PaperVision3D 2.1を使用しています。
Line3Dが数年前から気に入っているんですが、仕事で使ったことは無いので、未だに使い込めてません。Line3Dは下記を参考にさせて頂きました。
「Papervision3Dで3D空間にラインを描画する:5ive™.blog」
http://www.5ive.info/blog/archives/313
雪が降る部分とカメラの移動は、clockMaker Blog様のデモなどを、ほぼそのまま使わせて頂きました。これで制作時間が半分は短縮されましたね。
「Papervision3D 2.0で被写界深度表現(3):降り積もる雪 | ClockMaker Blog」
http://clockmaker.jp/blog/2008/08/papervision3d_snowfall_particle/
雪のぼかしに関しては、下記のサイトのをほぼそのまま使いましたが、雪の挙動については物理演算させたかったんで、jiglib使いました。
最終的に、雪を減らしたからあんまり意味が無かったんだけど、ばんばん降ってくると面白い。
http://www.jiglibflash.com/blog/
カメラの設定は下記から
「パーティクル表現のためのAS3ライブラリ「Stardust」 | ClockMaker Blog」
http://clockmaker.jp/blog/2009/12/as3-stardust/
下にひいてある文字は、テクスチャでも良かったんだけど、寄ると荒れるし、文字も動かす予定があったんで、Text3DとPotrAsを使いました。
「tnker.com - Papervision3DでText3DとPotrAsを使ってみる」
http://tnker.com/?p=629
こんな素晴らしい情報がすぐに手に入るなんて、良い時代になったような、それ以上の苦労が増えただけのような…。
ちなみに、3Dオブジェクトに関しては、六角大王を使用しました。
んで、一度LightWaveに読み込んで、ラインを引き直してから、.objで保存してます。
LWはラインでさくさく描けるソフトではないし、本当は六角大王から直で.objに保存したいんだけど、ライン情報は書き出してくれなくて、不便してます。
つーか、書き出せるのって、多分LWだけ。オレのは未だ7.5だけど。
基本的には、PaperVision3D 2.1を使用しています。
Line3Dが数年前から気に入っているんですが、仕事で使ったことは無いので、未だに使い込めてません。Line3Dは下記を参考にさせて頂きました。
「Papervision3Dで3D空間にラインを描画する:5ive™.blog」
http://www.5ive.info/blog/archives/313
雪が降る部分とカメラの移動は、clockMaker Blog様のデモなどを、ほぼそのまま使わせて頂きました。これで制作時間が半分は短縮されましたね。
「Papervision3D 2.0で被写界深度表現(3):降り積もる雪 | ClockMaker Blog」
http://clockmaker.jp/blog/2008/08/papervision3d_snowfall_particle/
雪のぼかしに関しては、下記のサイトのをほぼそのまま使いましたが、雪の挙動については物理演算させたかったんで、jiglib使いました。
最終的に、雪を減らしたからあんまり意味が無かったんだけど、ばんばん降ってくると面白い。
http://www.jiglibflash.com/blog/
カメラの設定は下記から
「パーティクル表現のためのAS3ライブラリ「Stardust」 | ClockMaker Blog」
http://clockmaker.jp/blog/2009/12/as3-stardust/
下にひいてある文字は、テクスチャでも良かったんだけど、寄ると荒れるし、文字も動かす予定があったんで、Text3DとPotrAsを使いました。
「tnker.com - Papervision3DでText3DとPotrAsを使ってみる」
http://tnker.com/?p=629
こんな素晴らしい情報がすぐに手に入るなんて、良い時代になったような、それ以上の苦労が増えただけのような…。
ちなみに、3Dオブジェクトに関しては、六角大王を使用しました。
んで、一度LightWaveに読み込んで、ラインを引き直してから、.objで保存してます。
LWはラインでさくさく描けるソフトではないし、本当は六角大王から直で.objに保存したいんだけど、ライン情報は書き出してくれなくて、不便してます。
つーか、書き出せるのって、多分LWだけ。オレのは未だ7.5だけど。
寒中見舞い申し上げます [ActionScript]
新年早々、間に合いませんでした。
まー、あまりのあいかわらずさに、自分でも諦めてますが。
http://pub.sandman.jp/2010/newyear.html
とはいえ、松の内にできた!奇跡!
まあ、大したことはやってないっつーか、ウェブ上のソースをつぎはぎしただけなんだけど。。
お礼代わりに今度、ちゃんと紹介させていただきます。
重く感じたら、画面を小さめにしてご覧下さい。
マシンパワーに自信があるなら、右クリックで品質をHIGHでみてね。
そんなこんなで、今年もよろしくお願いいたします。
まー、あまりのあいかわらずさに、自分でも諦めてますが。
http://pub.sandman.jp/2010/newyear.html
とはいえ、松の内にできた!奇跡!
まあ、大したことはやってないっつーか、ウェブ上のソースをつぎはぎしただけなんだけど。。
お礼代わりに今度、ちゃんと紹介させていただきます。
重く感じたら、画面を小さめにしてご覧下さい。
マシンパワーに自信があるなら、右クリックで品質をHIGHでみてね。
そんなこんなで、今年もよろしくお願いいたします。