[2020/06/05] PHP PHPExcel_Chart 1個のチャート上に異なるタイプのグラフ(Bar Chart:棒グラフ、Line Chart:線グラフ、Area Chart:面グラフ)を作成する方法について (No.190)
[2020/06/05] PHP PHPExcel_Chart ワークシート上にチャート(Bar Chart:棒グラフ、複数レベルの項目軸ラベル)を作成する方法について (No.189)
[2020/06/05] PHP PHPExcel_Chart ワークシート上にチャート(Bar Chart:棒グラフ)を作成する方法について (No.188)
[2020/06/04] PHP PHPExcel ワークシート上にチャート(グラフ)を作成する方法について(PHPExcel_Chart) (No.187)
[2020/06/03] PHP PHPExcel エクセルのワークシートのセルへのアクセスについて(行・列指定) (No.186)
-
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
-
今回は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種類のタイプのグラフが生成されています。)
PR -
今回は 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 クラスでチャート・データシリーズの生成。
-
今回は PHPExcel の「ワークシート」の 「セル」へのアクセス を行・列指定で行う方法について説明したいと思います。
以下の記事では、エクセルの行・列指定("A1","B2"など)によるアクセスについて説明しましたが、 今回は行・列指定指定の部分が、行と列指定に分けて行う方法です。
⇒PHP PHPExcel エクセルのワークシートのセルへのアクセスについて
■行・列指定によるセル値の設定
行・列指定によるセル値の設定は、ワークシートの setCellValueByColumnAndRow() メソッドを使用して行うことができます。
または、getCellByColumnAndRow() メソッドでセルオブジェクトを取得してから、セルオブジェクトの setValue() メソッドを呼び出すこともできます。
<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objBook = new PHPExcel(); // シート設定 $objSheet = $objBook->getActiveSheet(); // [A1]セルに文字列設定 $objSheet->setCellValueByColumnAndRow(0, 1, 'ABCDEFG'); // [B2]セルに数値設定 $objSheet->setCellValueByColumnAndRow(1, 2, 123.56); // [C3]セルにBoolean値設定 $objSheet->setCellValueByColumnAndRow(2, 3, TRUE); // [A4]セルに書式設定 $objSheet->setCellValueByColumnAndRow(4, 1, '=IF(C3, CONCATENATE(A1, " ", B2), CONCATENATE(B2, " ", A1))'); // [B8]セルに getCellByColumnAndRow() でセルを取得し、setValue() で文字列設定 $objSheet->getCellByColumnAndRow(1, 8)->setValue('test 行列指定によるセルオブジェクト取得'); // [test3-3-1.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objBook, "Excel2007"); $objWriter->save('test3-3-1.xlsx'); exit(); ?>
setCellValueByColumnAndRow() メソッドは setCellValue($pCoordinate , ...) メソッドの $pCoordinate(エクセル座標文字列:"A1"等) の部分を 列番号と行番号に置き換えたメソッドです。
(ライブラリの内部では行番号と列番号からエクセル座標文字列に変換して処理しています)
尚、行番号は「1」から始まりますが、列番号は「0」から始まります。(0 ⇒ "A", 1 ⇒ "B", 2 ⇒ "C", ... に対応)
出力されたエクセルファイルを見てみると以下の様になります。■行・列指定によるセル値の設定(日付・時刻設定)
日付および時刻の値は、エクセル内では(単純な浮動小数点値)のタイムスタンプとして保持され、数値フォーマットマスクを使用して、その値が表示されます。
よって、セルに日付を保存する場合は、正しい エクセルタイムスタンプ を計算し、数値形式マスクを設定する必要があります。
「PHP PHPExcel エクセルのワークシートのセルへのアクセスについて」 の記事の使用メソッドを行・列指定に変更します。
setCellValue() メソッドは setCellValueByColumnAndRow() メソッドを使用します。
また、getStyle() メソッドは getStyleByColumnAndRow() メソッドを使用します。<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objBook = new PHPExcel(); // シート設定 $objSheet = $objBook->getActiveSheet(); // システム時刻取得 $dateTimeNow = time(); // エクセルタイムスタンプ値に変換 $excelDateValue = PHPExcel_Shared_Date::PHPToExcel($dateTimeNow); // [A1]セルにエクセルタイムスタンプ値設定 $objSheet->setCellValueByColumnAndRow(0, 1, $excelDateValue); // [A1]セルの数値フォーマットに日付時刻の設定(yyyy-mm-dd) $objSheet->getStyleByColumnAndRow(0, 1)->getNumberFormat()->setFormatCode( PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2 ); // [A2]セルにエクセルタイムスタンプ値設定 $objSheet->setCellValueByColumnAndRow(0, 2, $excelDateValue); // [A2]セルの数値フォーマットに日付時刻の設定(yy/mm/dd;@) $objSheet->getStyleByColumnAndRow(0, 2)->getNumberFormat()->setFormatCode( PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDDSLASH ); // [test3-3-2.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objBook, "Excel2007"); $objWriter->save('test3-3-2.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
PHPExcel_Style_NumberFormat は以下の様に定数が宣言されています。const FORMAT_GENERAL = 'General'; const FORMAT_TEXT = '@'; const FORMAT_NUMBER = '0'; const FORMAT_NUMBER_00 = '0.00'; const FORMAT_NUMBER_COMMA_SEPARATED1 = '#,##0.00'; const FORMAT_NUMBER_COMMA_SEPARATED2 = '#,##0.00_-'; const FORMAT_PERCENTAGE = '0%'; const FORMAT_PERCENTAGE_00 = '0.00%'; const FORMAT_DATE_YYYYMMDD2 = 'yyyy-mm-dd'; const FORMAT_DATE_YYYYMMDD = 'yy-mm-dd'; const FORMAT_DATE_DDMMYYYY = 'dd/mm/yy'; const FORMAT_DATE_DMYSLASH = 'd/m/y'; const FORMAT_DATE_DMYMINUS = 'd-m-y'; const FORMAT_DATE_DMMINUS = 'd-m'; const FORMAT_DATE_MYMINUS = 'm-y'; const FORMAT_DATE_XLSX14 = 'mm-dd-yy'; const FORMAT_DATE_XLSX15 = 'd-mmm-yy'; const FORMAT_DATE_XLSX16 = 'd-mmm'; const FORMAT_DATE_XLSX17 = 'mmm-yy'; const FORMAT_DATE_XLSX22 = 'm/d/yy h:mm'; const FORMAT_DATE_DATETIME = 'd/m/y h:mm'; const FORMAT_DATE_TIME1 = 'h:mm AM/PM'; const FORMAT_DATE_TIME2 = 'h:mm:ss AM/PM'; const FORMAT_DATE_TIME3 = 'h:mm'; const FORMAT_DATE_TIME4 = 'h:mm:ss'; const FORMAT_DATE_TIME5 = 'mm:ss'; const FORMAT_DATE_TIME6 = 'h:mm:ss'; const FORMAT_DATE_TIME7 = 'i:s.S'; const FORMAT_DATE_TIME8 = 'h:mm:ss;@'; const FORMAT_DATE_YYYYMMDDSLASH = 'yy/mm/dd;@'; const FORMAT_CURRENCY_USD_SIMPLE = '"$"#,##0.00_-'; const FORMAT_CURRENCY_USD = '$#,##0_-'; const FORMAT_CURRENCY_EUR_SIMPLE = '[$EUR ]#,##0.00_-';
■行・列指定によるセル値の設定(先行ゼロ付きの数値設定)
数値には先行ゼロがないため、先行ゼロのある数値(電話番号など)を設定しようとすると、値が数値にキャストされるため、これらは通常失われます。 そのため「09088881234」は 「9088881234」と表示されます。
PHPExcel にこの動作をさせない様な方法は2つあります。
1つは、数値に変換されないように、データ型を文字列として明示的に設定する方法です。
2つ目は、数値書式マスクを使用して、先行ゼロ付きの値を表示する方法です。
「PHP PHPExcel エクセルのワークシートのセルへのアクセスについて」 の記事の使用メソッドを行・列指定に変更します。
setCellValueExplicit() メソッドは setCellValueExplicitByColumnAndRow() メソッドを使用します。
また、getStyle() メソッドは getStyleByColumnAndRow() メソッドを使用します。<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objBook = new PHPExcel(); // シート設定 $objSheet = $objBook->getActiveSheet(); // [A1]セルにゼロが先頭に有る数値文字列を、文字列として設定 $objSheet->setCellValueExplicitByColumnAndRow( 0, 1, "09088881234", PHPExcel_Cell_DataType::TYPE_STRING ); // [A2]セルに数値設定 $objSheet->setCellValueByColumnAndRow(0, 2, 9088881234); // [A2]セルの数値フォーマットに "00000000000" の設定 $objSheet->getStyleByColumnAndRow(0, 2)->getNumberFormat()->setFormatCode( '00000000000' ); // [A3]セルに数値設定 $objSheet->setCellValueByColumnAndRow(0, 3, 9088881234); // [A3]セルの数値フォーマットに "0000-000-0000" の設定 $objSheet->getStyleByColumnAndRow(0, 3)->getNumberFormat()->setFormatCode( '0000-000-0000' ); // [test3-3-3.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objBook, "Excel2007"); $objWriter->save('test3-3-3.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
■行・列指定によるセル値の設定(配列データの設定)
ワークシートの fromArray メソッドに配列データを渡すことにより、1回の呼び出しでセル範囲に設定することができます。
fromArray メソッドに対応する行・列指定のメソッドが無いため、エクセル座標文字列を PHPExcel_Cell::stringFromColumnIndex() メソッドで作成します。<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objBook = new PHPExcel(); // シート設定 $objSheet = $objBook->getActiveSheet(); // 配列データ $arrData = array( array(NULL, 2018, 2019, 2020), array('Q1', 10, 20, 25), array('Q2', 26, 33, 26), array('Q3', 32, 41, 59), array('Q4', 20, 12, 0), ); // 列と行が指定されたとする $intColumn = 0; $intRow = 2; // [A2]セルの座標値計算 // 列の文字列変換:「0」⇒"A" $strCoordinate = PHPExcel_Cell::stringFromColumnIndex($intColumn); // 行の文字列を付加 $strCoordinate = $strCoordinate.$intRow; // [A2]セルにから配列データ設定 $objSheet->fromArray( $arrData, // 配列データ NULL, // 配列データの中でセルに設定しないNULL値の指定 $strCoordinate // 左上座標(デフォルト:"A1") ); // [test3-3-4.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objBook, "Excel2007"); $objWriter->save('test3-3-4.xlsx'); exit(); ?>
出力されたエクセルファイル[test3-3-4.xlsx]を見てみると以下の様になります。