Edited at

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

More than 3 years have 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);
}

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