アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

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

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

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

まずは、プラグインのインストール方法です。
前回と同様ですが、1行で簡単にインストールできますねw


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ファイルを生成してダウンロードさせるアクションです。
 ※スクリプトが見えにくい状態になっておりますので、ご注意ください。


public function executeTestExecelOutput()
{
  //このプラグインでは「Strict Standards」のエラーが出るためエラーレベルを調整する
  error_reporting(E_ALL);
  
  //オブジェクト生成
  $objPHPExcel = new sfPhpExcel();

  //Excelファイルのファイル情報をセット(MacのExcelでは確認できませんでした
  $objPHPExcel->getProperties()->setCreator("笹亀弘");
  $objPHPExcel->getProperties()->setLastModifiedBy("笹亀弘");
  $objPHPExcel->getProperties()->setTitle("Excel");
  $objPHPExcel->getProperties()->setSubject("テストExcel");
  $objPHPExcel->getProperties()->setDescription("ExcelファイルをPHPで出力するテストです");
  $objPHPExcel->getProperties()->setKeywords("office Execel php");
  $objPHPExcel->getProperties()->setCategory("カテゴリをセット");

  //使用するシートを指定し、シートタイトルをセットする
  $objPHPExcel->getActiveSheet()->setTitle('Simple');
  $objPHPExcel->setActiveSheetIndex(0);
  
  //デフォルトのスタイルにフォントとフォントサイズを設定(ここでは「MSゴシック」を指定)
  $objPHPExcel->getActiveSheet()->getDefaultStyle()->getFont()->setName('MS Gothic');
  $objPHPExcel->getActiveSheet()->getDefaultStyle()->getFont()->setSize(8);

  //ページの種類とページサイズと印刷エリアの指定(うまく動いているか微妙でした
  $objPHPExcel->getActiveSheet()->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_DEFAULT);
  $objPHPExcel->getActiveSheet()->getPageSetup()->setPaperSize(PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4);
  $objPHPExcel->getActiveSheet()->getPageSetup()->setPrintArea('A1:T58');
  
  //Cellに値をセット(エクセルの関数も使用できます
  $objPHPExcel->getActiveSheet()->setCellValue('A1', '15');
  $objPHPExcel->getActiveSheet()->setCellValue('A2', '58');
  $objPHPExcel->getActiveSheet()->setCellValue('A3', '=SUM(A1:A2)');
  $objPHPExcel->getActiveSheet()->setCellValue('B1', '日本語日本語日本語日本語日本語日本語日本語日本語日本語日本語日本語日本語日本語');

  //Cellの行サイズをセット
  $objPHPExcel->getActiveSheet()->getRowDimension('1')->setRowHeight(40);
  $objPHPExcel->getActiveSheet()->getRowDimension('2')->setRowHeight(100);

  //Cellの列サイズをセット(列サイズの数値と同じ数値をセットしてもサイズが違うみたいです
  $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(16);
  $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(16);
  
  //B1のCellのスタイルをセットする
  // ・文字をセンタリングしてセル内で折り返す
  // ・セル内を塗りつぶす
  // ・上下左右を枠線で囲む
  $objPHPExcel->getActiveSheet()->getStyle('B1')->applyFromArray(
     array(
      'alignment' => array(
        'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
        'vertical' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
        'wrap' => true,
     ),
      'borders' => array(
        'top'     => array('style' => PHPExcel_Style_Border::BORDER_THIN),
        'bottom'  => array('style' => PHPExcel_Style_Border::BORDER_THIN),
        'left'    => array('style' => PHPExcel_Style_Border::BORDER_THIN),
        'right'   => array('style' => PHPExcel_Style_Border::BORDER_THIN)
      ),
      'fill' => array(
        'type'       => PHPExcel_Style_Fill::FILL_SOLID,
        'rotation'   => 90,
        'startcolor' => array('argb' => 'CACC33FF'),
        'endcolor'   => array('argb' => 'FFFFFFFF')
      )
      )
  );
  
  //B1セルのスタイルをコピーしてB2〜B4まで適応させる
  $objPHPExcel->getActiveSheet()->duplicateStyle($objPHPExcel->getActiveSheet()->getStyle('B1'), 'B2:B4');
  
  //B2〜B4までをセルを結合する
  $objPHPExcel->getActiveSheet()->mergeCells('B2:B4');
  
  //シート内に画像を貼ることもできます(C2セルの位置から画像を貼る場合
  $objDrawing = new PHPExcel_Worksheet_Drawing();
  $objDrawing->setWorksheet($objPHPExcel->getActiveSheet());
  $objDrawing->setName('Paid');
  $objDrawing->setDescription('Paid');
  $objDrawing->setPath('/tmp/macos.gif');
  $objDrawing->setCoordinates('C2');
  $objDrawing->setOffsetX(20);
  $objDrawing->setOffsetY(10);
  $objDrawing->setRotation(25);

  //Office 2007またはExcel5形式で出力(CSVやHTMLやPDFなどでも出力可能
  //$output = new PHPExcel_Writer_Excel2007($objPHPExcel);
  $output = new PHPExcel_Writer_Excel5($objPHPExcel);
  $output->save('/tmp/test.xls');
  
  //保存したファイルを読み込みダウンロードさせるヘッダー情報を出力
  $data = fread(fopen('/tmp/test.xls', "r"), filesize('/tmp/test.xls'));
  $response = $this->getContext()->getResponse();
  $response->setHttpHeader('Pragma', '');
  $response->setHttpHeader('Cache-Control', '');
  $response->setHttpHeader('Content-Type', 'application/vnd.ms-excel');
  $response->setHttpHeader('Content-Disposition', 'attachment; filename="test.xls"');
  $response->setContent($data);

  //テンプレートを表示しないようにする
  return sfView::NONE;
  
}


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


ダウンロードしたファイルを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