[2020/07/27] PHP PhpSpreadsheet エクセルのワークシートのセルのデータ入力規則設定について (No.213)
[2020/07/27] PHP PhpSpreadsheet エクセルのワークシートのセルの条件付き書式設定について (No.212)
[2020/07/23] PHP PhpSpreadsheet エクセルのワークシートのセルのスタイル設定について (No.211)
[2020/07/23] PHP PhpSpreadsheet エクセルのワークシートの紙の大きさやページ設定について (No.210)
[2020/07/15] PHP PhpSpreadsheet エクセルのワークシートのセルへのアクセスについて(行・列指定) (No.209)
-
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
-
今回は PhpSpreadsheet で行う「ワークシート」の「セル」の 「データ入力規則設定」 について説明したいと思います。
データ入力規則 は特定のセルに挿入できるデータの入力フィルターを指定できます。 このフィルターは範囲、及びリストあります。 例えば、範囲の場合は『値は「1」から「10」の間でなければなならない』であったり、リストの場合は『指定されたリストから値を選択する』ことです。■セルに範囲入力設定
セルに入力規則として値の範囲を設定します。
ワークシートオブジェクト の getCell() メソッドで セルオブジェクト を取得し セルオブジェクト の getDataValidation() メソッドで セル入力規則オブジェクト を取得します。
セル入力規則オブジェクト の各種メソッドにより「入力規則タイプ」「入力エラータイプ」「入力メッセージ」「エラーメッセージ」及び「上下限値」の 設定を行います。
以下のソースは「B3」セルに入力範囲「1」~「10」を設定します。
<?php // ライブラリ読込 require '../vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Cell\DataValidation; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // Spreadsheetオブジェクト生成 $objSpreadsheet = new Spreadsheet(); // ワークシートオブジェクト $objSheet = $objSpreadsheet->getActiveSheet(); // セル[B3]の入力規則オブジェクト取得 $objValidation = $objSheet->getCell('B3')->getDataValidation(); // 入力規則タイプの設定 $objValidation->setType( DataValidation::TYPE_WHOLE); // 入力エラータイプの設定 $objValidation->setErrorStyle( DataValidation::STYLE_STOP); // 空白(ブランク)入力の許可設定 $objValidation->setAllowBlank(true); // 入力メッセージの表示設定 $objValidation->setShowInputMessage(true); // エラーメッセージの表示設定 $objValidation->setShowErrorMessage(true); // エラーメッセージのダイアログのタイトル設定 $objValidation->setErrorTitle('入力エラー'); // エラーメッセージ設定 $objValidation->setError('入力データが間違っています。'); // プロンプトのタイトル設定 $objValidation->setPromptTitle('データ入力について'); // プロンプトのエラーメッセージ設定 $objValidation->setPrompt('値範囲は[1]から[10]です'); // 下限値設定「1」 $objValidation->setFormula1(1); // 上限値設定「10」 $objValidation->setFormula2(10); // [test8-1.xlsx]:Excel2007形式で保存する $objWriter = new Xlsx($objSpreadsheet); $objWriter->save('test8-1.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
左図はエクセルでファイルを開いて「B3」セルをアクティブにした様子です。 右図は「B3」セルに「0」を入力して、エラーメッセージが表示された様子です。
PhpOffice\PhpSpreadsheet\Cell\DataValidation には以下の様に定数が宣言されています。// Data validation types const TYPE_NONE = 'none'; const TYPE_CUSTOM = 'custom'; const TYPE_DATE = 'date'; const TYPE_DECIMAL = 'decimal'; const TYPE_LIST = 'list'; const TYPE_TEXTLENGTH = 'textLength'; const TYPE_TIME = 'time'; const TYPE_WHOLE = 'whole'; // Data validation error styles const STYLE_STOP = 'stop'; const STYLE_WARNING = 'warning'; const STYLE_INFORMATION = 'information';
■セルにリスト入力設定
セルにリスト入力をする場合、上の例の様と異なる点は「入力規則タイプ」を TYPE_LIST にし セル入力規則オブジェクト の setFormula1 メソッドで リストの内容をカンマ区切りの文字列で与えます。
尚 setShowDropDown メソッドでドロップダウンの表示設定を必ず True で設定します。
以下のソースは「B3」セルにリスト「AAA」「BBB」「CCC」を設定します。
<?php // ライブラリ読込 require '../vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Cell\DataValidation; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // Spreadsheetオブジェクト生成 $objSpreadsheet = new Spreadsheet(); // ワークシートオブジェクト $objSheet = $objSpreadsheet->getActiveSheet(); // セル[B3]の入力規則オブジェクト取得 $objValidation = $objSheet->getCell('B3')->getDataValidation(); // 入力規則タイプの設定 $objValidation->setType(DataValidation::TYPE_LIST); // 入力エラータイプの設定 $objValidation->setErrorStyle(DataValidation::STYLE_INFORMATION); // 空白(ブランク)入力の不可設定 $objValidation->setAllowBlank(false); // 入力メッセージの表示設定 $objValidation->setShowInputMessage(true); // エラーメッセージの表示設定 $objValidation->setShowErrorMessage(true); // ドロップダウンの表示設定 $objValidation->setShowDropDown(true); // エラーメッセージのダイアログのタイトル設定 $objValidation->setErrorTitle('入力エラー'); // エラーメッセージ設定 $objValidation->setError('入力データがリストにありません。'); // プロンプトのタイトル設定 $objValidation->setPromptTitle('データ入力について'); // プロンプトのエラーメッセージ設定 $objValidation->setPrompt('ドロップダウンリストから選択して下さい。'); // ドロップダウンリスト設定 $objValidation->setFormula1('"AAA,BBB,CCC"'); // [test8-2.xlsx]:Excel2007形式で保存する $objWriter = new Xlsx($objSpreadsheet); $objWriter->save('test8-2.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
左図はエクセルでファイルを開いて「B3」セルをクリックしてアクティブにし、右側のドロップボタンをクリックした様子です。 右図は「B3」セルに「"ddd"」を入力して、エラーメッセージが表示された様子です。この setFormula1 メソッドで直接リストの一覧を設定する方法ですが、文字列の長さの制限が「255」ですので、注意が必要です。
そこでリストのデータを別のセルに持たせて、それを指定する方法がありますので、以下の項目を見て下さい。
■セルにリスト入力設定(他のセルにリストデータを持つ)
セル入力規則オブジェクト の setFormula1 メソッドでリストの存在するセル位置を指定します。
<?php // ライブラリ読込 require '../vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Cell\DataValidation; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // Spreadsheetオブジェクト生成 $objSpreadsheet = new Spreadsheet(); // ワークシートオブジェクト $objSheet = $objSpreadsheet->getActiveSheet(); // リストデータの設定(E2:E7) $objSheet->setCellValue('E2', "日本"); $objSheet->setCellValue('E3', "中国"); $objSheet->setCellValue('E4', "韓国"); $objSheet->setCellValue('E5', "タイ"); $objSheet->setCellValue('E6', "ベトナム"); $objSheet->setCellValue('E7', "フィリピン"); // セル[B3]の入力規則オブジェクト取得 $objValidation = $objSheet->getCell('B2')->getDataValidation(); // 入力規則タイプの設定 $objValidation->setType(DataValidation::TYPE_LIST); // 入力エラータイプの設定 $objValidation->setErrorStyle(DataValidation::STYLE_INFORMATION); // 空白(ブランク)入力の不可設定 $objValidation->setAllowBlank(false); // 入力メッセージの表示設定 $objValidation->setShowInputMessage(true); // エラーメッセージの表示設定 $objValidation->setShowErrorMessage(true); // ドロップダウンの表示設定 $objValidation->setShowDropDown(true); // エラーメッセージのダイアログのタイトル設定 $objValidation->setErrorTitle('入力エラー'); // エラーメッセージ設定 $objValidation->setError('入力データがリストにありません。'); // プロンプトのタイトル設定 $objValidation->setPromptTitle('データ入力について'); // プロンプトのエラーメッセージ設定 $objValidation->setPrompt('ドロップダウンリストから選択して下さい。'); // ドロップダウンリスト設定 $objValidation->setFormula1('$E$2:$E$7'); // セル範囲の指定 // [test8-3.xlsx]:Excel2007形式で保存する $objWriter = new Xlsx($objSpreadsheet); $objWriter->save('test8-3.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
左図はエクセルでファイルを開いて「B2」セルをクリックしてアクティブにし、右側のドロップボタンをクリックした様子です。 (「D2」から「D7」に設定した国の一覧がドロップダウンリストに表示されます)
PR -
今回は PhpSpreadsheet で行う「ワークシート」の 「条件付き書式設定」 について説明したいと思います。
「条件付き書式設定」 はエクセルで実際に行う時には以下の様に、メニューの[ホーム]タブの[条件付き書式]-[新しいルール]の順にクリックします。
「条件付き書式」 は以下の6種類がありますが、例としてはリンクのある部分に付いて例を記します。- セルの値に基づいてすべてのセルを書式設定
- 指定の値を含むセルだけを書式設定
- 上位または下位に入る値だけを書式設定
- 平均より上または下の値だけを書式設定
- 一意の値または重複する値だけを書式設定
- 数式を使用して、書式設定するセルを決定
■指定の値を含むセルだけを書式設定
セルに設定されている値によって書式を設定する方法です。
条件付き書式オブジェクトを生成し setConditionType() メソッドで「条件タイプ」を設定し setOperatorType() メソッドで「比較演算タイプ」を設定します。 さらに addCondition() メソッドで「比較対象の指定値」を設定し、最後に動作の書式を設定します。(今回はフォントオブジェクトを使って文字色を変更)
今回は1個のセルに対して2つの条件付き書式を設定する為に、2個の条件付き書式オブジェクトを生成し各設定を行った後で、 対象となるセルの条件付き書式を取得し、そこに作成した2つの条件付き書式を追加しています。
尚、最初の条件はセルの値がマイナスであれば文字色を「赤」に、2つ目の条件はセルの値が0以上であれば文字色を「緑」にします。
<?php // ライブラリ読込 require '../vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Style; use PhpOffice\PhpSpreadsheet\Style\Conditional; use PhpOffice\PhpSpreadsheet\Style\Color; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // Spreadsheetオブジェクト生成 $objSpreadsheet = new Spreadsheet(); // ワークシートオブジェクト $objSheet = $objSpreadsheet->getActiveSheet(); // 条件付き書式オブジェクト1生成 $objConditional1 = new Conditional(); // 条件タイプ:「指定の値を含む」 $objConditional1->setConditionType(Conditional::CONDITION_CELLIS); // 比較演算タイプ:「指定の値より小さい」 $objConditional1->setOperatorType(Conditional::OPERATOR_LESSTHAN); // 指定値:「0」⇒ (指定値 < 0) $objConditional1->addCondition('0'); // フォント色:「赤」 $objConditional1->getStyle()->getFont()->getColor()->setARGB(Color::COLOR_RED); // 条件付き書式オブジェクト2生成 $objConditional2 = new Conditional(); // 条件タイプ:「指定の値を含む」 $objConditional2->setConditionType(Conditional::CONDITION_CELLIS); // 比較演算タイプ:「指定の値以上」 $objConditional2->setOperatorType(Conditional::OPERATOR_GREATERTHANOREQUAL); // 指定値:「0」⇒ (指定値 ≧ 0) $objConditional2->addCondition('0'); // フォント色:「緑」 $objConditional2->getStyle()->getFont()->getColor()->setARGB(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-1.xlsx]:Excel2007形式で保存する $objWriter = new Xlsx($objSpreadsheet); $objWriter->save('test7-1.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
PhpOffice\PhpSpreadsheet\Style\Conditional には以下の様に定数が宣言されています。// Condition types const CONDITION_NONE = 'none'; const CONDITION_CELLIS = 'cellIs'; // セルの値による設定 const CONDITION_CONTAINSTEXT = 'containsText'; const CONDITION_EXPRESSION = 'expression'; // 式による設定?? const CONDITION_CONTAINSBLANKS = 'containsBlanks'; // 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 '../vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Style; use PhpOffice\PhpSpreadsheet\Style\Conditional; use PhpOffice\PhpSpreadsheet\Style\Color; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // Spreadsheetオブジェクト生成 $objSpreadsheet = new Spreadsheet(); // ワークシートオブジェクト $objSheet = $objSpreadsheet->getActiveSheet(); // 条件付き書式オブジェクト1生成 $objConditional1 = new Conditional(); // 条件タイプ:「数式を使用して、書式設定するセルを決定」 $objConditional1->setConditionType(Conditional::CONDITION_EXPRESSION); // 比較演算タイプ:「数式の文字列」 $objConditional1->setOperatorType(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 = new Xlsx($objSpreadsheet); $objWriter->save('test7-6.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
このエクセルファイルですが「B3」の所が灰色になっていて、意図したものになっていません。
エクセルで条件付き書式の内容を見てみると、条件式が「B2」セルのものと同じになっていました。
エクセル上で条件付き書式のコピーを行うと、条件式は行の番号に合わせてくれますが、上記のソースではそこまでできない様です。
そこで改良版(改悪版)かもしれませんが、以下に対応する様に変更したソースを載せます。
■数式を使用して、書式設定するセルを決定(改良版)
上記のソースでセル[B2]に対して条件付き書式の設定を行う部分を、各行ごとに繰り返し処理で行う様にします。
<?php // ライブラリ読込 require '../vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Style; use PhpOffice\PhpSpreadsheet\Style\Conditional; use PhpOffice\PhpSpreadsheet\Style\Color; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // Spreadsheetオブジェクト生成 $objSpreadsheet = new Spreadsheet(); // ワークシートオブジェクト $objSheet = $objSpreadsheet->getActiveSheet(); for($i = 2; $i <=4; $i++) { // 書式設定オブジェクト1生成 $objConditional1 = new Conditional(); // 書式タイプ:「数式を使用して、書式設定するセルを決定」 $objConditional1->setConditionType(Conditional::CONDITION_EXPRESSION); // 比較演算タイプ:「数式の文字列」 $objConditional1->setOperatorType(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 = new Xlsx($objSpreadsheet); $objWriter->save('test7-6-2.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
エクセルで「B4」セルの条件付き書式の内容を見てみると意図したものになりました。
-
今回は PhpSpreadsheet で行う「ワークシート」の 「セルのスタイル設定」 について説明したいと思います。
■セルの文字配置、前景色、背景色の設定
セルの文字配置、前景色、背景色等の設定は、ワークシートオブジェクトからスタイルオブジェクトを取得し、 そのスタイルオブジェクトから更に各指定用のオブジェクトを取得し、各値を設定します。
「文字配置・右寄せ」の設定は、スタイルオブジェクトからアライメントオブジェクトを取得し setHorizontal() メソッドを使用して行います。
「前景色」の設定は、スタイルオブジェクトからフォントオブジェクトを取得し、更にフォントオブジェクトから色オブジェクトを取得し setARGB() メソッドを使用して行います。
「背景色」の設定のためにまずは、セルの枠の設定を行います。 スタイルオブジェクトからボーダーオブジェクトを取得し、更にボーダーTop(Bottom,Left,Right)オブジェクトから個別ボーダーオブジェクトを取得し setBorderStyle() メソッドを使用して行います。
「背景色」の設定は、スタイルオブジェクトからフィルオブジェクトを取得し setFillType() メソッドで塗りつぶしのタイプを設定し、 フィルオブジェクトから色オブジェクトを取得し setARGB() メソッドを使用して行います。
<?php // ライブラリ読込 require '../vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Style; use PhpOffice\PhpSpreadsheet\Style\Color; use PhpOffice\PhpSpreadsheet\Style\Alignment; use PhpOffice\PhpSpreadsheet\Style\Border; use PhpOffice\PhpSpreadsheet\Style\Fill; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // Spreadsheetオブジェクト生成 $objSpreadsheet = new Spreadsheet(); // ワークシートオブジェクト $objSheet = $objSpreadsheet->getActiveSheet(); // スタイルオブジェクト取得([B2]セル) $objStyle = $objSheet->getStyle('B2'); // フォアグランド(前景)色を「白色」に設定 $objStyle->getFont()->getColor()->setARGB(Color::COLOR_WHITE); // 水平アライメントを「右寄せ」に設定 $objStyle->getAlignment()->setHorizontal(Alignment::HORIZONTAL_RIGHT); //$objStyle->getAlignment()->setHorizontal(Alignment::HORIZONTAL_LEFT); // ボーダーオブジェクト取得([B2]セル) $objBorders = $objStyle->getBorders(); // ボーダー全て(Top, Bottom, Left, Right)を「細い線:BORDER_THICK」に設定 $objBorders->getTop()->setBorderStyle(Border::BORDER_THICK); $objBorders->getBottom()->setBorderStyle(Border::BORDER_THICK); $objBorders->getLeft()->setBorderStyle(Border::BORDER_THICK); $objBorders->getRight()->setBorderStyle(Border::BORDER_THICK); // フィルオブジェクト取得([B2]セル) $objFill = $objStyle->getFill(); // 背景のタイプを「塗つぶし」に設定 $objFill->setFillType(Fill::FILL_SOLID); // 背景色を「赤」に設定 $objFill->getStartColor()->setARGB('FFFF0000'); // [B2]セルに文字列設定 $objSheet->setCellValue('B2', 'ABCDEF'); // [test6-1.xlsx]:Excel2007形式で保存する $objWriter = new Xlsx($objSpreadsheet); $objWriter->save('test6-1.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
アライメントの定数は以下の様に「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'; // 均等割り付け const HORIZONTAL_FILL = 'fill'; // const HORIZONTAL_DISTRIBUTED = 'distributed'; // Excel2007 only // Vertical alignment styles const VERTICAL_BOTTOM = 'bottom'; // 下詰め const VERTICAL_TOP = 'top'; // 上詰め const VERTICAL_CENTER = 'center'; // 中央揃え const VERTICAL_JUSTIFY = 'justify'; // 均等割り付け const VERTICAL_DISTRIBUTED = 'distributed'; // Excel2007 only
ボーダーの定数は以下の様に「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';
フィルの定数は以下の様に「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 '../vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Style; use PhpOffice\PhpSpreadsheet\Style\Fill; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // Spreadsheetオブジェクト生成 $objSpreadsheet = new Spreadsheet(); // ワークシートオブジェクト $objSheet = $objSpreadsheet->getActiveSheet(); // スタイルオブジェクト取得([B2~C6の範囲]セル) $objStyle = $objSheet->getStyle('B2:C6'); // フィルオブジェクト取得([B2]セル) $objFill = $objStyle->getFill(); // 背景のタイプを「塗つぶし」に設定 $objFill->setFillType(Fill::FILL_SOLID); // 背景色を「赤」に設定 $objFill->getStartColor()->setARGB('FFFF0000'); // [test6-2.xlsx]:Excel2007形式で保存する $objWriter = new Xlsx($objSpreadsheet); $objWriter->save('test6-2.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
■セルのスタイル設定を配列値で設定
PHPExcel ライブラリとは異なりワークシートオブジェクトから取得したスタイルオブジェクトからさらに フォント、アライメント 、フィル 、ボーダ 各オブジェクトを取得します。
その後、それらのオブジェクトの applyFromArray() メソッドで設定するスタイルを array() で与えることが出来ます。<?php // ライブラリ読込 require '../vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Style; use PhpOffice\PhpSpreadsheet\Style\Alignment; use PhpOffice\PhpSpreadsheet\Style\Border; use PhpOffice\PhpSpreadsheet\Style\Fill; use PhpOffice\PhpSpreadsheet\Style\Font; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // Spreadsheetオブジェクト生成 $objSpreadsheet = new Spreadsheet(); // ワークシートオブジェクト $objSheet = $objSpreadsheet->getActiveSheet(); // 全部のスタイルの定義 $arrStyle = array( 'font' => array( 'name' => 'Arial', 'bold' => TRUE, 'italic' => FALSE, 'underline' => Font::UNDERLINE_DOUBLE, 'strikethrough' => FALSE, 'color' => array( 'rgb' => '808080' ) ), 'alignment' => array( 'horizontal' => Alignment::HORIZONTAL_RIGHT, ), 'borders' => array( 'top' => array( 'style' => Border::BORDER_THIN, ), 'bottom' => array( 'style' => Border::BORDER_THIN, ), 'left' => array( 'style' => Border::BORDER_THIN, ), 'right' => array( 'style' => Border::BORDER_THIN, ), ), 'fill' => array( 'fillType' => Fill::FILL_SOLID, // 'rotation' => 0, 'startColor' => array( 'argb' => 'FFA0A0A0', ), // 'endColor' => array( // 'argb' => 'FFFFFFFF', // ), ), ); // スタイルオブジェクト取得([B2]セル) $objStyle = $objSheet->getStyle('B2'); // スタイルの設定([B2]セル) $objStyle->getFont()->applyFromArray($arrStyle['font']); $objStyle->getAlignment()->applyFromArray($arrStyle['alignment']); $objStyle->getBorders()->applyFromArray($arrStyle['borders']); $objStyle->getFill()->applyFromArray($arrStyle['fill']); // スタイルオブジェクト取得([C4:D6]セル) $objStyle = $objSheet->getStyle('C4:D6'); // スタイルの設定([C4:D6]セル) $objStyle->getFont()->applyFromArray($arrStyle['font']); $objStyle->getAlignment()->applyFromArray($arrStyle['alignment']); $objStyle->getBorders()->applyFromArray($arrStyle['borders']); $objStyle->getFill()->applyFromArray($arrStyle['fill']); // [test6-3.xlsx]:Excel2007形式で保存する $objWriter = new Xlsx($objSpreadsheet); $objWriter->save('test6-3.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
-
今回は PhpSpreadsheet で行う「ワークシート」の「紙の大きさ」や「ページ設定」について説明したいと思います。
■ワークシートの紙の方向と大きさの設定
紙の方向と大きさの設定は、ワークシートの PageSetup オブジェクトの setOrientation() , setPaperSize() メソッドを使用して行うことができます。
<?php // ライブラリ読込 require '../vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // Spreadsheetオブジェクト生成 $objSpreadsheet = new Spreadsheet(); // ワークシートオブジェクト $objSheet = $objSpreadsheet->getActiveSheet(); // PageSetupオブジェクト $objPageSetup = $objSheet->getPageSetup(); // 紙の向き設定[ランドスケープ:横向き] $objPageSetup->setOrientation(PageSetup::ORIENTATION_LANDSCAPE); // 紙の大きさ設定[A4] $objPageSetup->setPaperSize(PageSetup::PAPERSIZE_A4); // [A1]セルに文字列設定 $objSheet->setCellValue('A1', 'ABCDEFG'); // [test4-1.xlsx]:Excel2007形式で保存する $objWriter = new Xlsx($objSpreadsheet); $objWriter->save('test4-1.xlsx'); ?>
setOrientation() の引数は以下の様に「PageSetupクラス」に定義されています。
// Page orientation const ORIENTATION_DEFAULT = 'default'; // デフォルト const ORIENTATION_LANDSCAPE = 'landscape'; // ランドスケープ:横向き const ORIENTATION_PORTRAIT = 'portrait'; // ポートレート :縦向き
紙の向きの設定は「ORIENTATION_LANDSCAPE」、「ORIENTATION_PORTRAIT」のどちらかに必ず設定した方がいいと思います。 私の所では「ORIENTATION_DEFAULT」にして保存した場合に、エクセルで開いてみたら、「ポートレート」になっていましたが、 デフォルトが本当に「ポートレート」かは保証できませんので。
setPaperSize() の引数は以下の様に「PageSetupクラス」に定義されています。// Paper size const PAPERSIZE_LETTER = 1; const PAPERSIZE_LETTER_SMALL = 2; const PAPERSIZE_TABLOID = 3; const PAPERSIZE_LEDGER = 4; const PAPERSIZE_LEGAL = 5; const PAPERSIZE_STATEMENT = 6; const PAPERSIZE_EXECUTIVE = 7; const PAPERSIZE_A3 = 8; const PAPERSIZE_A4 = 9; const PAPERSIZE_A4_SMALL = 10; const PAPERSIZE_A5 = 11; const PAPERSIZE_B4 = 12; const PAPERSIZE_B5 = 13; const PAPERSIZE_FOLIO = 14; const PAPERSIZE_QUARTO = 15; // まだ他にあります
上記のソースを実行してエクセルの「印刷」で開いてみました。
■ワークシートのページ設定(スケーリング)
PhpSpreadsheet のページ設定スケーリングメソッドは、図の様に、[ページ設定]ダイアログのスケーリング設定オプションを直接設定できます。
メソッド 初期値 有効メソッド呼出 備考 setFitToPage false setScale 100 setFitToPage(false) setFitToWidth 1 setFitToPage(true) 0:FitToWidth をしない setFitToHeight 1 setFitToPage(true) 0:FitToHeight をしない <?php // ライブラリ読込 require '../vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // Spreadsheetオブジェクト生成 $objSpreadsheet = new Spreadsheet(); // ワークシートオブジェクト $objSheet = $objSpreadsheet->getActiveSheet(); // PageSetupオブジェクト $objPageSetup = $objSheet->getPageSetup(); // FitToPageを有効設定 $objPageSetup->setFitToPage(true); // FitToWidth:1 $objPageSetup->setFitToWidth(1); // FitToHeight:0 $objPageSetup->setFitToHeight(0); // [A1]セルに文字列設定 $objSheet->setCellValue('A1', 'ABCDEFG'); // [test4-2.xlsx]:Excel2007形式で保存する $objWriter = new Xlsx($objSpreadsheet); $objWriter->save('test4-2.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
(エクセルの「印刷」ページを開いて、「設定」の所の一番下の「ページ設定」リンクをクリックします。)■ワークシートのページ設定(余白)
PhpSpreadsheet のページ設定の余白設定メソッドは、図の様に、[ページ設定]ダイアログの余白設定オプションを直接設定できます。
これらのメソッドはワークシートオブジェクトから PageMarginsオブジェクト を取得し呼出します。<?php // ライブラリ読込 require '../vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Worksheet\PageMargins; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // Spreadsheetオブジェクト生成 $objSpreadsheet = new Spreadsheet(); // ワークシートオブジェクト $objSheet = $objSpreadsheet->getActiveSheet(); // PageMarginsオブジェクト $objPageMargins = $objSheet->getPageMargins(); // Top 設定 $objPageMargins->setTop(1); // Right 設定 $objPageMargins->setRight(0.75); // Left 設定 $objPageMargins->setLeft(0.75); // Bottom 設定 $objPageMargins->setBottom(1); // [A1]セルに文字列設定 $objSheet->setCellValue('A1', 'ABCDEFG'); // [test4-3.xlsx]:Excel2007形式で保存する $objWriter = new Xlsx($objSpreadsheet); $objWriter->save('test4-3.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
(エクセルの「印刷」ページを開いて、「設定」の所の一番下の「ページ設定」リンクをクリックします。)
※設定値の単位がインチなので以下の計算となる
Top(1) : 1.00×2.54cm=2.540cm⇒2.5
Right(0.75) : 0.75×2.54cm=1.905cm⇒1.9
-
今回は PhpSpreadsheet の「ワークシート」の 「セル」へのアクセス を行・列指定で行う方法について説明したいと思います。
以下の記事では、エクセルの行・列指定("A1","B2"など)によるアクセスについて説明しましたが、 今回は行・列指定指定の部分が、行と列指定に分けて行う方法です。
⇒PHP PhpSpreadsheet エクセルのワークシートのセルへのアクセスについて
- 行・列指定によるセル値の設定(setCellValueByColumnAndRow())
- 行・列指定によるセル値の設定(日付・時刻設定)
- 行・列指定によるセル値の設定(先行ゼロ付きの数値設定)
- 行・列指定によるセル値の設定(配列データの設定)
■行・列指定によるセル値の設定
行・列指定によるセル値の設定は、ワークシートの setCellValueByColumnAndRow() メソッドを使用して行うことができます。
または、getCellByColumnAndRow() メソッドでセルオブジェクトを取得してから、セルオブジェクトの setValue() メソッドを呼び出すこともできます。
<?php // ライブラリ読込 require '../vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // Spreadsheetオブジェクト生成 $objSpreadsheet = new Spreadsheet(); // シート設定 $objSheet = $objSpreadsheet->getActiveSheet(); // [A1]セルに文字列設定 $objSheet->setCellValueByColumnAndRow(1, 1, 'ABCDEFG'); // [B2]セルに数値設定 $objSheet->setCellValueByColumnAndRow(2, 2, 123.56); // [C3]セルにBoolean値設定 $objSheet->setCellValueByColumnAndRow(3, 3, TRUE); // [A4]セルに書式設定 $objSheet->setCellValueByColumnAndRow(5, 1, '=IF(C3, CONCATENATE(A1, " ", B2), CONCATENATE(B2, " ", A1))'); // [B8]セルに getCellByColumnAndRow() でセルを取得し、setValue() で文字列設定 $objSheet->getCellByColumnAndRow(2, 8)->setValue('test 行列指定によるセルオブジェクト取得'); // [test3-3-1.xlsx]:Excel2007形式で保存する $objWriter = new Xlsx($objSpreadsheet); $objWriter->save('test3-3-1.xlsx'); exit(); ?>
setCellValueByColumnAndRow() メソッドは setCellValue($pCoordinate , ...) メソッドの $pCoordinate(エクセル座標文字列:"A1"等) の部分を 列番号と行番号に置き換えたメソッドです。
(ライブラリの内部では行番号と列番号からエクセル座標文字列に変換して処理しています)
尚、行番号は「1」から始まり、列番号も「1」から始まります。(1 ⇒ "A", 2 ⇒ "B", 3 ⇒ "C", ... に対応)
PHPExcel では列番号は「0」から始まりましたが PhpSpreadsheet では「1」からになりました。
出力されたエクセルファイルを見てみると以下の様になります。■行・列指定によるセル値の設定(日付・時刻設定)
日付および時刻の値は、エクセル内では(単純な浮動小数点値)のタイムスタンプとして保持され、数値フォーマットマスクを使用して、その値が表示されます。
よって、セルに日付を保存する場合は、正しい エクセルタイムスタンプ を計算し、数値形式マスクを設定する必要があります。
「PHP PhpSpreadsheet エクセルのワークシートのセルへのアクセスについて」 の記事の使用メソッドを行・列指定に変更します。
setCellValue() メソッドは setCellValueByColumnAndRow() メソッドを使用します。
また、getStyle() メソッドは getStyleByColumnAndRow() メソッドを使用します。<?php // ライブラリ読込 require '../vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; use PhpOffice\PhpSpreadsheet\Shared\Date; use PhpOffice\PhpSpreadsheet\Style\NumberFormat; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // Spreadsheetオブジェクト生成 $objSpreadsheet = new Spreadsheet(); // シート設定 $objSheet = $objSpreadsheet->getActiveSheet(); // システム時刻取得 $dateTimeNow = time(); // エクセルタイムスタンプ値に変換 $excelDateValue = Date::PHPToExcel($dateTimeNow); // [A1]セルにエクセルタイムスタンプ値設定 $objSheet->setCellValueByColumnAndRow(1, 1, $excelDateValue); // [A1]セルの数値フォーマットに日付時刻の設定(yyyy-mm-dd) $objSheet->getStyleByColumnAndRow(1, 1)->getNumberFormat()->setFormatCode( NumberFormat::FORMAT_DATE_YYYYMMDD2 ); // [A2]セルにエクセルタイムスタンプ値設定 $objSheet->setCellValueByColumnAndRow(1, 2, $excelDateValue); // [A2]セルの数値フォーマットに日付時刻の設定(yy/mm/dd;@) $objSheet->getStyleByColumnAndRow(1, 2)->getNumberFormat()->setFormatCode( NumberFormat::FORMAT_DATE_YYYYMMDDSLASH ); // [test3-3-2.xlsx]:Excel2007形式で保存する $objWriter = new Xlsx($objSpreadsheet); $objWriter->save('test3-3-2.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
PhpOffice\PhpSpreadsheet\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/yy'; const FORMAT_DATE_DMYMINUS = 'd-m-yy'; const FORMAT_DATE_DMMINUS = 'd-m'; const FORMAT_DATE_MYMINUS = 'm-yy'; 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/yy 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 = '#,##0.00_-"€"'; const FORMAT_CURRENCY_EUR = '#,##0_-"€"'; const FORMAT_ACCOUNTING_USD = '_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)'; const FORMAT_ACCOUNTING_EUR = '_("€"* #,##0.00_);_("€"* \(#,##0.00\);_("€"* "-"??_);_(@_)';
■行・列指定によるセル値の設定(先行ゼロ付きの数値設定)
数値には先行ゼロがないため、先行ゼロのある数値(電話番号など)を設定しようとすると、値が数値にキャストされるため、これらは通常失われます。 そのため「09088881234」は 「9088881234」と表示されます。
PhpSpreadsheet にこの動作をさせない様な方法は2つあります。
1つは、数値に変換されないように、データ型を文字列として明示的に設定する方法です。
2つ目は、数値書式マスクを使用して、先行ゼロ付きの値を表示する方法です。
「PHP PhpSpreadsheet エクセルのワークシートのセルへのアクセスについて」 の記事の使用メソッドを行・列指定に変更します。
setCellValueExplicit() メソッドは setCellValueExplicitByColumnAndRow() メソッドを使用します。
また、getStyle() メソッドは getStyleByColumnAndRow() メソッドを使用します。<?php // ライブラリ読込 require '../vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; use PhpOffice\PhpSpreadsheet\Cell\DataType; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // Spreadsheetオブジェクト生成 $objSpreadsheet = new Spreadsheet(); // シート設定 $objSheet = $objSpreadsheet->getActiveSheet(); // [A1]セルにゼロが先頭に有る数値文字列を、文字列として設定 $objSheet->setCellValueExplicitByColumnAndRow( 1, 1, "09088881234", DataType::TYPE_STRING ); // [A2]セルに数値設定 $objSheet->setCellValueByColumnAndRow(1, 2, 9088881234); // [A2]セルの数値フォーマットに "00000000000" の設定 $objSheet->getStyleByColumnAndRow(1, 2)->getNumberFormat()->setFormatCode( '00000000000' ); // [A3]セルに数値設定 $objSheet->setCellValueByColumnAndRow(1, 3, 9088881234); // [A3]セルの数値フォーマットに "0000-000-0000" の設定 $objSheet->getStyleByColumnAndRow(1, 3)->getNumberFormat()->setFormatCode( '0000-000-0000' ); // [test3-3-3.xlsx]:Excel2007形式で保存する $objWriter = new Xlsx($objSpreadsheet); $objWriter->save('test3-3-3.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
■行・列指定によるセル値の設定(配列データの設定)
ワークシートの fromArray メソッドに配列データを渡すことにより、1回の呼び出しでセル範囲に設定することができます。
fromArray メソッドに対応する行・列指定のメソッドが無いため、エクセル座標文字列を PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex() メソッドで作成します。<?php // ライブラリ読込 require '../vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; use PhpOffice\PhpSpreadsheet\Cell\Coordinate; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // Spreadsheetオブジェクト生成 $objSpreadsheet = new Spreadsheet(); // シート設定 $objSheet = $objSpreadsheet->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 = 1; $intRow = 2; // [A2]セルの座標値計算 // 列の文字列変換:「0」⇒"A" $strCoordinate = Coordinate::stringFromColumnIndex($intColumn); // 行の文字列を付加 $strCoordinate = $strCoordinate.$intRow; // [A2]セルにから配列データ設定 $objSheet->fromArray( $arrData, // 配列データ NULL, // 配列データの中でセルに設定しないNULL値の指定 $strCoordinate // 左上座標(デフォルト:"A1") ); // [test3-3-4.xlsx]:Excel2007形式で保存する $objWriter = new Xlsx($objSpreadsheet); $objWriter->save('test3-3-4.xlsx'); exit(); ?>
出力されたエクセルファイル[test3-3-4.xlsx]を見てみると以下の様になります。