Delphi for PHPを使い倒す!

Delphi for PHPを使い倒す!(後編)

Delphi for PHPでExcel帳票を作ろう

はやしつとむ
アナハイムテクノロジー株式会社

2009/11/25

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 名前はサンプルですが、色の設定用

※TArrayPropertyEditorもありますが、これはTGridColumnsPropertyEditor、TFormValidatorRulesPropertyEditorの基底クラスなので、そのまま使うのは無理があります

 プロパティエディタを各プロパティに対応させるためには、パッケージファイルに以下のような記述を追加します。第1引数はクラス名、第2引数がプロパティ名、第3引数がプロパティエディタのクラス名、第4引数はnativeとしておきます。

●プロパティエディタの登録
registerPropertyEditor("PHPExcelSimpleReport","TitleRowColor","TSamplePropertyEditor","native");

 さて、メインのロジックですが、これはExportExcel()というメソッドを実装していきます。外から呼ぶのでpublicスコープにしておきます(PHPのデフォルトはPublicですが……)。詳細はソースコードをご覧下さい。

PHPExcelSimpleReportのソースコード

 また、プロパティエディタの変更などでパッケージファイルを変更した場合には、メニューからパッケージの登録をいったん外してから、再登録するようにして下さい。

prev
2/4
next

Index
Delphi for PHPでExcel帳票を作ろう
  Page1
PHPExcelから帳票出力
コンポーネントの作成
Page2
PHPExcelをコンポーネントに組み込む
  Page3
PublicプロパティとPublishedプロパティ
オブジェクトのシリアライズとアンシリアライズ
  Page4
PHPExcel使用時の注意点

index 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の世界を体験してみよう
  Coding Edgeフォーラムフィード  2.01.00.91


Coding Edge フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

>

Coding Edge 記事ランキング

本日 月間