2008/09/16 カテゴリ : Tech  symfony  plugin  プラグイン 

symfonyでExcelファイルを作成するプラグイン

みなさん、こんにちは。
毎年ちょっと遅めの夏休み時期に入ろうとしている、笹亀です。

前回のブログと同様でsymfonyのプラグインのご紹介です。
今回は、symfonyでExcelを出力するプラグインのsfPhpExcelPluginを使ってみました。
sfPhpExcelPluginは、PHPでExcel出力するライブラリの一つであるPHPExcelをsymfony用にプラグイン化したものです。
実際のインストールから基本的なExcelファイルを出力する方法についてご紹介したいと思います。

まずは、プラグインのインストール方法です。
前回と同様ですが、1行で簡単にインストールできますねw
  1. php symfony plugin-install http://plugins.symfony-project.org/sfPhpExcelPlugin

※私の実行環境は、symfonyの1.0ですが、1.1や1.2などをご使用している場合は、インストール方法が若干違うのでご注意ください。
 (HomeのInstallationタブを参照)

インストールした後は実装なのですが、私自身がPHPExcelを使ったこともなかったため、実際にどのような使用すればよいか調べながら使いました。
参考にした箇所をメモで残しておきます。参考になればと思います。
・PHPExcelのドキュメントを参照する
・「plugins/sfPhpExcelPlugin/examples/」内に格納されているサンプルファイルをチェックする
・細かいメソッドや設定については、PHPExcelのソースを見る

英語が苦手なもので、ドキュメントを読むのには少々苦労しました^^;

次に、実際にsymfonyのアクションでの使用例を記述します。
下記は、Excelファイルを生成してダウンロードさせるアクションです。
 ※スクリプトが見えにくい状態になっておりますので、ご注意ください。
  1. public function executeTestExecelOutput()
  2. {
  3.   //このプラグインでは「Strict Standards」のエラーが出るためエラーレベルを調整する
  4.   error_reporting(E_ALL);
  5.   
  6.   //オブジェクト生成
  7.   $objPHPExcel = new sfPhpExcel();
  8.  
  9.   //Excelファイルのファイル情報をセット(MacのExcelでは確認できませんでした
  10.   $objPHPExcel->getProperties()->setCreator("笹亀弘");
  11.   $objPHPExcel->getProperties()->setLastModifiedBy("笹亀弘");
  12.   $objPHPExcel->getProperties()->setTitle("Excel");
  13.   $objPHPExcel->getProperties()->setSubject("テストExcel");
  14.   $objPHPExcel->getProperties()->setDescription("ExcelファイルをPHPで出力するテストです");
  15.   $objPHPExcel->getProperties()->setKeywords("office Execel php");
  16.   $objPHPExcel->getProperties()->setCategory("カテゴリをセット");
  17.  
  18.   //使用するシートを指定し、シートタイトルをセットする
  19.   $objPHPExcel->getActiveSheet()->setTitle('Simple');
  20.   $objPHPExcel->setActiveSheetIndex(0);
  21.   
  22.   //デフォルトのスタイルにフォントとフォントサイズを設定(ここでは「MSゴシック」を指定)
  23.   $objPHPExcel->getActiveSheet()->getDefaultStyle()->getFont()->setName('MS Gothic');
  24.   $objPHPExcel->getActiveSheet()->getDefaultStyle()->getFont()->setSize(8);
  25.  
  26.   //ページの種類とページサイズと印刷エリアの指定(うまく動いているか微妙でした
  27.   $objPHPExcel->getActiveSheet()->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_DEFAULT);
  28.   $objPHPExcel->getActiveSheet()->getPageSetup()->setPaperSize(PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4);
  29.   $objPHPExcel->getActiveSheet()->getPageSetup()->setPrintArea('A1:T58');
  30.   
  31.   //Cellに値をセット(エクセルの関数も使用できます
  32.   $objPHPExcel->getActiveSheet()->setCellValue('A1', '15');
  33.   $objPHPExcel->getActiveSheet()->setCellValue('A2', '58');
  34.   $objPHPExcel->getActiveSheet()->setCellValue('A3', '=SUM(A1:A2)');
  35.   $objPHPExcel->getActiveSheet()->setCellValue('B1', '日本語日本語日本語日本語日本語日本語日本語日本語日本語日本語日本語日本語日本語');
  36.  
  37.   //Cellの行サイズをセット
  38.   $objPHPExcel->getActiveSheet()->getRowDimension('1')->setRowHeight(40);
  39.   $objPHPExcel->getActiveSheet()->getRowDimension('2')->setRowHeight(100);
  40.  
  41.   //Cellの列サイズをセット(列サイズの数値と同じ数値をセットしてもサイズが違うみたいです
  42.   $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(16);
  43.   $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(16);
  44.   
  45.   //B1のCellのスタイルをセットする
  46.   // ・文字をセンタリングしてセル内で折り返す
  47.   // ・セル内を塗りつぶす
  48.   // ・上下左右を枠線で囲む
  49.   $objPHPExcel->getActiveSheet()->getStyle('B1')->applyFromArray(
  50.      array(
  51.       'alignment' => array(
  52.         'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
  53.         'vertical' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
  54.         'wrap' => true,
  55.      ),
  56.       'borders' => array(
  57.         'top'     => array('style' => PHPExcel_Style_Border::BORDER_THIN),
  58.         'bottom'  => array('style' => PHPExcel_Style_Border::BORDER_THIN),
  59.         'left'    => array('style' => PHPExcel_Style_Border::BORDER_THIN),
  60.         'right'   => array('style' => PHPExcel_Style_Border::BORDER_THIN)
  61.       ),
  62.       'fill' => array(
  63.         'type'       => PHPExcel_Style_Fill::FILL_SOLID,
  64.         'rotation'   => 90,
  65.         'startcolor' => array('argb' => 'CACC33FF'),
  66.         'endcolor'   => array('argb' => 'FFFFFFFF')
  67.       )
  68.       )
  69.   );
  70.   
  71.   //B1セルのスタイルをコピーしてB2〜B4まで適応させる
  72.   $objPHPExcel->getActiveSheet()->duplicateStyle($objPHPExcel->getActiveSheet()->getStyle('B1'), 'B2:B4');
  73.   
  74.   //B2〜B4までをセルを結合する
  75.   $objPHPExcel->getActiveSheet()->mergeCells('B2:B4');
  76.   
  77.   //シート内に画像を貼ることもできます(C2セルの位置から画像を貼る場合
  78.   $objDrawing = new PHPExcel_Worksheet_Drawing();
  79.   $objDrawing->setWorksheet($objPHPExcel->getActiveSheet());
  80.   $objDrawing->setName('Paid');
  81.   $objDrawing->setDescription('Paid');
  82.   $objDrawing->setPath('/tmp/macos.gif');
  83.   $objDrawing->setCoordinates('C2');
  84.   $objDrawing->setOffsetX(20);
  85.   $objDrawing->setOffsetY(10);
  86.   $objDrawing->setRotation(25);
  87.  
  88.   //Office 2007またはExcel5形式で出力(CSVやHTMLやPDFなどでも出力可能
  89.   //$output = new PHPExcel_Writer_Excel2007($objPHPExcel);
  90.   $output = new PHPExcel_Writer_Excel5($objPHPExcel);
  91.   $output->save('/tmp/test.xls');
  92.   
  93.   //保存したファイルを読み込みダウンロードさせるヘッダー情報を出力
  94.   $data = fread(fopen('/tmp/test.xls', "r"), filesize('/tmp/test.xls'));
  95.   $response = $this->getContext()->getResponse();
  96.   $response->setHttpHeader('Pragma', '');
  97.   $response->setHttpHeader('Cache-Control', '');
  98.   $response->setHttpHeader('Content-Type', 'application/vnd.ms-excel');
  99.   $response->setHttpHeader('Content-Disposition', 'attachment; filename="test.xls"');
  100.   $response->setContent($data);
  101.  
  102.   //テンプレートを表示しないようにする
  103.   return sfView::NONE;
  104.   
  105. }

実行すると、ダウンロード画面が表示されます。


ダウンロードしたファイルをExcelで開いて内容を確認します。


このように、symfonyでも簡単にExcelを作成することができます。


上記のようにExcelを簡単に作成できるのはとてもいいのですが、簡単なExcelでもスタイルや画像の張り込みなどを行うとスクリプトが長文になってしまい、スクリプトが汚くなってしまうことです。
privateメソッドなどを有効に活用してスタイルを別に定義しておくなど、工夫すると若干見やすくなります。

個人的にいただけないのが、一度ファイルに出力してからそのファイルを読み込むという二度手間みたいな処理をしないといけないのが気持ちが悪いです。

いいライブラリな分、不便な点も目立ちますね^^;
便利な所と不便な所を理解して、上手に活用していきたいものです。

このブログは、下記のサイトを参考にさせていただきました。
PHPExcel
 http://www.codeplex.com/PHPExcel
sfPhpExcelPlugin
 http://www.symfony-project.org/plugins/sfPhpExcelPlugin
symfony usersページ
 http://groups.google.com/group/symfony-users/browse_thread/thread/c7f28113284a491a

コメント

    • Jorge
    • 2010年01月05日 14:42
    • 素晴らしいチュートリアル!私のダウンロードはsymfonyにファイルをxlsファイルを生成するに悩まされている。あなたの例のためにも、 Googleの翻訳をいただきありがとうございます。どちらも英語も私のためのガイドなどがスペイン語で、彼とは非常に私のような初心者には難しいものでした:)

コメントフォーム

認証
captcha_key
 
 

トラックバックURI

アシアルPHP書籍情報