-
今回は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' というのは明らかに指定がおかしいので、 エクセルとしてもチャートの表示ができなかったのでしょう。
皆さんもチャートの位置指定にはご注意ください。
PR -
今回は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個のグループとしてラベルが表示されています。 よって年度の部分は切変わり目の先頭の所以外は空白にする必要があります。
-
今回は PHPExcel_Chart で行う「Bar Chart:棒グラフ」の作成方法について説明したいと思います。
以下の記事では「Line Chart:線グラフ」の作成を行いましたが、基本的にこの記事のソースを元にします。
⇒PHP PHPExcel ワークシート上にチャート(グラフ)を作成する方法について(PHPExcel_Chart)
- 単純な「Bar Chart:棒グラフ」を作成する(X軸の単位毎に個別の棒グラフ)
- データ値の積み上げ「Bar Chart:棒グラフ」を作成する(X軸の単位毎にデータ値を加算した棒グラフ)
- 100%データ値の積み上げ「Bar Chart:棒グラフ」を作成する(X軸の単位毎にデータ値の割合を計算した棒グラフ)
■単純な「Bar Chart:棒グラフ」を作成する(X軸の単位毎に個別の棒グラフ)
「Bar Chart:棒グラフ」を作成するには PHPExcel_Chart_DataSeries クラスの生成引数のチャートタイプを TYPE_BARCHART にします。 (「Line Chart:線グラフ」作成ソースでは TYPE_LINECHART の指定でした)
尚、グルーピング定数は NULL としていますが、これは GROUPING_STANDARD の指定と同様です。<?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 ); // チャート・データシリーズの生成 $objSeries = new PHPExcel_Chart_DataSeries( PHPExcel_Chart_DataSeries::TYPE_BARCHART, // plotType NULL, // 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'); // チャート生成 $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-2-1.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007"); $objWriter->setIncludeCharts(TRUE); $objWriter->save('test-g-2-1.xlsx'); exit(); ?>出力されたエクセルファイルを見てみると以下の様になります。 (各年度で各商品毎に別の棒グラフが生成されています。)
■データ値の積み上げ「Bar Chart:棒グラフ」を作成する(X軸の単位毎にデータ値を加算した棒グラフ)
X軸の年度毎にデータ値を積算した「Bar Chart:棒グラフ」を作成するには PHPExcel_Chart_DataSeries クラスの生成引数のチャートタイプを TYPE_BARCHART にし、 グルーピング定数を GROUPING_STACKED の指定にします。
<?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 ); // チャート・データシリーズの生成 $objSeries = new PHPExcel_Chart_DataSeries( PHPExcel_Chart_DataSeries::TYPE_BARCHART, // plotType PHPExcel_Chart_DataSeries::GROUPING_STACKED, // 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(STACKED)'); // チャート生成 $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-2-2.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007"); $objWriter->setIncludeCharts(TRUE); $objWriter->save('test-g-2-2.xlsx'); exit(); ?>出力されたエクセルファイルを見てみると以下の様になります。
(各年度毎に各商品が積み上がった棒グラフが作成されています。)■100%データ値の積み上げ「Bar Chart:棒グラフ」を作成する(X軸の単位毎にデータ値の割合を計算した棒グラフ)
X軸の単位毎にデータ値の割合を計算した「Bar Chart:棒グラフ」を作成するには PHPExcel_Chart_DataSeries クラスの生成引数のチャートタイプを TYPE_BARCHART にし、 グルーピング定数を GROUPING_PERCENT_STACKED の指定にします。
<?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 ); // チャート・データシリーズの生成 $objSeries = 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 ); // プロットエリアにチャート・データシリーズに設定 $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(PERCENT_STACKED)'); // チャート生成 $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-2-3.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007"); $objWriter->setIncludeCharts(TRUE); $objWriter->save('test-g-2-3.xlsx'); exit(); ?>出力されたエクセルファイルを見てみると以下の様になります。
(各年度の合計値の各商品の割合の棒グラフが作成されています。)
-
今回は PHPExcel で行う「チャート」の作成方法について説明したいと思います。
■簡単なチャートを作成する(1個の折れ線グラフ)
簡単なチャートを作成する例として、1個の商品の各年の売り上げの推移を折れ線グラフとして作成してみます。
(テストデータとしては以下の様なデータです)
PHPExcel_Chart を使ったチャートの作成手順は以下の様になります。- PHPExcel_Chart_DataSeries クラスでチャート・データシリーズの生成。
(この前に PHPExcel_Chart_DataSeriesクラスで「描画データ」「X軸ラベル」等を生成し、指定する) - PHPExcel_Chart_PlotAreaクラスでプロットエリアにチャート・データシリーズを設定し、生成。
- プロットエリアを指定し PHPExcel_Chartクラスでチャート生成。
- ワークシートにチャート追加。
- ワークブック登録クラス PHPExcel_Writer_IWriter の setIncludeCharts() メソッドでチャートを含むことを設定。
この手順に従って、以下の様なソースになります。
<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objPHPExcel = new PHPExcel(); // ワークシートオブジェクト取得 $objWorksheet = $objPHPExcel->getActiveSheet(); // チャート用テストデータ生成 $objWorksheet->fromArray( array( array('売上' , 2016, 2017, 2018, 2019, 2020), array('商品1', 12, 15, 21, 18, 20), ) ); // X軸ラベルの指定 $arrCategorysDataSeries = array( new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$B$1:$F$1', NULL, 5), // 2016 to 2020 ); // 描画データの指定 $arrDataSeriesValues = array( new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$B$2:$F$2', NULL, 5), ); // チャート・データシリーズの生成 $objSeries = new PHPExcel_Chart_DataSeries( PHPExcel_Chart_DataSeries::TYPE_LINECHART, // plotType NULL, // plotGrouping range(0, count($arrDataSeriesValues) - 1), // plotOrder NULL, // plotLabel $arrCategorysDataSeries, // plotCategory $arrDataSeriesValues // plotValues ); // プロットエリアにチャート・データシリーズに設定 $objPlotArea = new PHPExcel_Chart_PlotArea(NULL, array($objSeries)); // チャート・タイトル生成 $objTitle = new PHPExcel_Chart_Title('売上データ'); // チャート生成 $objChart = new PHPExcel_Chart( 'chart1', // name $objTitle, // title NULL, // legend $objPlotArea, // plotArea TRUE, // plotVisibleOnly 0, // displayBlanksAs NULL, // xAxisLabel NULL // yAxisLabel ); // ワークシート内のチャート位置設定 $objChart->setTopLeftPosition('A6'); // 左上 $objChart->setBottomRightPosition('G18'); // 右下 // ワークシートにチャート追加 $objWorksheet->addChart($objChart); // [test-g-1.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007"); $objWriter->setIncludeCharts(TRUE); $objWriter->save('test-g-1.xlsx'); exit(); ?>このプログラムで必須のクラスの説明を以下に記します。
PHPExcel_Chart_DataSeries のクラス生成の引数は以下の様に定義されています。PHPExcel_Chart_DataSeries __construct( [ $plotType = null ], // チャートタイプの定数 [ $plotGrouping = null ], // グルーピング定数 [ $plotOrder = array() ], // 描画データの指標の配列 array(0, 1, 2 ...) [ $plotLabel = array() ], // ラベル用配列 (PHPExcel_Chart_DataSeriesValues クラスの配列) [ $plotCategory = array() ], // X軸ラベル用配列 (PHPExcel_Chart_DataSeriesValues クラスの配列) [ $plotValues = array() ], // 描画データ用配列 (PHPExcel_Chart_DataSeriesValues クラスの配列) [ $plotDirection = null ], // 描画方向定数 (内部的デフォルト:DIRECTION_COL) [ $smoothLine = null ], // スムージング指定(折れ線グラフまたは散布図) [ $plotStyle = null ] // 描画スタイル定数 ) // 各定数の定義は以下の通り // チャートタイプ定数の定義 const TYPE_BARCHART = 'barChart'; const TYPE_BARCHART_3D = 'bar3DChart'; const TYPE_LINECHART = 'lineChart'; const TYPE_LINECHART_3D = 'line3DChart'; const TYPE_AREACHART = 'areaChart'; const TYPE_AREACHART_3D = 'area3DChart'; const TYPE_PIECHART = 'pieChart'; const TYPE_PIECHART_3D = 'pie3DChart'; const TYPE_DOUGHTNUTCHART = 'doughnutChart'; const TYPE_DONUTCHART = 'doughnutChart'; const TYPE_SCATTERCHART = 'scatterChart'; const TYPE_SURFACECHART = 'surfaceChart'; const TYPE_SURFACECHART_3D = 'surface3DChart'; const TYPE_RADARCHART = 'radarChart'; const TYPE_BUBBLECHART = 'bubbleChart'; const TYPE_STOCKCHART = 'stockChart'; const TYPE_CANDLECHART = 'stockChart'; // グルーピング定数の定義 const GROUPING_CLUSTERED = 'clustered'; const GROUPING_STACKED = 'stacked'; const GROUPING_PERCENT_STACKED = 'percentStacked'; const GROUPING_STANDARD = 'standard'; // 描画方向定数の定義 const DIRECTION_BAR = 'bar'; const DIRECTION_HORIZONTAL = 'bar'; const DIRECTION_COL = 'col'; const DIRECTION_COLUMN = 'col'; const DIRECTION_VERTICAL = 'col'; // 描画スタイル定数の定義 const STYLE_LINEMARKER = 'lineMarker'; const STYLE_SMOOTHMARKER = 'smoothMarker'; const STYLE_MARKER = 'marker'; const STYLE_FILLED = 'filled';
PHPExcel_Chart_DataSeries のクラス生成の引数の中で重要な 「ラベル」「X軸ラベル」「描画データ」の配列の要素のクラスである PHPExcel_Chart_DataSeriesValues のクラス生成の引数は以下の様に定義されています。PHPExcel_Chart_DataSeries __construct( $dataType = self::DATASERIES_TYPE_NUMBER, // データ型の定数 $dataSource = null, // シリーズ(系列)データの位置指定 $formatCode = null, // フォーマットコード $pointCount = 0, // シリーズ(系列)データの個数 $dataValues = array(), // シリーズ(系列)データを直接指定 $marker = null // ポイントマーカーの指定(文字列) ) // データ型定数の定義 const DATASERIES_TYPE_STRING = 'String'; const DATASERIES_TYPE_NUMBER = 'Number';
シリーズ(系列)データの位置指定はエクセルでのセル範囲(絶対位置:列と行の指定の前に「$」を指定)で指定します。
ポイントマーカーの指定はマーカーの種類を文字列で指定します。以下はマーカーを指定した例を示します。$arrDataSeriesValues = array( new PHPExcel_Chart_DataSeriesValues('Number','Worksheet!$B$2:$F$2',NULL,5,array(),"triangle"),//三角形 new PHPExcel_Chart_DataSeriesValues('Number','Worksheet!$B$2:$F$2',NULL,5,array(),"circle"), //円形 new PHPExcel_Chart_DataSeriesValues('Number','Worksheet!$B$2:$F$2',NULL,5,array(),"diamond"), //ひし形 new PHPExcel_Chart_DataSeriesValues('Number','Worksheet!$B$2:$F$2',NULL,5,array(),"square"), //四角形 new PHPExcel_Chart_DataSeriesValues('Number','Worksheet!$B$2:$F$2',NULL,5,array(),"star"), //アスタリスク new PHPExcel_Chart_DataSeriesValues('Number','Worksheet!$B$2:$F$2',NULL,5,array(),"plus"), //十字 new PHPExcel_Chart_DataSeriesValues('Number','Worksheet!$B$2:$F$2',NULL,5,array(),"none"), //マーカ無 new PHPExcel_Chart_DataSeriesValues('Number','Worksheet!$B$2:$F$2',NULL,5,array(),"dash"), //長い横棒 new PHPExcel_Chart_DataSeriesValues('Number','Worksheet!$B$2:$F$2',NULL,5,array(),"dot"), //短い横棒 new PHPExcel_Chart_DataSeriesValues('Number','Worksheet!$B$2:$F$2',NULL,5,array(),"x"), //×印 );マーカーの指定を行うとサイズはライブラリの仕様でデフォルトで「3」になります。
もし、この「3」を変更したい場合には、ライブラリの「Classes/PHPExcel/Writer/Excel2007/Chart.php」の中を修正する必要があります。
出力されたエクセルファイルを見てみると以下の様になります。■複数の折れ線グラフをチャートに表示
複数の折れ線グラフをチャートに表示するには上のデータに「商品2」「商品3」を追加します。
追加されたデータを描画データの指定で PHPExcel_Chart_DataSeriesValues クラス生成を追加します。<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objPHPExcel = new PHPExcel(); // ワークシートオブジェクト取得 $objWorksheet = $objPHPExcel->getActiveSheet(); // チャート用テストデータ生成 $objWorksheet->fromArray( array( array('売上' , 2016, 2017, 2018, 2019, 2020), array('商品1', 12, 15, 21, 18, 20), array('商品2', 18, 19, 23, 14, 21), //追加 array('商品3', 15, 10, 20, 12, 23), //追加 ) ); // X軸ラベルの指定 $arrCategorysDataSeries = array( new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$B$1:$F$1', NULL, 5), // 2016 to 2020 ); // 描画データの指定 $arrDataSeriesValues = array( new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$B$2:$F$2', NULL, 5), //商品1 new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$B$3:$F$3', NULL, 5), //商品2 追加 new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$B$4:$F$4', NULL, 5), //商品3 追加 ); // チャート・データシリーズの生成 $objSeries = new PHPExcel_Chart_DataSeries( PHPExcel_Chart_DataSeries::TYPE_LINECHART, // plotType NULL, // plotGrouping(PHPExcel_Chart_DataSeries::GROUPING_STANDARD) range(0, count($arrDataSeriesValues) - 1), // plotOrder NULL, // plotLabel $arrCategorysDataSeries, // plotCategory $arrDataSeriesValues // plotValues ); // プロットエリアにチャート・データシリーズに設定 $objPlotArea = new PHPExcel_Chart_PlotArea(NULL, array($objSeries)); // チャート・タイトル生成 $objTitle = new PHPExcel_Chart_Title('売上データ'); // チャート生成 $objChart = new PHPExcel_Chart( 'chart1', // name $objTitle, // title NULL, // legend $objPlotArea, // plotArea TRUE, // plotVisibleOnly 0, // displayBlanksAs NULL, // xAxisLabel NULL // yAxisLabel ); // ワークシート内のチャート位置設定 $objChart->setTopLeftPosition('A6'); // 左上 $objChart->setBottomRightPosition('G18'); // 右下 // ワークシートにチャート追加 $objWorksheet->addChart($objChart); // [test-g-1-2.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007"); $objWriter->setIncludeCharts(TRUE); $objWriter->save('test-g-1-2.xlsx'); exit(); ?>出力されたエクセルファイルを見てみると以下の様になります。
■複数の折れ線グラフをチャートに表示2(描画データの縦横の入替)
上記の例のデータの縦横を入れ替えた場合、つまり売り上げの時間軸が縦方向となり、商品毎の年度ごとの売り上げを1個の列に並べます。
チャート用テストデータ生成の fromArray() では縦横を入れ替えたデータに変更します。
X軸ラベルの指定は、年度の数値なので A列 の 2行目~6行目 で PHPExcel_Chart_DataSeriesValues への範囲設定は Worksheet!$A$2:$A$6 となります。
また、描画データの指定は、各商品毎の数値なので「商品1」であれば B列 の 2行目~6行目 で PHPExcel_Chart_DataSeriesValues への範囲設定は Worksheet!$B$2:$B$6 となります。
尚、各グラフの線が何を指しているのかを表示する為に、系列ラベルの指定を追加で行います。 描画データの指定と同様に、「商品1」「商品2」「商品3」の文字列をそれぞれ PHPExcel_Chart_DataSeriesValues クラスで生成し、配列に設定します。 この配列を PHPExcel_Chart_DataSeries クラスで生成時に plotLabel の引数として指定します。
この系列ラベルをチャート上に表示させるには、 レジェンドクラス PHPExcel_Chart_Legend で生成したオブジェクトを PHPExcel_Chart 生成時に指定する必要があります。
よってソースは以下の様になります。<?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 ); // チャート・データシリーズの生成 $objSeries = new PHPExcel_Chart_DataSeries( PHPExcel_Chart_DataSeries::TYPE_LINECHART, // plotType NULL, // plotGrouping(PHPExcel_Chart_DataSeries::GROUPING_STANDARD) 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('売上データ'); // チャート生成 $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-1-3.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007"); $objWriter->setIncludeCharts(TRUE); $objWriter->save('test-g-1-3.xlsx'); exit(); ?>出力されたエクセルファイルを見てみると以下の様になります。
データの並びは縦横が違いますが、作成されたチャートは、1個前のチャートと同じものが作成されます。
- PHPExcel_Chart_DataSeries クラスでチャート・データシリーズの生成。