忍者ブログ

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

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

PHP PhpSpreadsheet エクセルのワークシートのセルのデータ入力規則設定について


今回は 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

コメント

コメントを書く