PHPExcelをコンポーネントに組み込む
さて、コンポーネント作成の手続きが一段落したので、ここにPHPExcelを組み込んでいきます。
このコンポーネントには以下のようなプロパティを持たせて、最終的にExportExcel()メソッドを呼ぶとExcelファイルを吐き出すという構造にしたいと思います。
●必要なプロパティ
- ファイル名
- ワークシート名
- ワークシートのオリエンテーション(タテ・ヨコ)
- ワークシートのページサイズ
- レポートのデータを含んだデータセット
- レポートのタイトル
- レポートのタイトル行の背景色
- レポートの作成者
- レポートの各列の情報
この中でレポートの各列の情報は、データセットの各カラムに対応させて、以下のような情報を含んだ配列として定義しました。
- カラム名
- タイトル行で使用する表示用のタイトル名
- セルの幅
- セルの表示形式(#,##0などの書式文字列)
- セルのアラインメント(左寄せ、中央、右寄せ)
コンポーネントにプロパティを追加するには、メインメニューの[編集]−[Publishedプロパティの追加]を実行して、[Publishedプロパティを追加]ダイアログを表示させて、プロパティ名とデフォルト値を指定していきます。
例えば、プロパティ名:FileName、デフォルト値:nullのようにします。すると、以下のようなスケルトンがコードエディタに生成されます。ここに必要なコードを追加していけばいいわけです。
protected $_filename=null; function getFileName() { return $this->_filename; } function setFileName($value) { $this->_filename=$value; } function defaultFileName() { return null; }
ところで、今回のサンプルでいうとDataSetプロパティのset/getメソッドは注意が必要です。DataSetのようなオブジェクト型のプロパティについては、IDEでの指定もそうですがSerialize/UnSerializeの過程でもオブジェクト名しか渡ってこないことを想定しておかなくてはなりません。
そのために、setメソッドではComponentクラスのfixupPropertyメソッドを利用します。fixupPropertyメソッドはクラス名から、クラスへの参照を返してくれます。具体的には以下のようになります。
//DataSet protected $_dataset = null; public function setDataSet($pValue) { $this->_dataset = $this->fixupProperty($pValue); } public function getDataSet() { return $this->_dataset; } public function defaultDataSet() { return null; }
スケルトンで生成される'default'+プロパティ名のメソッドですが、ここにデフォルト値を書いただけではプロパティの初期化で利用されません。プロパティに初期値を与えたい場合には、protectedフィールドに直接値を指定するか、コンストラクタ__construct()の中で値を設定するようにします。
今回のサンプルでは、初期値を指定するプロパティはすべてコンストラクタの中で'default'+プロパティ名のメソッドを呼んで設定しています。こうしておくと、後で変更する際に修正が1カ所で済みますね。
また、'default'+プロパティ名のメソッドはシリアライズの際に利用されるので、きちんと設定するようにしましょう。詳しくは次節をご覧下さい。
次に、オリエンテーションのようなnull/タテ/ヨコだけしか選択肢のないプロパティに値リストを与えて、ドロップダウンで選択させるには、パッケージファイルの方に以下のようなプロパティ登録関連の関数で記述していきます。
DataSetプロパティのところで、DataSetを登録していますが、こうするとDataSetを継承したコンポーネントが存在する場合にのみ、その中から選択できるようになります。DataSourceコンポーネントと同じですね。
registerPropertyValues("PHPExcelSimpleReport","Orientation",array('Portrait','Landscape')); registerPropertyValues("PHPExcelSimpleReport","PaperSize",array('A4','A3')); registerPropertyValues("PHPExcelSimpleReport","DataSet",array('DataSet'));
次に、レポートのタイトル行の背景色などの色を指定するプロパティで、標準コンポーネントの[色の設定]ダイアログを表示させ、ここからカラーを選択できるようにします。これは、Delphi for PHP 2.0のプロパティエディタで実現されている機能です。
プロパティエディタは標準で以下のものが用意されていますが、Delphiで作成したものを追加することも可能です。
TStringListPropertyEditor | SQLなどの複数行の文字列プロパティ用 |
TItemsPropertyEditor | メニューやツールバーで使用されているItemsプロパティ用 |
TGridColumnsPropertyEditor | DBGridのColumnsプロパティ用 |
TFormValidatorRulesPropertyEditor | FormValidatorのRulesプロパティ用 |
TImagePropertyEditor | Imageプロパティ用 |
TImageListPropertyEditor | ImageListプロパティ用 |
THTMLPropertyEditor | CaptionなどのHTMLで設定するプロパティ用 |
TValueListPropertyEditor | 値リストのプロパティ用 |
TFilenamePropertyEditor | ファイル名の指定用(相対位置) |
TAbsolutePathPropertyEditor | ファイル名の指定用(絶対位置) |
TSamplePropertyEditor | 名前はサンプルですが、色の設定用 |
プロパティエディタを各プロパティに対応させるためには、パッケージファイルに以下のような記述を追加します。第1引数はクラス名、第2引数がプロパティ名、第3引数がプロパティエディタのクラス名、第4引数はnativeとしておきます。
registerPropertyEditor("PHPExcelSimpleReport","TitleRowColor","TSamplePropertyEditor","native");
さて、メインのロジックですが、これはExportExcel()というメソッドを実装していきます。外から呼ぶのでpublicスコープにしておきます(PHPのデフォルトはPublicですが……)。詳細はソースコードをご覧下さい。
PHPExcelSimpleReportのソースコード
また、プロパティエディタの変更などでパッケージファイルを変更した場合には、メニューからパッケージの登録をいったん外してから、再登録するようにして下さい。
2/4 |
Index | |
Delphi for PHPでExcel帳票を作ろう | |
Page1 PHPExcelから帳票出力 コンポーネントの作成 |
|
Page2 PHPExcelをコンポーネントに組み込む |
|
Page3 PublicプロパティとPublishedプロパティ オブジェクトのシリアライズとアンシリアライズ |
|
Page4 PHPExcel使用時の注意点 |
Delphi for PHPを使い倒す! |
Coding Edgeお勧め記事 |
いまさらアルゴリズムを学ぶ意味 コーディングに役立つ! アルゴリズムの基本(1) コンピュータに「3の倍数と3の付く数字」を判断させるにはどうしたらいいか。発想力を鍛えよう |
|
Zope 3の魅力に迫る Zope 3とは何ぞや?(1) Pythonで書かれたWebアプリケーションフレームワーク「Zope 3」。ほかのソフトウェアとは一体何が違っているのか? |
|
貧弱環境プログラミングのススメ 柴田 淳のコーディング天国 高性能なIT機器に囲まれた環境でコンピュータの動作原理に触れることは可能だろうか。貧弱なPC上にビットマップの直線をどうやって引く? |
|
Haskellプログラミングの楽しみ方 のんびりHaskell(1) 関数型言語に分類されるHaskell。C言語などの手続き型言語とまったく異なるプログラミングの世界に踏み出してみよう |
|
ちょっと変わったLisp入門 Gaucheでメタプログラミング(1) Lispの一種であるScheme。いくつかある処理系の中でも気軽にスクリプトを書けるGaucheでLispの世界を体験してみよう |
|
- プログラムの実行はどのようにして行われるのか、Linuxカーネルのコードから探る (2017/7/20)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。最終回は、Linuxカーネルの中では、プログラムの起動時にはどのような処理が行われているのかを探る - エンジニアならC言語プログラムの終わりに呼び出されるexit()の中身分かってますよね? (2017/7/13)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。今回は、プログラムの終わりに呼び出されるexit()の中身を探る - VBAにおけるFileDialog操作の基本&ドライブの空き容量、ファイルのサイズやタイムスタンプの取得方法 (2017/7/10)
指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法、FileDialog/エクスプローラー操作の基本を紹介します - さらば残業! 面倒くさいエクセル業務を楽にする「Excel VBA」とは (2017/7/6)
日頃発生する“面倒くさい業務”。簡単なプログラミングで効率化できる可能性がある。本稿では、業務で使うことが多い「Microsoft Excel」で使えるVBAを紹介する。※ショートカットキー、アクセスキーの解説あり
|
|