忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

PHP PhpSpreadsheet\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でのシステム開発を学べる入門書です。

share











PR

コメント

コメントを書く