[2020/06/25] PHP PHPExcel エクセルのワークシートのセルの条件付き書式設定について (No.198)
[2020/06/24] PHP PHPExcel エクセルのワークシートのセルのスタイル設定について (No.197)
[2020/06/06] PHP PHPExcel_Chart ワークシートにチャートが存在するエクセルファイル(テンプレート)の系列データ部分を変更し別のファイルとして登録する方法について (No.193)
[2020/06/06] PHP PHPExcel_Chart ワークシート上に円グラフ・チャート(Pie Chart)とドーナツグラフ・チャート(Donut Chart)、及びレーダーチャート(Radar Chart)を作成する方法について (No.192)
[2020/06/06] PHP PHPExcel_Chart エクセルシート上に複数のチャートで異なるタイプのグラフ(Bar Chart:棒グラフ、Line Chart:線グラフ、Area Chart:面グラフ)を作成する方法について (No.191)
-
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
-
今回は PHPExcel で行う「ワークシート」の 「条件付き書式設定」 について説明したいと思います。
「条件付き書式設定」 はエクセルで実際に行う時には以下の様に、メニューの[ホーム]タブの[条件付き書式]-[新しいルール]の順にクリックします。
「条件付き書式」 は以下の6種類がありますが、例としてはリンクのある部分に付いて例を記します。- セルの値に基づいてすべてのセルを書式設定
- 指定の値を含むセルだけを書式設定
- 上位または下位に入る値だけを書式設定
- 平均より上または下の値だけを書式設定
- 一意の値または重複する値だけを書式設定
- 数式を使用して、書式設定するセルを決定
■指定の値を含むセルだけを書式設定
セルに設定されている値によって書式を設定する方法です。
条件付き書式オブジェクトを生成し setConditionType() メソッドで「条件タイプ」を設定し setOperatorType() メソッドで「比較演算タイプ」を設定します。 さらに addCondition() メソッドで「比較対象の指定値」を設定し、最後に動作の書式を設定します。(今回はフォントオブジェクトを使って文字色を変更)
今回は1個のセルに対して2つの条件付き書式を設定する為に、2個の条件付き書式オブジェクトを生成し各設定を行った後で、 対象となるセルの条件付き書式を取得し、そこに作成した2つの条件付き書式を追加しています。
尚、最初の条件はセルの値がマイナスであれば文字色を「赤」に、2つ目の条件はセルの値が0以上であれば文字色を「緑」にします。
<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objBook = new PHPExcel(); // ワークシートオブジェクト $objSheet = $objBook->getActiveSheet(); // 条件付き書式オブジェクト1生成 $objConditional1 = new PHPExcel_Style_Conditional(); // 条件タイプ:「指定の値を含む」 $objConditional1->setConditionType(PHPExcel_Style_Conditional::CONDITION_CELLIS); // 比較演算タイプ:「指定の値より小さい」 $objConditional1->setOperatorType(PHPExcel_Style_Conditional::OPERATOR_LESSTHAN); // 指定値:「0」⇒ (指定値 < 0) $objConditional1->addCondition('0'); // フォント色:「赤」 $objConditional1->getStyle()->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_RED); // 条件付き書式オブジェクト2生成 $objConditional2 = new PHPExcel_Style_Conditional(); // 条件タイプ:「指定の値を含む」 $objConditional2->setConditionType(PHPExcel_Style_Conditional::CONDITION_CELLIS); // 比較演算タイプ:「指定の値以上」 $objConditional2->setOperatorType(PHPExcel_Style_Conditional::OPERATOR_GREATERTHANOREQUAL); // 指定値:「0」⇒ (指定値 ≧ 0) $objConditional2->addCondition('0'); // フォント色:「緑」 $objConditional2->getStyle()->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_GREEN); // セル[B2:B3]の既存のスタイルの取得(結果は array で返る) $arrConditionalStyles = $objSheet->getStyle('B2:B3')->getConditionalStyles(); // 条件付き書式オブジェクト1 array追加 array_push($arrConditionalStyles, $objConditional1); // 条件付き書式オブジェクト2 array追加 array_push($arrConditionalStyles, $objConditional2); // セル[B2:B3]にスタイルの設定 $objSheet->getStyle('B2:B3')->setConditionalStyles($arrConditionalStyles); // [B2]セルにマイナス数値設定 $objSheet->getCell('B2')->setValue('-123'); // [B3]セルにプラス数値設定 $objSheet->getCell('B3')->setValue('1000'); // [test7-2.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objBook, "Excel2007"); $objWriter->save('test7-2.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
PHPExcel_Style_Conditional には以下の様に定数が宣言されています。/* Condition types */ const CONDITION_NONE = 'none'; const CONDITION_CELLIS = 'cellIs'; // セルの値による設定 const CONDITION_CONTAINSTEXT = 'containsText'; const CONDITION_EXPRESSION = 'expression'; // 式による設定?? /* Operator types */ const OPERATOR_NONE = ''; const OPERATOR_BEGINSWITH = 'beginsWith'; const OPERATOR_ENDSWITH = 'endsWith'; const OPERATOR_EQUAL = 'equal'; const OPERATOR_GREATERTHAN = 'greaterThan'; const OPERATOR_GREATERTHANOREQUAL = 'greaterThanOrEqual'; const OPERATOR_LESSTHAN = 'lessThan'; const OPERATOR_LESSTHANOREQUAL = 'lessThanOrEqual'; const OPERATOR_NOTEQUAL = 'notEqual'; const OPERATOR_CONTAINSTEXT = 'containsText'; const OPERATOR_NOTCONTAINS = 'notContains'; const OPERATOR_BETWEEN = 'between';
■数式を使用して、書式設定するセルを決定
数式を使用して書式設定する場合、上の例の様に以下の手順で行います。
条件付き書式オブジェクトを生成し setConditionType() メソッドで「条件タイプ:CONDITION_EXPRESSION」を設定し setOperatorType() メソッドで「比較演算タイプ:OPERATOR_CONTAINSTEXT」を設定します。 さらに addCondition() メソッドで「条件式:$C2="済"」を設定し、最後に動作の書式を設定します。(今回はフォントオブジェクトを使って文字色を変更)
条件付き書式オブジェクトを生成し各設定を行った後で、対象となるセルの条件付き書式を取得し、そこに作成した条件付き書式を追加しています。
尚、今回のやりたいことは、「C」列の値が”済”であれば「B」列を灰色にすることです。
「B2」セルにこの条件付き書式を設定し、その条件付き書式をさらに複製をするようにしました。 ワークシートオブジェクトの duplicateConditionalStyle() メソッドで複製処理を行います。 (後でこの方法では問題があることが発覚しました。)
<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objBook = new PHPExcel(); // ワークシートオブジェクト $objSheet = $objBook->getActiveSheet(); // 条件付き書式オブジェクト1生成 $objConditional1 = new PHPExcel_Style_Conditional(); // 条件タイプ:「数式を使用して、書式設定するセルを決定」 $objConditional1->setConditionType(PHPExcel_Style_Conditional::CONDITION_EXPRESSION); // 比較演算タイプ:「数式の文字列」 $objConditional1->setOperatorType(PHPExcel_Style_Conditional::OPERATOR_CONTAINSTEXT); // 指定値:「$C2="済"」 $objConditional1->addCondition('$C2="済"'); // フォント色:「灰色」 $objConditional1->getStyle()->getFont()->getColor()->setARGB('FF808080'); // セル[B2]の既存の条件付き書式スタイルの取得(結果は array で返る) $arrConditionalStyles = $objSheet->getStyle('B2')->getConditionalStyles(); // 条件付き書式オブジェクト1 array追加 array_push($arrConditionalStyles, $objConditional1); // セル[B2]に条件付き書式の設定 $objSheet->getStyle('B2')->setConditionalStyles($arrConditionalStyles); // 条件付き書式オブジェクトをコピーする $objSheet->duplicateConditionalStyle($objSheet->getConditionalStyles('B2'), 'B3:B4' ); // テストデータ書込み // [B2]セルに値設定 $objSheet->getCell('B2')->setValue('案件001'); $objSheet->getCell('C2')->setValue('済'); // [B3]セルに値設定 $objSheet->getCell('B3')->setValue('案件002'); // [B4]セルに値設定 $objSheet->getCell('B4')->setValue('案件003'); $objSheet->getCell('C4')->setValue('済'); // [test7-6.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objBook, "Excel2007"); $objWriter->save('test7-6.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
このエクセルファイルですが「B3」の所が灰色になっていて、意図したものになっていません。
エクセルで条件付き書式の内容を見てみると、条件式が「B2」セルのものと同じになっていました。
エクセル上で条件付き書式のコピーを行うと、条件式は行の番号に合わせてくれますが、上記のソースではそこまでできない様です。
そこで改良版(改悪版)かもしれませんが、以下に対応する様に変更したソースを載せます。
■数式を使用して、書式設定するセルを決定(改良版)
上記のソースでセル[B2]に対して条件付き書式の設定を行う部分を、各行ごとに繰り返し処理で行う様にします。
<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objBook = new PHPExcel(); // ワークシートオブジェクト $objSheet = $objBook->getActiveSheet(); for($i = 2; $i <=4; $i++) { // 書式設定オブジェクト1生成 $objConditional1 = new PHPExcel_Style_Conditional(); // 書式タイプ:「数式を使用して、書式設定するセルを決定」 $objConditional1->setConditionType(PHPExcel_Style_Conditional::CONDITION_EXPRESSION); // 比較演算タイプ:「数式の文字列」 $objConditional1->setOperatorType(PHPExcel_Style_Conditional::OPERATOR_CONTAINSTEXT); // 指定値:「$C2="済"」 $objConditional1->addCondition('$C'.$i.'="済"'); // フォント色:「灰色」 $objConditional1->getStyle()->getFont()->getColor()->setARGB('FF808080'); // セル[B2]の既存のスタイルの取得(結果は array で返る) $arrConditionalStyles = $objSheet->getStyle('B'.$i)->getConditionalStyles(); // 書式設定オブジェクト1 array追加 array_push($arrConditionalStyles, $objConditional1); // セル[B2]にスタイルの設定 $objSheet->getStyle('B'.$i)->setConditionalStyles($arrConditionalStyles); } // テストデータ書込み // [B2]セルに値設定 $objSheet->getCell('B2')->setValue('案件001'); $objSheet->getCell('C2')->setValue('済'); // [B3]セルに値設定 $objSheet->getCell('B3')->setValue('案件002'); // [B4]セルに値設定 $objSheet->getCell('B4')->setValue('案件003'); $objSheet->getCell('C4')->setValue('済'); // [test7-6-2.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objBook, "Excel2007"); $objWriter->save('test7-6-2.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
エクセルで「B4」セルの条件付き書式の内容を見てみると意図したものになりました。
PR -
今回は PHPExcel で行う「ワークシート」の 「セルのスタイル設定」 について説明したいと思います。
■セルの文字配置、前景色、背景色の設定
セルの文字配置、前景色、背景色等の設定は、ワークシートオブジェクトからスタイルオブジェクトを取得し、 そのスタイルオブジェクトから更に各指定用のオブジェクトを取得し、各値を設定します。
「文字配置・右寄せ」の設定は、スタイルオブジェクトからアライメントオブジェクトを取得し setHorizontal() メソッドを使用して行います。
「前景色」の設定は、スタイルオブジェクトからフォントオブジェクトを取得し、更にフォントオブジェクトから色オブジェクトを取得し setARGB() メソッドを使用して行います。
「背景色」の設定のためにまずは、セルの枠の設定を行います。 スタイルオブジェクトからボーダーオブジェクトを取得し、更にボーダーTop(Bottom,Left,Right)オブジェクトから個別ボーダーオブジェクトを取得し setBorderStyle() メソッドを使用して行います。
「背景色」の設定は、スタイルオブジェクトからフィルオブジェクトを取得し setFillType() メソッドで塗りつぶしのタイプを設定し、 フィルオブジェクトから色オブジェクトを取得し setARGB() メソッドを使用して行います。
<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objBook = new PHPExcel(); // ワークシートオブジェクト $objSheet = $objBook->getActiveSheet(); // スタイルオブジェクト取得([B2]セル) $objStyle = $objSheet->getStyle('B2'); // フォアグランド(前景)色を「白色」に設定 $objStyle->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_WHITE); // 水平アライメントを「右寄せ」に設定 $objStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT); // ボーダーオブジェクト取得([B2]セル) $objBorders = $objStyle->getBorders(); // ボーダー全て(Top, Bottom, Left, Right)を「細い線:BORDER_THICK」に設定 $objBorders->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THICK); $objBorders->getBottom()->setBorderStyle(PHPExcel_Style_Border::BORDER_THICK); $objBorders->getLeft()->setBorderStyle(PHPExcel_Style_Border::BORDER_THICK); $objBorders->getRight()->setBorderStyle(PHPExcel_Style_Border::BORDER_THICK); // フィルオブジェクト取得([B2]セル) $objFill = $objStyle->getFill(); // 背景のタイプを「塗つぶし」に設定 $objFill->setFillType(PHPExcel_Style_Fill::FILL_SOLID); // 背景色を「赤」に設定 $objFill->getStartColor()->setARGB('FFFF0000'); // [B2]セルに文字列設定 $objSheet->setCellValue('B2', 'ABCDEF'); // [test6-1.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objBook, "Excel2007"); $objWriter->save('test6-1.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
PHPExcel_Style_Alignment は以下の様に定数が宣言されています。/* Horizontal alignment styles */ const HORIZONTAL_GENERAL = 'general'; // 標準 const HORIZONTAL_LEFT = 'left'; // 左詰め const HORIZONTAL_RIGHT = 'right'; // 右詰め const HORIZONTAL_CENTER = 'center'; // 中央揃え const HORIZONTAL_CENTER_CONTINUOUS = 'centerContinuous'; // 選択範囲内で中央 const HORIZONTAL_JUSTIFY = 'justify'; // 均等割り付け /* Vertical alignment styles */ const VERTICAL_BOTTOM = 'bottom'; // 下詰め const VERTICAL_TOP = 'top'; // 上詰め const VERTICAL_CENTER = 'center'; // 中央揃え const VERTICAL_JUSTIFY = 'justify'; // 均等割り付け
PHPExcel_Style_Border は以下の様に定数が宣言されています。
/* Border style */ const BORDER_NONE = 'none'; const BORDER_DASHDOT = 'dashDot'; const BORDER_DASHDOTDOT = 'dashDotDot'; const BORDER_DASHED = 'dashed'; const BORDER_DOTTED = 'dotted'; const BORDER_DOUBLE = 'double'; const BORDER_HAIR = 'hair'; const BORDER_MEDIUM = 'medium'; const BORDER_MEDIUMDASHDOT = 'mediumDashDot'; const BORDER_MEDIUMDASHDOTDOT = 'mediumDashDotDot'; const BORDER_MEDIUMDASHED = 'mediumDashed'; const BORDER_SLANTDASHDOT = 'slantDashDot'; const BORDER_THICK = 'thick'; const BORDER_THIN = 'thin';
PHPExcel_Style_Fill は以下の様に定数が宣言されています。
/* Fill types */ const FILL_NONE = 'none'; const FILL_SOLID = 'solid'; const FILL_GRADIENT_LINEAR = 'linear'; const FILL_GRADIENT_PATH = 'path'; const FILL_PATTERN_DARKDOWN = 'darkDown'; const FILL_PATTERN_DARKGRAY = 'darkGray'; const FILL_PATTERN_DARKGRID = 'darkGrid'; const FILL_PATTERN_DARKHORIZONTAL = 'darkHorizontal'; const FILL_PATTERN_DARKTRELLIS = 'darkTrellis'; const FILL_PATTERN_DARKUP = 'darkUp'; const FILL_PATTERN_DARKVERTICAL = 'darkVertical'; const FILL_PATTERN_GRAY0625 = 'gray0625'; const FILL_PATTERN_GRAY125 = 'gray125'; const FILL_PATTERN_LIGHTDOWN = 'lightDown'; const FILL_PATTERN_LIGHTGRAY = 'lightGray'; const FILL_PATTERN_LIGHTGRID = 'lightGrid'; const FILL_PATTERN_LIGHTHORIZONTAL = 'lightHorizontal'; const FILL_PATTERN_LIGHTTRELLIS = 'lightTrellis'; const FILL_PATTERN_LIGHTUP = 'lightUp'; const FILL_PATTERN_LIGHTVERTICAL = 'lightVertical'; const FILL_PATTERN_MEDIUMGRAY = 'mediumGray';
■セルの指定に範囲を設定
ワークシートオブジェクトからスタイルオブジェクトを取得する getStyle() メソッドで セルの範囲を示す引数を渡すことで、複数のセルに対するスタイルオブジェクトが取得できます。
このスタイルオブジェクトを使って、各種のメソッドを使うことでセル範囲のスタイルを一括で設定できます。
<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objBook = new PHPExcel(); // ワークシートオブジェクト $objSheet = $objBook->getActiveSheet(); // スタイルオブジェクト取得([B2~C6の範囲]セル) $objStyle = $objSheet->getStyle('B2:C6'); // フィルオブジェクト取得([B2]セル) $objFill = $objStyle->getFill(); // 背景のタイプを「塗つぶし」に設定 $objFill->setFillType(PHPExcel_Style_Fill::FILL_SOLID); // 背景色を「赤」に設定 $objFill->getStartColor()->setARGB('FFFF0000'); // [test6-2.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objBook, "Excel2007"); $objWriter->save('test6-2.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
■セルのスタイル設定を配列値で設定
ワークシートオブジェクトから取得したスタイルオブジェクトの applyFromArray() メソッドで 設定するスタイルを array() で与えることが出来ます。
<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objBook = new PHPExcel(); // ワークシートオブジェクト $objSheet = $objBook->getActiveSheet(); // 全部のスタイルの定義 $arrStyle = array( 'font' => array( 'bold' => true, ), 'alignment' => array( 'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_RIGHT, ), 'borders' => array( 'top' => array( 'style' => PHPExcel_Style_Border::BORDER_THIN, ), 'bottom' => array( 'style' => PHPExcel_Style_Border::BORDER_THIN, ), 'left' => array( 'style' => PHPExcel_Style_Border::BORDER_THIN, ), 'right' => array( 'style' => PHPExcel_Style_Border::BORDER_THIN, ), ), 'fill' => array( 'type' => PHPExcel_Style_Fill::FILL_SOLID, // 'rotation' => 90, 'startcolor' => array( 'argb' => 'FFA0A0A0', ), // 'endcolor' => array( // 'argb' => 'FFFFFFFF', // ), ), ); // スタイルオブジェクト取得([B2]セル) $objStyle = $objSheet->getStyle('B2'); // スタイルの設定([B2]セル) $objStyle->applyFromArray($arrStyle); // スタイルオブジェクト取得([B2]セル) $objStyle = $objSheet->getStyle('C4:D6'); // スタイルの設定([B2]セル) $objStyle->applyFromArray($arrStyle); // [test6-3.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objBook, "Excel2007"); $objWriter->save('test6-3.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
-
今回は 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]を見てみると以下の様になります。
チャートが参照している系列データを変更すれば、表示されるチャートのグラフは違ったものになります。
このことを利用すれば、テンプレートのエクセルファイルとしてチャート含んだものを登録しておき、 データ部だけを変えるだけで異なるエクセルファイルを出力することができます。
-
今回は先ず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' というのは明らかに指定がおかしいので、 エクセルとしてもチャートの表示ができなかったのでしょう。
皆さんもチャートの位置指定にはご注意ください。