More than 1 year has passed since last update.

関連
PHPExcelでテンプレートファイルからグラフを作ってみよう
【ぇ、使えるの!?】PHPExcel+マクロでグラフ付きExcelを出力

Excel_Reviserが終了し、xlsしか出力できないので、
xlsxで出力したい場合、PHPでExcelをいじる場合はPHPExcelを使うしかない。

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

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

考えられるパターン

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

今回は上記の「1. テンプレートファイル使わない」で行ってみましょう。

サンプルコード

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

完成図

2015-09-03_10h29_22.png

コード

    public function getReport()
    {
        //PHPExelオブジェクトの作成
        $objPHPExcel = new PHPExcel();
        //一枚目のシートを選択
        $objWorksheet = $objPHPExcel->getActiveSheet(0);

        //グラフ描画用の表を作成
        $this->setTable($objWorksheet);

        /*********グラフを描画するための設定と処理************/
        //現在のシートの名前を取得
        $sheetName = $objWorksheet->getTitle();
        //グラフ描画設定
        $options = [
            'title' => 'ChartByPHPExcel',
            'topPos' => 'B2',   //描画するグラフの左上の位置
            'bottomPos' => 'H16',   //描画するグラフの右下の位置
            'labelPos1' => $sheetName.'!$J$4',  //グラフのデータラベル1
            'labelPos2' => $sheetName.'!$K$4',  //グラフのデータラベル2
            'xAxisRange' => $sheetName.'!$I$5:$I$16',   //グラフのx軸の値の範囲
            'dataValueRange1' => $sheetName.'!$J$5:$J$16',  //データラベル1のデータ範囲
            'dataValueRange2' => $sheetName.'!$K$5:$K$16',  //データラベル2のデータ範囲
        ];
        //グラフ描画処理
        $this->drawChart($objWorksheet, $options);
        /********************************************/

        /********Excelファイル書き出し処理********/
        //Excelファイルの名前
        $fname = 'chart.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);
        /************************************/
    }

    //表の描画と値の埋め込み
    private function setTable($objWorksheet)
    {
        //罫線を描画する範囲
        $borderRange = 'I4:K16';
        //指定した範囲の上下左右に罫線を描画
        $objWorksheet
           ->getStyle($borderRange)
           ->getBorders()
           ->getAllBorders()
           ->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);

        //色を変える範囲と色の指定
        $colorRange = 'I4:K4';
        $color = 'ffe699';
        //表の項目部分の色を変更
        $objWorksheet
            ->getStyle($colorRange)
            ->getFill()
            ->setFillType(PHPExcel_Style_Fill::FILL_SOLID)
            ->getStartColor()
            ->setRGB($color);

        //表に埋め込む値
        $values=[
            ['','値A','値B'],
            [1,1358,251],
            [2,1016,869],
            [3,86,318],
            [4,753,1064],
            [5,391,415],
            [6,753,1064],
            [7,843,694],
            [8,869,917],
            [9,1371,739],
            [10,434,521],
            [11,1064,1038],
            [12,1798,492]
        ];
        //配列の値を「I4」からExcelに埋めていく
        $objWorksheet->fromArray($values, null, 'I4');
    }

    //グラフ描画処理
    public function drawChart($objWorksheet, $options)
    {

        // グラフのデータラベル設定
        $dataSeriesLabels1 = [
            new PHPExcel_Chart_DataSeriesValues('String', $options['labelPos1'], null, 1),
            new PHPExcel_Chart_DataSeriesValues('String', $options['labelPos2'], null, 1),
        ];

        // グラフのX軸項目設定
        $xAxisTickValues1 = [
            new PHPExcel_Chart_DataSeriesValues('String', $options['xAxisRange'], null, 4),
        ];

        // グラフの系列設定
        $dataSeriesValues1 = [
            new PHPExcel_Chart_DataSeriesValues('Number', $options['dataValueRange1'], null, 4),
            new PHPExcel_Chart_DataSeriesValues('Number', $options['dataValueRange2'], null, 4),
        ];

        //  グラフ描画設定
        $series1 = new PHPExcel_Chart_DataSeries(
            PHPExcel_Chart_DataSeries::TYPE_LINECHART,              // 折れ線グラフ
            PHPExcel_Chart_DataSeries::GROUPING_STANDARD,           // plotGrouping
            range(0, count($dataSeriesValues1)-1),                  // plotOrder
            $dataSeriesLabels1,                                     // plotLabel
            $xAxisTickValues1,                                      // plotCategory
            $dataSeriesValues1                                      // plotValues
        );

        //  プロットエリアの設定
        $plotarea1 = new PHPExcel_Chart_PlotArea(null, [$series1]);
        //  グラフ内での凡例のポジション設定
        $legend1 = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_BOTTOM, null, false);
        //  y軸のラベル設定
        $yAxisLabel1 = new PHPExcel_Chart_Title('');

        //  タイトルがある場合、タイトルの設定
        $title1 = new PHPExcel_Chart_Title($options['title']);

        //  グラフ作成
        $chart1 = new PHPExcel_Chart(
            'chart1',       // グラフの名前
            $title1,        // グラフタイトル
            $legend1,       // 凡例
            $plotarea1,     // グラフのプロットエリア
            true,           // 表示されているセルだけをプロット
            0,              // 空白セルをどうするか
            null,           // x軸のラベル
            null            // y軸のラベル
        );

        //  グラフがワークシートのどこに描画されるかの設定
        $chart1->setTopLeftPosition($options['topPos']);
        $chart1->setBottomRightPosition($options['bottomPos']);

        //ワークシートにグラフの追加
        $objWorksheet->addChart($chart1);
    }

上手くいくでしょう。(タブン)

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.