関連
PHPExcelでテンプレートファイルからグラフを作ってみよう
【ぇ、使えるの!?】PHPExcel+マクロでグラフ付きExcelを出力
Excel_Reviserが終了し、xlsしか出力できないので、
xlsxで出力したい場合、PHPでExcelをいじる場合はPHPExcelを使うしかない。
PHPExcelでグラフを出力するための備忘録。
目指すは折れ線グラフ
PHPExcelバージョン:1.8.1
Excel:2013
PHP:5.5.27
考えられるパターン
- テンプレートファイル使わない
- テンプレートファイルを使う -> グラフをあらかじめ埋め込んでいるもの
- テンプレートファイルを使う -> マクロ埋め込み
今回は上記の**「1. テンプレートファイル使わない」**で行ってみましょう。
サンプルコード
こちらはCakePHP2.xで書いているので、Cakeなところが残っていたらごめんなさい。
完成図
コード
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);
}
上手くいくでしょう。(タブン)