PHP
chart
PHPExcel
グラフ

PHPExcelでテンプレートファイルからグラフを作ってみよう

More than 3 years have passed since last update.

関連
【ぇ、使えるの!?】PHPExcel+マクロでグラフ付きExcelを出力

PHPExcelでゼロからグラフを書いてみよう の続き
Excel_Reviserが終了し、xlsしか出力できないので、
xlsxで出力したい場合、PHPでExcelをいじる場合はPHPExcelを使うしかない。

PHPExcelでグラフを出力するための備忘録。
目指すは折れ線グラフ

PHPExcelバージョン:1.8.1
Excel:2013
PHP:5.5.27

考えられるパターン

  1. テンプレートファイル使わない
  2. テンプレートファイルを使う -> グラフをあらかじめ埋め込んでいるもの
  3. テンプレートファイルを使う -> マクロ埋め込み

今回は上記の「2. テンプレートファイルを使う -> グラフをあらかじめ埋め込んでいるもの 」で行ってみましょう。

流れ

  1. テンプレートとなるグラフ付きのExcelファイルをPHPExcelで読み込む
  2. グラフのデータとなる表にPHPExcelで値を埋める
  3. PHPExcelで出力

テンプレートの作成

まずは、手元のExcelで表とグラフを作成します
2015-09-09_12h59_28.png

表の値の部分を消しましょう

2015-09-09_12h59_42.png

完成。笑

サンプルコード

こちらはCakePHP2.xで書いているので、Cakeなところが残っていたらごめんなさい。

完成図

2015-09-09_13h06_13.png

コード

大事なキーワードが$objReader->setIncludeCharts(TRUE);

    public function getReportFromTemplate()
    {
        //PHPExelオブジェクトの作成
        $objPHPExcel = new PHPExcel();
        //テンプレートファイルのパス
        $filepath = '/var/www/html/aems/app/tmp/excel/template.xlsx';
        //PHPExcelのリーダー
        $objReader = PHPExcel_IOFactory::createReader('Excel2007');
        /********大事:読み込むファイルにグラフが含まれていることを宣言********/
        $objReader->setIncludeCharts(TRUE);
        /*****************************************************************/        
        //読み込み
        $objPHPExcel  = $objReader->load($filepath);

        //一枚目のシートを選択
        $objWorksheet = $objPHPExcel->getActiveSheet(0);
        $values=[
            [372,102],
            [296,82],
            [700,192],
            [112,774],
            [829,430],
            [872,387],
            [884,342],
            [501,90],
            [203,116],
            [891,364],
            [983,334],
            [100,318],
        ];
        //配列の値を「I4」からExcelに埋めていく
        $objWorksheet->fromArray($values, null, 'I5');

        /********Excelファイル書き出し処理********/
        //Excelファイルの名前
        $fname = 'chartFromTemplate.xlsx';
        //ファイルのサーバでの保存先
        $fpath = '/var/www/html/aems/app/tmp/'.$fname;

        // Excel書き出し用のオブジェクトを作成_Excelのバージョンを指定
        $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
        //書き出すExcelにグラフが含まれていると宣言
        $objWriter->setIncludeCharts(TRUE);
        //サーバ内に保存
        $objWriter->save($fpath);

        // 該当ファイルをHeaderに書き出し
        header('Content-Type: application/force-download');
        header('Content-Length: '.filesize($fpath));
        header('Content-disposition: attachment; filename="'.$fname.'"');
        readfile($fpath);
        /************************************/
    }

注意点

完成図を見て分かるように、グラフのレイアウトがリッチではなくなります。
また、おそらく色々試しているとこんなアラートにたくさん出会ってしまいます。
恐怖のアラート
2015-09-09_13h16_28.png
そして、Excelを開いてみるとグラフがなくなっているグラフが壊れていると思います。
これは、PHPExcelが読み込める(書き出せる)XML以上のグラフの描画をテンプレートにしている場合におきてしまいます。(タブン
エラーとなるパターンはいろいろありますが、一番よく起きそうなのが、テンプレートグラフを以下のように作っていた場合。
2015-09-09_13h15_54.png
その他
* y軸を2種類設定していた場合は、2つ目は消し飛ぶ
* 細かい設定はほぼ消え去る
などなど

テンプレートから出力する場合は簡単なものしかできないご様子。

ここまでしかできないのかなぁ。(タブン)