-
今回は PHPExcel_Chart で「Bar Chart:棒グラフ」が作成されているエクセルファイルを読み込み、 そのチャートが参照している系列データ部分を別のデータで書き変えを行う方法を説明します。
おおまかな手順は以下の様になります。- PHPExcel_IOFactory クラスの createReader メソッドで読込みオブジェクトを生成し、エクセルファイルの読込。 (この時 setIncludeCharts(TRUE) メソッドでチャートの存在を指定する)
- ワークシートの fromArray メソッドで系列データを設定。
- PHPExcel_IOFactory クラスの createWriter メソッドで書込みオブジェクトを生成し、エクセルファイルの書込。 (この時 setIncludeCharts(TRUE) メソッドでチャートの存在を指定する)
以下の記事のエクセルファイルを元にします。
⇒PHP PHPExcel_Chart ワークシート上にチャート(Bar Chart:棒グラフ)を作成する方法について
元となるエクセルファイル[test-g-2-1.xlsx]は以下の様になっています。■ワークシートにチャートが存在するエクセルファイル(テンプレート)の系列データ部分を変更し別のファイルとして登録
<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // エクセルファイル読込オブジェクト $objReader = PHPExcel_IOFactory::createReader("Excel2007"); $objReader->setIncludeCharts(TRUE); // PHPExcelオブジェクト取得 $objPHPExcel = $objReader->load("test-g-2-1.xlsx"); // ワークシートオブジェクト取得 $objWorksheet = $objPHPExcel->getActiveSheet(); // チャート用テストデータ上書 $objWorksheet->fromArray( array( array( 22, 38, 19), array( 25, 49, 20), array( 31, 33, 25), array( 28, 44, 42), array( 40, 31, 13), ), NULL, 'B2' ); // エクセルファイル書込オブジェクト $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $objWriter->setIncludeCharts(TRUE); // エクセルファイル書込 $objWriter->save('test-g-7-1.xlsx'); exit(); ?>
出力されたエクセルファイル[test-g-7-1.xlsx]を見てみると以下の様になります。
チャートが参照している系列データを変更すれば、表示されるチャートのグラフは違ったものになります。
このことを利用すれば、テンプレートのエクセルファイルとしてチャート含んだものを登録しておき、 データ部だけを変えるだけで異なるエクセルファイルを出力することができます。
PR -
今回は先ず2個のチャート上にそれぞれ「Pie Chart:円グラフ」「Donut Chart:ドーナツグラフ」のグラフを作成し、 その後で「Radar Chart:レーダーチャート」作成します。
■2個のチャート上にそれぞれ「Pie Chart:円グラフ」「Donut Chart:ドーナツグラフ」のグラフを作成
「Pie Chart:円グラフ」「Donut Chart:ドーナツグラフ」は共に系列データ等の指定方法は同じで、表示される図形が円かドーナツかの違いがあるだけです。
系列データとして設定できるのは1種類のデータの系列のみになります。 以下のテストデータを例にとると、縦方向には「商品1」の「2016~2020の1列のデータ」が対象となります。 同一チャート上に「商品1」及び「商品2」のグラフを「棒グラフ」等の様に同時には表示できません。// チャート用テストデータ生成 $objWorksheet->fromArray( array( array('売上', '商品1', '商品2', '商品3'), array( 2016, 12, 18, 15), array( 2017, 15, 19, 10), array( 2018, 21, 23, 20), array( 2019, 18, 14, 12), array( 2020, 20, 21, 23), ) );
以前は PHPExcel_Chart_PlotArea クラス生成で先頭の引数には「NULL」を指定していましたが、 円グラフの各要素の値を表示するために PHPExcel_Chart_Layout クラスのオブジェクトを生成し、 指定します。
PHPExcel_Chart_Layout クラスの setShowVal メソッドで値表示を指定し setShowPercent メソッドでパーセント表記の指定をします。 (結果、値とパーセントの二つとも表示されます)
実際のソースは以下の様になります。
(「Pie Chart:円グラフ」は「商品1」を「Donut Chart:ドーナツグラフ」は「商品2」を対象とします。)<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objPHPExcel = new PHPExcel(); // ワークシートオブジェクト取得 $objWorksheet = $objPHPExcel->getActiveSheet(); // チャート用テストデータ生成 $objWorksheet->fromArray( array( array('売上', '商品1', '商品2', '商品3'), array( 2016, 12, 18, 15), array( 2017, 15, 19, 10), array( 2018, 21, 23, 20), array( 2019, 18, 14, 12), array( 2020, 20, 21, 23), ) ); //===================== // Pie Chart //===================== // 系列ラベルの指定 $arrDataSeriesLabels1 = array( new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$B$1', NULL, 1), //商品1 ); // X軸ラベルの指定 $arrCategorysDataSeries1 = array( new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A$2:$A$6', NULL, 5), //2016 to 2020 ); // 描画データの指定 $arrDataSeriesValues1 = array( new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$B$2:$B$6', NULL, 5), //商品1 ); // チャート・データシリーズの生成 $objSeries1 = new PHPExcel_Chart_DataSeries( PHPExcel_Chart_DataSeries::TYPE_PIECHART, // plotType NULL, // plotGrouping (円グラフはグループ指定必要無し) range(0, count($arrDataSeriesValues1) - 1), // plotOrder $arrDataSeriesLabels1, // plotLabel $arrCategorysDataSeries1, // plotCategory $arrDataSeriesValues1 // plotValues ); // 円グラフ用のレイアウト設定 $objLayout1 = new PHPExcel_Chart_Layout(); $objLayout1->setShowVal(TRUE); $objLayout1->setShowPercent(TRUE); // プロットエリアにチャート・データシリーズに設定 $objPlotArea1 = new PHPExcel_Chart_PlotArea($objLayout1, array($objSeries1)); // レジェンド生成 $objLegend1 = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_TOPRIGHT, NULL, false); // チャート・タイトル生成 $objTitle1 = new PHPExcel_Chart_Title('Pie Chart:商品1'); // チャート生成 $objChart1 = new PHPExcel_Chart( 'chart1', // name $objTitle1, // title $objLegend1, // legend $objPlotArea1, // plotArea TRUE, // plotVisibleOnly 0, // displayBlanksAs NULL, // xAxisLabel NULL // yAxisLabel ); // ワークシート内のチャート位置設定 $objChart1->setTopLeftPosition('A8'); // 左上 $objChart1->setBottomRightPosition('G20'); // 右下 // ワークシートにチャート追加 $objWorksheet->addChart($objChart1); //===================== // Donut Chart //===================== // 系列ラベルの指定 $arrDataSeriesLabels2 = array( new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$C$2', NULL, 1), //商品2 ); // X軸ラベルの指定 $arrCategorysDataSeries2 = array( new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A$2:$A$6', NULL, 5), //2016 to 2020 ); // 描画データの指定 $arrDataSeriesValues2 = array( new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$C$2:$C$6', NULL, 5), //商品2 ); // チャート・データシリーズの生成 $objSeries2 = new PHPExcel_Chart_DataSeries( PHPExcel_Chart_DataSeries::TYPE_DONUTCHART, // plotType NULL, // plotGrouping (ドーナツグラフはグループ指定必要無し) range(0, count($arrDataSeriesValues2) - 1), // plotOrder $arrDataSeriesLabels2, // plotLabel $arrCategorysDataSeries2, // plotCategory $arrDataSeriesValues2 // plotValues ); // ドーナツグラフ用のレイアウト設定 $objLayout2 = new PHPExcel_Chart_Layout(); $objLayout2->setShowVal(TRUE); $objLayout2->setShowPercent(TRUE); // プロットエリアにチャート・データシリーズに設定 $objPlotArea2 = new PHPExcel_Chart_PlotArea($objLayout2, array($objSeries2)); // レジェンド生成 $objLegend2 = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_TOPRIGHT, NULL, false); // チャート・タイトル生成 $objTitle2 = new PHPExcel_Chart_Title('Donut Chart:商品2'); // チャート生成 $objChart2 = new PHPExcel_Chart( 'chart2', // name $objTitle2, // title $objLegend2, // legend $objPlotArea2, // plotArea TRUE, // plotVisibleOnly 0, // displayBlanksAs NULL, // xAxisLabel NULL // yAxisLabel ); // ワークシート内のチャート位置設定 $objChart2->setTopLeftPosition('H8'); // 左上 $objChart2->setBottomRightPosition('N20'); // 右下 // ワークシートにチャート追加 $objWorksheet->addChart($objChart2); // [test-g-6-1.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007"); $objWriter->setIncludeCharts(TRUE); $objWriter->save('test-g-6-1.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
■「Radar Chart:レーダーチャート」のグラフを作成
「Radar Chart:レーダーチャート」のグラフを作成してみます。
「Radar Chart:レーダーチャート」とは折れ線グラフの線を環状に繋げたイメージです。
「系列ラベル」「X軸ラベル」「系列(描画)データ」は各参照系列ごと対応するものを同じ個数設定します。
実際のソースは以下の様になります。<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objPHPExcel = new PHPExcel(); // ワークシートオブジェクト取得 $objWorksheet = $objPHPExcel->getActiveSheet(); // チャート用テストデータ生成 $objWorksheet->fromArray( array( array('売上', '商品1', '商品2', '商品3'), array( 2016, 12, 18, 15), array( 2017, 15, 19, 10), array( 2018, 21, 23, 20), array( 2019, 18, 14, 12), array( 2020, 20, 21, 23), ) ); // 系列ラベルの指定 $arrDataSeriesLabels = array( new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$B$1', NULL, 1), //商品1 new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$C$1', NULL, 1), //商品2 new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$D$1', NULL, 1), //商品3 ); // X軸ラベルの指定 $arrCategorysDataSeries = array( new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A$2:$A$6', NULL, 5), //2016 to 2020 new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A$2:$A$6', NULL, 5), //2016 to 2020 new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A$2:$A$6', NULL, 5), //2016 to 2020 ); // 描画データの指定 $arrDataSeriesValues = array( new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$B$2:$B$6', NULL, 5), //商品1 new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$C$2:$C$6', NULL, 5), //商品2 new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$D$2:$D$6', NULL, 5), //商品3 ); // チャート・データシリーズの生成 $objSeries = new PHPExcel_Chart_DataSeries( PHPExcel_Chart_DataSeries::TYPE_RADARCHART, // plotType NULL, // plotGrouping (レーダーチャートはグループ指定必要無し) range(0, count($arrDataSeriesValues) - 1), // plotOrder $arrDataSeriesLabels, // plotLabel $arrCategorysDataSeries, // plotCategory $arrDataSeriesValues, // plotValues NULL, // plotDirection NULL, // smooth line PHPExcel_Chart_DataSeries::STYLE_MARKER // plotStyle ); // プロットエリアにチャート・データシリーズに設定 $objPlotArea = new PHPExcel_Chart_PlotArea(NULL, array($objSeries)); // レジェンド生成 $objLegend = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_TOPRIGHT, NULL, false); // チャート・タイトル生成 $objTitle = new PHPExcel_Chart_Title('Radar Chart'); // チャート生成 $objChart = new PHPExcel_Chart( 'chart1', // name $objTitle, // title $objLegend, // legend $objPlotArea, // plotArea TRUE, // plotVisibleOnly 0, // displayBlanksAs NULL, // xAxisLabel NULL // yAxisLabel ); // ワークシート内のチャート位置設定 $objChart->setTopLeftPosition('A8'); // 左上 $objChart->setBottomRightPosition('F20'); // 右下 // ワークシートにチャート追加 $objWorksheet->addChart($objChart); // [test-g-6-2.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007"); $objWriter->setIncludeCharts(TRUE); $objWriter->save('test-g-6-2.xlsx'); ?>
出力されたエクセルファイルを見てみると以下の様になります。
-
今回は4個のチャート上にそれぞれ「Bar Chart:棒グラフ」「Bar Chart:棒グラフ(積み上げ)」「Line Chart:線グラフ」「Area Chart:面グラフ」のグラフを持つ様にしたいと思います。
- 4個のチャート上にそれぞれ「Bar Chart:棒グラフ」「Bar Chart:棒グラフ(積み上げ)」「Line Chart:線グラフ」「Area Chart:面グラフ」持つ様に作成
- チャートの表示位置でのエラー発生!!
■4個のチャート上にそれぞれ「Bar Chart:棒グラフ」「Bar Chart:棒グラフ(積み上げ)」「Line Chart:線グラフ」「Area Chart:面グラフ」持つ様に作成
グラフの対象データとなるものは全て同じものを使うため PHPExcel_Chart_DataSeries クラスで生成する 「系列ラベル」「X軸ラベル」「描画データ」は最初に生成し、共通で参照します。
// チャート用テストデータ生成 $objWorksheet->fromArray( array( array('売上', '商品1', '商品2', '商品3'), array( 2016, 12, 18, 15), array( 2017, 15, 19, 10), array( 2018, 21, 23, 20), array( 2019, 18, 14, 12), array( 2020, 20, 21, 23), ) ); // 系列ラベルの指定 $arrDataSeriesLabels = array( new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$B$1', NULL, 1), //商品1 new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$C$1', NULL, 1), //商品2 new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$D$1', NULL, 1), //商品3 ); // X軸ラベルの指定 $arrCategorysDataSeries = array( new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A$2:$A$6', NULL, 5), //2016 to 2020 ); // 描画データの指定 $arrDataSeriesValues = array( new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$B$2:$B$6', NULL, 5), //商品1 new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$C$2:$C$6', NULL, 5), //商品2 new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$D$2:$D$6', NULL, 5), //商品3 );
後は個別にチャートを生成するために以下のオブジェクトを個別に生成します。
- チャート・データシリーズの生成。
- レジェンド生成。(各折れ線の説明を行う)
- チャート・タイトル生成。
- ワークシートにチャート追加。
実際のソースは以下の様になります。
<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objPHPExcel = new PHPExcel(); // ワークシートオブジェクト取得 $objWorksheet = $objPHPExcel->getActiveSheet(); // チャート用テストデータ生成 $objWorksheet->fromArray( array( array('売上', '商品1', '商品2', '商品3'), array( 2016, 12, 18, 15), array( 2017, 15, 19, 10), array( 2018, 21, 23, 20), array( 2019, 18, 14, 12), array( 2020, 20, 21, 23), ) ); // 系列ラベルの指定 $arrDataSeriesLabels = array( new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$B$1', NULL, 1), //商品1 new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$C$1', NULL, 1), //商品2 new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$D$1', NULL, 1), //商品3 ); // X軸ラベルの指定 $arrCategorysDataSeries = array( new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A$2:$A$6', NULL, 5), //2016 to 2020 ); // 描画データの指定 $arrDataSeriesValues = array( new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$B$2:$B$6', NULL, 5), //商品1 new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$C$2:$C$6', NULL, 5), //商品2 new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$D$2:$D$6', NULL, 5), //商品3 ); //===================== // Bar Chart //===================== // チャート・データシリーズの生成 $objSeries1 = new PHPExcel_Chart_DataSeries( PHPExcel_Chart_DataSeries::TYPE_BARCHART, // plotType PHPExcel_Chart_DataSeries::GROUPING_STANDARD, // plotGrouping range(0, count($arrDataSeriesValues) - 1), // plotOrder $arrDataSeriesLabels, // plotLabel $arrCategorysDataSeries, // plotCategory $arrDataSeriesValues // plotValues ); // プロットエリアにチャート・データシリーズに設定 $objPlotArea1 = new PHPExcel_Chart_PlotArea(NULL, array($objSeries1)); // レジェンド生成(各折れ線の説明を行う) $objLegend1 = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_TOPRIGHT, NULL, false); // チャート・タイトル生成 $objTitle1 = new PHPExcel_Chart_Title('売上データ:Bar Chart'); // チャート生成 $objChart1 = new PHPExcel_Chart( 'chart1', // name $objTitle1, // title $objLegend1, // legend $objPlotArea1, // plotArea TRUE, // plotVisibleOnly 0, // displayBlanksAs NULL, // xAxisLabel NULL // yAxisLabel ); // ワークシート内のチャート位置設定 $objChart1->setTopLeftPosition('A8'); // 左上 $objChart1->setBottomRightPosition('G20'); // 右下 // ワークシートにチャート追加 $objWorksheet->addChart($objChart1); //===================== // Bar Chart:STACKED //===================== // チャート・データシリーズの生成 $objSeries2 = new PHPExcel_Chart_DataSeries( PHPExcel_Chart_DataSeries::TYPE_BARCHART, // plotType PHPExcel_Chart_DataSeries::GROUPING_PERCENT_STACKED, // plotGrouping range(0, count($arrDataSeriesValues) - 1), // plotOrder $arrDataSeriesLabels, // plotLabel $arrCategorysDataSeries, // plotCategory $arrDataSeriesValues // plotValues ); // プロットエリアにチャート・データシリーズに設定 $objPlotArea2 = new PHPExcel_Chart_PlotArea(NULL, array($objSeries2)); // レジェンド生成(各折れ線の説明を行う) $objLegend2 = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_TOPRIGHT, NULL, false); // チャート・タイトル生成 $objTitle2 = new PHPExcel_Chart_Title('売上データ:Bar Chart:STACKED'); // チャート生成 $objChart2 = new PHPExcel_Chart( 'chart2', // name $objTitle2, // title $objLegend2, // legend $objPlotArea2, // plotArea TRUE, // plotVisibleOnly 0, // displayBlanksAs NULL, // xAxisLabel NULL // yAxisLabel ); // ワークシート内のチャート位置設定 $objChart2->setTopLeftPosition('H8'); // 左上 $objChart2->setBottomRightPosition('N20'); // 右下 // ワークシートにチャート追加 $objWorksheet->addChart($objChart2); //===================== // Line Chart //===================== // チャート・データシリーズの生成 $objSeries3 = new PHPExcel_Chart_DataSeries( PHPExcel_Chart_DataSeries::TYPE_LINECHART, // plotType PHPExcel_Chart_DataSeries::GROUPING_STANDARD, // plotGrouping range(0, count($arrDataSeriesValues) - 1), // plotOrder $arrDataSeriesLabels, // plotLabel $arrCategorysDataSeries, // plotCategory $arrDataSeriesValues // plotValues ); // プロットエリアにチャート・データシリーズに設定 $objPlotArea3 = new PHPExcel_Chart_PlotArea(NULL, array($objSeries3)); // レジェンド生成(各折れ線の説明を行う) $objLegend3 = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_TOPRIGHT, NULL, false); // チャート・タイトル生成 $objTitle3 = new PHPExcel_Chart_Title('売上データ:Line Chart'); // チャート生成 $objChart3 = new PHPExcel_Chart( 'chart3', // name $objTitle3, // title $objLegend3, // legend $objPlotArea3, // plotArea TRUE, // plotVisibleOnly 0, // displayBlanksAs NULL, // xAxisLabel NULL // yAxisLabel ); // ワークシート内のチャート位置設定 $objChart3->setTopLeftPosition('A21'); // 左上 $objChart3->setBottomRightPosition('G33'); // 右下 // ワークシートにチャート追加 $objWorksheet->addChart($objChart3); //===================== // Area Chart //===================== // チャート・データシリーズの生成 $objSeries4 = new PHPExcel_Chart_DataSeries( PHPExcel_Chart_DataSeries::TYPE_AREACHART, // plotType PHPExcel_Chart_DataSeries::GROUPING_PERCENT_STACKED, // plotGrouping range(0, count($arrDataSeriesValues) - 1), // plotOrder $arrDataSeriesLabels, // plotLabel $arrCategorysDataSeries, // plotCategory $arrDataSeriesValues // plotValues ); // プロットエリアにチャート・データシリーズに設定 $objPlotArea4 = new PHPExcel_Chart_PlotArea(NULL, array($objSeries4)); // レジェンド生成(各折れ線の説明を行う) $objLegend4 = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_TOPRIGHT, NULL, false); // チャート・タイトル生成 $objTitle4 = new PHPExcel_Chart_Title('売上データ:Area Chart'); // チャート生成 $objChart4 = new PHPExcel_Chart( 'chart4', // name $objTitle4, // title $objLegend4, // legend $objPlotArea4, // plotArea TRUE, // plotVisibleOnly 0, // displayBlanksAs NULL, // xAxisLabel NULL // yAxisLabel ); // ワークシート内のチャート位置設定 $objChart4->setTopLeftPosition('H21'); // 左上 $objChart4->setBottomRightPosition('N33'); // 右下 // ワークシートにチャート追加 $objWorksheet->addChart($objChart4); // [test-g-5-1.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007"); $objWriter->setIncludeCharts(TRUE); $objWriter->save('test-g-5-1.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
(4個のチャート上に個別のタイプのグラフが生成されています。)■チャートの表示位置でのエラー発生!!
上記のソースを作成中に一部間違いをしまして、最後のグラフの出力位置を以下の様にしていました。
// ワークシート内のチャート位置設定 $objChart4->setTopLeftPosition('H21'); // 左上 $objChart4->setBottomRightPosition('G33'); // 右下 // ワークシートにチャート追加 $objWorksheet->addChart($objChart4);
このまま気が付かずに実行し「test-g-5-1.xlsx」をエクセルで開いたのですが、以下の様なエラー表示がされました。
チャート位置で「左上」が 'H21' で「右下」が 'G33' というのは明らかに指定がおかしいので、 エクセルとしてもチャートの表示ができなかったのでしょう。
皆さんもチャートの位置指定にはご注意ください。
-
今回は1個のチャート上に「Bar Chart:棒グラフ」「Line Chart:線グラフ」「Area Chart:面グラフ」を持つ様にしたいと思います。
■「Bar Chart:棒グラフ」「Line Chart:線グラフ」「Area Chart:面グラフ」を持つチャートを作成
商品1~3をそれぞれ「Bar Chart:棒グラフ」「Line Chart:線グラフ」「Area Chart:面グラフ」で表示します。
商品1~3毎に PHPExcel_Chart_DataSeries クラスでチャート・データシリーズの生成を行います。
この時それぞれ別に PHPExcel_Chart_DataSeriesValues クラスで描画データの指定の配列を生成しておきます。
プロットエリアオブジェクト生成に、商品1~3のチャート・データシリーズを配列にして指定します。 その後、このプロットエリアオブジェクトをチャート生成時に指定すれば3個のグラフを指定したことになります。
その他の処理は今までのものとさほど変わりがありません。<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objPHPExcel = new PHPExcel(); // ワークシートオブジェクト取得 $objWorksheet = $objPHPExcel->getActiveSheet(); // チャート用テストデータ生成 $objWorksheet->fromArray( array( array('売上', '商品1', '商品2', '商品3'), array( 2016, 12, 18, 15), array( 2017, 15, 19, 10), array( 2018, 21, 23, 20), array( 2019, 18, 14, 12), array( 2020, 20, 21, 23), ) ); // 系列ラベルの指定 $arrDataSeriesLabels1 = array( new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$B$1', NULL, 1), //商品1 ); $arrDataSeriesLabels2 = array( new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$C$1', NULL, 1), //商品2 ); $arrDataSeriesLabels3 = array( new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$D$1', NULL, 1), //商品3 ); // X軸ラベルの指定 $arrCategorysDataSeries = array( new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A$2:$A$6', NULL, 5), //2016 to 2020 ); // 商品1:描画データの指定 $arrDataSeriesValues1 = array( new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$B$2:$B$6', NULL, 5), //商品1 ); // 商品1:チャート・データシリーズの生成 $objSeries1 = new PHPExcel_Chart_DataSeries( PHPExcel_Chart_DataSeries::TYPE_BARCHART, // plotType PHPExcel_Chart_DataSeries::GROUPING_CLUSTERED, // plotGrouping range(0, count($arrDataSeriesValues1) - 1), // plotOrder $arrDataSeriesLabels1, // plotLabel $arrCategorysDataSeries, // plotCategory $arrDataSeriesValues1 // plotValues ); // 商品2:描画データの指定 $arrDataSeriesValues2 = array( new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$C$2:$C$6', NULL, 5), //商品2 ); // 商品2:チャート・データシリーズの生成 $objSeries2 = new PHPExcel_Chart_DataSeries( PHPExcel_Chart_DataSeries::TYPE_LINECHART, // plotType PHPExcel_Chart_DataSeries::GROUPING_STANDARD, // plotGrouping range(0, count($arrDataSeriesValues2) - 1), // plotOrder $arrDataSeriesLabels2, // plotLabel $arrCategorysDataSeries, // plotCategory $arrDataSeriesValues2 // plotValues ); // 商品3:描画データの指定 $arrDataSeriesValues3 = array( new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$D$2:$D$6', NULL, 5), //商品3 ); // 商品3:チャート・データシリーズの生成 $objSeries3 = new PHPExcel_Chart_DataSeries( PHPExcel_Chart_DataSeries::TYPE_AREACHART, // plotType PHPExcel_Chart_DataSeries::GROUPING_STANDARD, // plotGrouping range(0, count($arrDataSeriesValues3) - 1), // plotOrder $arrDataSeriesLabels3, // plotLabel $arrCategorysDataSeries, // plotCategory $arrDataSeriesValues3 // plotValues ); // プロットエリアにチャート・データシリーズに設定 $objPlotArea = new PHPExcel_Chart_PlotArea(NULL, array($objSeries1, $objSeries2, $objSeries3)); // レジェンド生成(各折れ線の説明を行う) $objLegend = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_TOPRIGHT, NULL, false); // チャート・タイトル生成 $objTitle = new PHPExcel_Chart_Title('3種類-Chart'); // チャート生成 $objChart = new PHPExcel_Chart( 'chart1', // name $objTitle, // title $objLegend, // legend $objPlotArea, // plotArea TRUE, // plotVisibleOnly 0, // displayBlanksAs NULL, // xAxisLabel NULL // yAxisLabel ); // ワークシート内のチャート位置設定 $objChart->setTopLeftPosition('A8'); // 左上 $objChart->setBottomRightPosition('G20'); // 右下 // ワークシートにチャート追加 $objWorksheet->addChart($objChart); // [test-g-4-1.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007"); $objWriter->setIncludeCharts(TRUE); $objWriter->save('test-g-4-1.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
(1個のチャート上に3種類のタイプのグラフが生成されています。)
-
今回は PHPExcel_Chart で行う「Bar Chart:棒グラフ」において「複数レベルの項目軸ラベル」を持つ様に作成したいと思います。
以下の記事では単純な「Bar Chart:線グラフ」の作成を行いましたが、基本的にこの記事のソースを元にします。
⇒PHP PHPExcel_Chart ワークシート上にチャート(Bar Chart:棒グラフ)を作成する方法について
■複数レベルの項目軸ラベルを持つ「Bar Chart:棒グラフ」を作成する
単純な「Bar Chart:線グラフ」では3個の商品の各年度毎のデータでチャートを作成しました。 今回はこの年度内の四半期毎の詳細をデータに与えてチャートを作成してみます。
// 年度毎のみのチャート用テストデータ生成 $objWorksheet->fromArray( array( array('売上', '商品1', '商品2', '商品3'), array( 2016, 12, 18, 15), array( 2017, 15, 19, 10), array( 2018, 21, 23, 20), array( 2019, 18, 14, 12), array( 2020, 20, 21, 23), ) );
このデータ作成の部分を以下の様に変更します。
// チャート用テストデータ生成 $objWorksheet->fromArray( array( // [A] [B] [C] [D] [E] array('売上', '四半期', '商品1', '商品2', '商品3'), // 1 array('2016', 'Q1', 101, 158, 115), // 2 array('' , 'Q2', 50, 109, 170), // 3 array('' , 'Q3', 80, 123, 120), // 4 array('' , 'Q4', 90, 114, 90), // 5 array('2017', 'Q1', 120, 118, 115), // 6 array('' , 'Q2', 60, 119, 110), // 7 array('' , 'Q3', 10, 83, 120), // 8 array('' , 'Q4', 50, 114, 80), // 9 array('2018', 'Q1', 80, 121, 123), //10 array('' , 'Q2', 90, 98, 85), //11 array('' , 'Q3', 115, 100, 90), //12 array('' , 'Q4', 121, 54, 120), //13 array('2019', 'Q1', 125, 114, 82), //14 array('' , 'Q2', 110, 121, 73), //15 array('' , 'Q3', 100, 118, 85), //16 array('' , 'Q4', 90, 119, 70), //17 ) );
「Bar Chart:棒グラフ」を作成するには PHPExcel_Chart_DataSeries クラスの生成引数のチャートタイプを TYPE_BARCHART にします。
尚、グルーピング定数は GROUPING_CLUSTERED の指定します。<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objPHPExcel = new PHPExcel(); // ワークシートオブジェクト取得 $objWorksheet = $objPHPExcel->getActiveSheet(); // チャート用テストデータ生成 $objWorksheet->fromArray( array( // [A] [B] [C] [D] [E] array('売上', '四半期', '商品1', '商品2', '商品3'), // 1 array('2016', 'Q1', 101, 158, 115), // 2 array('' , 'Q2', 50, 109, 170), // 3 array('' , 'Q3', 80, 123, 120), // 4 array('' , 'Q4', 90, 114, 90), // 5 array('2017', 'Q1', 120, 118, 115), // 6 array('' , 'Q2', 60, 119, 110), // 7 array('' , 'Q3', 10, 83, 120), // 8 array('' , 'Q4', 50, 114, 80), // 9 array('2018', 'Q1', 80, 121, 123), //10 array('' , 'Q2', 90, 98, 85), //11 array('' , 'Q3', 115, 100, 90), //12 array('' , 'Q4', 121, 54, 120), //13 array('2019', 'Q1', 125, 114, 82), //14 array('' , 'Q2', 110, 121, 73), //15 array('' , 'Q3', 100, 118, 85), //16 array('' , 'Q4', 90, 119, 70), //17 ) ); // 系列ラベルの指定 $arrDataSeriesLabels = array( new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$C$1', NULL, 1), //商品1 new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$D$1', NULL, 1), //商品2 new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$E$1', NULL, 1), //商品3 ); // X軸ラベルの指定 $arrCategorysDataSeries = array( new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A$2:$B$17', NULL, 12), //2016~2019に対するQ1~Q4 ); // 描画データの指定 $arrDataSeriesValues = array( new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$C$2:$C$17', NULL, 12), //商品1 new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$D$2:$D$17', NULL, 12), //商品2 new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$E$2:$E$17', NULL, 12), //商品3 ); // チャート・データシリーズの生成 $objSeries = new PHPExcel_Chart_DataSeries( PHPExcel_Chart_DataSeries::TYPE_BARCHART, // plotType PHPExcel_Chart_DataSeries::GROUPING_CLUSTERED, // plotGrouping range(0, count($arrDataSeriesValues) - 1), // plotOrder $arrDataSeriesLabels, // plotLabel $arrCategorysDataSeries, // plotCategory $arrDataSeriesValues // plotValues ); // プロットエリアにチャート・データシリーズに設定 $objPlotArea = new PHPExcel_Chart_PlotArea(NULL, array($objSeries)); // レジェンド生成(各折れ線の説明を行う) $objLegend = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_TOPRIGHT, NULL, false); // チャート・タイトル生成 $objTitle = new PHPExcel_Chart_Title('Bar Chart(CLUSTERED)'); // チャート生成 $objChart = new PHPExcel_Chart( 'chart1', // name $objTitle, // title $objLegend, // legend $objPlotArea, // plotArea TRUE, // plotVisibleOnly 0, // displayBlanksAs NULL, // xAxisLabel NULL // yAxisLabel ); // ワークシート内のチャート位置設定 $objChart->setTopLeftPosition('G2'); // 左上 $objChart->setBottomRightPosition('P20'); // 右下 // ワークシートにチャート追加 $objWorksheet->addChart($objChart); // [test-g-3-1.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007"); $objWriter->setIncludeCharts(TRUE); $objWriter->save('test-g-3-1.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。 (各年度で各商品毎に別の棒グラフが生成されています。)
■複数レベルの項目軸ラベルが適切ではない場合
上のソースで「チャート用テストデータ生成」を以下の様にすると、項目軸ラベルがうまく表示されません。
// チャート用テストデータ生成 $objWorksheet->fromArray( array( // [A] [B] [C] [D] [E] array('売上', '四半期', '商品1', '商品2', '商品3'), // 1 array('2016', 'Q1', 101, 158, 115), // 2 array('' , 'Q2', 50, 109, 170), // 3 array('2016', 'Q3', 80, 123, 120), // 4 array('' , 'Q4', 90, 114, 90), // 5 array('2017', 'Q1', 120, 118, 115), // 6 array('' , 'Q2', 60, 119, 110), // 7 array('' , 'Q3', 10, 83, 120), // 8 array('2017', 'Q4', 50, 114, 80), // 9 array('2018', 'Q1', 80, 121, 123), //10 array('2018', 'Q2', 90, 98, 85), //11 array('' , 'Q3', 115, 100, 90), //12 array('2018', 'Q4', 121, 54, 120), //13 array('2019', 'Q1', 125, 114, 82), //14 array('2019', 'Q2', 110, 121, 73), //15 array('2019', 'Q3', 100, 118, 85), //16 array('2019', 'Q4', 90, 119, 70), //17 ) );
出力されたエクセルファイルを見てみると以下の様になります。
年度の列で文字列が存在するセルから、次の文字列が存在するセルの直前までを1個のグループとしてラベルが表示されています。 よって年度の部分は切変わり目の先頭の所以外は空白にする必要があります。