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

関連
[【ぇ、使えるの!?】PHPExcel＋マクロでグラフ付きExcelを出力](http://qiita.com/tutida/items/47b31f7f9a7402b2147c)

[PHPExcelでゼロからグラフを書いてみよう  ](http://qiita.com/tutida/items/643baa8832beedd53499)の続き
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](https://qiita-image-store.s3.amazonaws.com/0/74129/bf7b0457-b8bf-926b-3cff-019ab6d2b976.png)

表の値の部分を消しましょう  
![2015-09-09_12h59_42.png](https://qiita-image-store.s3.amazonaws.com/0/74129/41256e12-cd26-1afc-8bee-bfbfda3b84a8.png)

完成。笑

## サンプルコード
こちらはCakePHP2.xで書いているので、Cakeなところが残っていたらごめんなさい。
### 完成図
![2015-09-09_13h06_13.png](https://qiita-image-store.s3.amazonaws.com/0/74129/f663eaae-feac-ead8-9ac9-89f8a9b01c47.png)
### コード
大事なキーワードが`$objReader->setIncludeCharts(TRUE);`

```php
    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](https://qiita-image-store.s3.amazonaws.com/0/74129/dfc75728-4720-183f-0cec-efec313d6c42.png)
そして、Excelを開いてみると**グラフがなくなっている**、**グラフが壊れている**と思います。
これは、PHPExcelが読み込める（書き出せる）XML以上のグラフの描画をテンプレートにしている場合におきてしまいます。（ﾀﾌﾞﾝ
エラーとなるパターンはいろいろありますが、一番よく起きそうなのが、テンプレートグラフを以下のように作っていた場合。
![2015-09-09_13h15_54.png](https://qiita-image-store.s3.amazonaws.com/0/74129/dfe7058c-5f74-9f5a-c767-dabcbe9c7df5.png)
その他
* y軸を2種類設定していた場合は、2つ目は消し飛ぶ
* 細かい設定はほぼ消え去る
などなど
テンプレートから出力する場合は簡単なものしかできないご様子。
---
ここまでしかできないのかなぁ。(ﾀﾌﾞﾝ)