LoginSignup
31
31

More than 5 years have passed since last update.

PHPExcelでゼロからグラフを書いてみよう

Last updated at Posted at 2015-09-03

関連
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);
    }

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

31
31
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
31