今回は4個のチャート上にそれぞれ「Bar Chart:棒グラフ」「Bar Chart:棒グラフ(積み上げ)」「Line Chart:線グラフ」「Area Chart:面グラフ」のグラフを持つ様にしたいと思います。
- 4個のチャート上にそれぞれ「Bar Chart:棒グラフ」「Bar Chart:棒グラフ(積み上げ)」「Line Chart:線グラフ」「Area Chart:面グラフ」持つ様に作成
- チャートの表示位置でのエラー発生!!
本の紹介では...
PHP8の基本構文から、クラス、DB連携、セキュリティ対策まで、しっかり習得。
PHPプログラミングの標準教科書『独習PHP』が、最新のPHP8に対応。
PHPでWebページ/アプリケーションを開発する際に必要な基礎的な知識、
PHPの基本構文から、クラス、データベース連携、セキュリティまで、詳細かつ丁寧に解説します。
...
■4個のチャート上にそれぞれ「Bar Chart:棒グラフ」「Bar Chart:棒グラフ(積み上げ)」「Line Chart:線グラフ」「Area Chart:面グラフ」持つ様に作成
グラフの対象データとなるものは全て同じものを使うため PhpSpreadsheet\DataSeries クラスで生成する 「系列ラベル」「X軸ラベル」「描画データ」は最初に生成し、共通で参照します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | // チャート用テストデータ生成 $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 DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$B$1' , NULL, 1), //商品1 new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$C$1' , NULL, 1), //商品2 new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$D$1' , NULL, 1), //商品3 ); // X軸ラベルの指定 $arrCategorysDataSeries = array ( new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$A$2:$A$6' , NULL, 5), //2016 to 2020 ); // 描画データの指定 $arrDataSeriesValues = array ( new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$B$2:$B$6' , NULL, 5), //商品1 new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$C$2:$C$6' , NULL, 5), //商品2 new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$D$2:$D$6' , NULL, 5), //商品3 ); |
後は個別にチャートを生成するために以下のオブジェクトを個別に生成します。
- チャート・データシリーズの生成。
- レジェンド生成。(各折れ線の説明を行う)
- チャート・タイトル生成。
- ワークシートにチャート追加。
実際のソースは以下の様になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 | <?php // ライブラリ読込 require '../vendor/autoload.php' ; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Chart\Chart; use PhpOffice\PhpSpreadsheet\Chart\DataSeries; use PhpOffice\PhpSpreadsheet\Chart\DataSeriesValues; use PhpOffice\PhpSpreadsheet\Chart\PlotArea; use PhpOffice\PhpSpreadsheet\Chart\Title; use PhpOffice\PhpSpreadsheet\Chart\Legend; use PhpOffice\PhpSpreadsheet\IOFactory; // Spreadsheetオブジェクト生成 $objSpreadsheet = new Spreadsheet(); // ワークシートオブジェクト取得 $objWorksheet = $objSpreadsheet ->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 DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$B$1' , NULL, 1), //商品1 new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$C$1' , NULL, 1), //商品2 new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$D$1' , NULL, 1), //商品3 ); // X軸ラベルの指定 $arrCategorysDataSeries = array ( new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$A$2:$A$6' , NULL, 5), //2016 to 2020 ); // 描画データの指定 $arrDataSeriesValues = array ( new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$B$2:$B$6' , NULL, 5), //商品1 new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$C$2:$C$6' , NULL, 5), //商品2 new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$D$2:$D$6' , NULL, 5), //商品3 ); //===================== // Bar Chart //===================== // チャート・データシリーズの生成 $objSeries1 = new DataSeries( DataSeries::TYPE_BARCHART, // plotType DataSeries::GROUPING_STANDARD, // plotGrouping range(0, count ( $arrDataSeriesValues ) - 1), // plotOrder $arrDataSeriesLabels , // plotLabel $arrCategorysDataSeries , // plotCategory $arrDataSeriesValues // plotValues ); // プロットエリアにチャート・データシリーズに設定 $objPlotArea1 = new PlotArea(NULL, array ( $objSeries1 )); // レジェンド生成(各折れ線の説明を行う) $objLegend1 = new Legend(Legend::POSITION_TOPRIGHT, NULL, false); // チャート・タイトル生成 $objTitle1 = new Title( '売上データ:Bar Chart' ); // チャート生成 $objChart1 = new 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 DataSeries( DataSeries::TYPE_BARCHART, // plotType DataSeries::GROUPING_PERCENT_STACKED, // plotGrouping range(0, count ( $arrDataSeriesValues ) - 1), // plotOrder $arrDataSeriesLabels , // plotLabel $arrCategorysDataSeries , // plotCategory $arrDataSeriesValues // plotValues ); // プロットエリアにチャート・データシリーズに設定 $objPlotArea2 = new PlotArea(NULL, array ( $objSeries2 )); // レジェンド生成(各折れ線の説明を行う) $objLegend2 = new Legend(Legend::POSITION_TOPRIGHT, NULL, false); // チャート・タイトル生成 $objTitle2 = new Title( '売上データ:Bar Chart:STACKED' ); // チャート生成 $objChart2 = new 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 DataSeries( DataSeries::TYPE_LINECHART, // plotType DataSeries::GROUPING_STANDARD, // plotGrouping range(0, count ( $arrDataSeriesValues ) - 1), // plotOrder $arrDataSeriesLabels , // plotLabel $arrCategorysDataSeries , // plotCategory $arrDataSeriesValues // plotValues ); // プロットエリアにチャート・データシリーズに設定 $objPlotArea3 = new PlotArea(NULL, array ( $objSeries3 )); // レジェンド生成(各折れ線の説明を行う) $objLegend3 = new Legend(Legend::POSITION_TOPRIGHT, NULL, false); // チャート・タイトル生成 $objTitle3 = new Title( '売上データ:Line Chart' ); // チャート生成 $objChart3 = new 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 DataSeries( DataSeries::TYPE_AREACHART, // plotType DataSeries::GROUPING_PERCENT_STACKED, // plotGrouping range(0, count ( $arrDataSeriesValues ) - 1), // plotOrder $arrDataSeriesLabels , // plotLabel $arrCategorysDataSeries , // plotCategory $arrDataSeriesValues // plotValues ); // プロットエリアにチャート・データシリーズに設定 $objPlotArea4 = new PlotArea(NULL, array ( $objSeries4 )); // レジェンド生成(各折れ線の説明を行う) $objLegend4 = new Legend(Legend::POSITION_TOPRIGHT, NULL, false); // チャート・タイトル生成 $objTitle4 = new Title( '売上データ:Area Chart' ); // チャート生成 $objChart4 = new 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 = IOFactory::createWriter( $objSpreadsheet , 'Xlsx' ); $objWriter ->setIncludeCharts(TRUE); $objWriter ->save( 'test-g-5-1.xlsx' ); exit (); ?> |
出力されたエクセルファイルを見てみると以下の様になります。
(4個のチャート上に個別のタイプのグラフが生成されています。)
■チャートの表示位置でのエラー発生!!
上記のソースを作成中に一部間違いをしまして、最後のグラフの出力位置を以下の様にしていました。
1 2 3 4 5 | // ワークシート内のチャート位置設定 $objChart4 ->setTopLeftPosition( 'H21' ); // 左上 $objChart4 ->setBottomRightPosition( 'G33' ); // 右下 // ワークシートにチャート追加 $objWorksheet ->addChart( $objChart4 ); |
このまま気が付かずに実行し「test-g-5-1.xlsx」をエクセルで開いたのですが、以下の様なエラー表示がされました。
チャート位置で「左上」が 'H21' で「右下」が 'G33' というのは明らかに指定がおかしいので、 エクセルとしてもチャートの表示ができなかったのでしょう。
皆さんもチャートの位置指定にはご注意ください。
関連する記事
⇒PHP PhpSpreadsheet ワークシート上にチャート(グラフ)を作成する方法について(PhpSpreadsheetChart)⇒PHP PhpSpreadsheetChart ワークシート上にチャート(Bar Chart:棒グラフ)を作成する方法について
⇒PHP PhpSpreadsheetChart 1個のチャート上に異なるタイプのグラフ(Bar Chart:棒グラフ、Line Chart:線グラフ、Area Chart:面グラフ)を作成する方法について
⇒PHP PhpSpreadsheetChart エクセルシート上に複数のチャートで異なるタイプのグラフ(Bar Chart:棒グラフ、Line Chart:線グラフ、Area Chart:面グラフ)を作成する方法について
⇒PHP PhpSpreadsheetChart ワークシート上に円グラフ・チャート(Pie Chart)とドーナツグラフ・チャート(Donut Chart)、及びレーダーチャート(Radar Chart)を作成する方法について
⇒PHP PhpSpreadsheetChart ワークシートにチャートが存在するエクセルファイル(テンプレート)の系列データ部分を変更し別のファイルとして登録する方法について
⇒PHP PhpSpreadsheetChart エクセルシート上に複数のチャートで異なるタイプのグラフ(Bar Chart:棒グラフ等)の色設定について
ショッピングサイト一通りを最初から自分で作ってみることで、PHPでのシステム開発を学べる入門書です。
コメント