PhpSpreadsheet 日本語ドキュメント:構造と自動フィルタリング機能

Composerオートローダー

PhpSpreadsheetはComposerのオートローダーに依存しています。そのため、PhpSpreadsheetを単独で使用する前に、必ずcomposer installを実行してください。または、既存のプロジェクトに追加する場合はcomposer require phpoffice/phpspreadsheetを使用します。

メモリ内スプレッドシート

PhpSpreadsheetのアーキテクチャは、メモリ内スプレッドシートとして機能するように設計されています。つまり、PhpSpreadsheetのオブジェクトモデルと通信するスプレッドシートのWebベースのビューを作成する場合、開発者はフロントエンドコードのみを記述する必要があります。

デスクトップのスプレッドシートソフトウェアと同様に、PhpSpreadsheetは、データ、数式、画像などを含むセルを持つ1つ以上のワークシートを含むスプレッドシートを表します。

リーダーとライター

単体では、Spreadsheetクラスは永続的なスプレッドシート(ディスクまたはデータベース)の読み取りまたは書き込み機能を提供しません。この機能を提供するために、リーダーとライターを使用できます。

デフォルトでは、PhpSpreadsheetパッケージはいくつかのリーダーとライターを提供しており、その中にはOpen XMLスプレッドシート形式(Excel 2007ファイル形式とも呼ばれる)用のリーダーとライターが含まれています。デフォルトのリーダーとライターに限定されるわけではなく、カスタムクラスで\PhpOffice\PhpSpreadsheet\Reader\IReaderおよび\PhpOffice\PhpSpreadsheet\Writer\IWriterインターフェースを実装できます。

フluentインターフェース

PhpSpreadsheetはほとんどの場所でフluentインターフェースをサポートしています。これにより、新しいPHPステートメントを必要とせずに、特定のメソッド呼び出しを「チェーン」できます。例えば、以下のコード:

$spreadsheet->getProperties()->setCreator("Maarten Balliauw");
$spreadsheet->getProperties()->setLastModifiedBy("Maarten Balliauw");
$spreadsheet->getProperties()->setTitle("Office 2007 XLSX Test Document");
$spreadsheet->getProperties()->setSubject("Office 2007 XLSX Test Document");
$spreadsheet->getProperties()->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.");
$spreadsheet->getProperties()->setKeywords("office 2007 openxml php");
$spreadsheet->getProperties()->setCategory("Test result file");

は以下のように書き換えることができます:

$spreadsheet->getProperties()
    ->setCreator("Maarten Balliauw")
    ->setLastModifiedBy("Maarten Balliauw")
    ->setTitle("Office 2007 XLSX Test Document")
    ->setSubject("Office 2007 XLSX Test Document")
    ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")
    ->setKeywords("office 2007 openxml php")
    ->setCategory("Test result file");

フluentインターフェースの使用は必須ではありません フluentインターフェースは便利なプログラミングAPIを提供するために実装されています。使用する必要はありませんが、コードをより読みやすく、保守しやすくすることができます。上記の例では、getProperties()メソッドは非フluentバージョンでは7回呼び出されますが、フluentバージョンでは1回しか呼び出されないため、PhpSpreadsheetメソッドの呼び出し総数を減らすことでパフォーマンスも向上させることができます。

自動フィルタリングの概要

概要

Excelワークブックの各ワークシートには、自動フィルタリング範囲を含めることができます。フィルタリングされたデータは、指定した条件に一致する行のみを表示し、表示したくない行を非表示にします。複数の列でフィルタリングできます:フィルターは加法的であり、各フィルターは現在のフィルターに基づいており、データのサブセットをさらに減らします。

セルの範囲に自動フィルターを適用すると、自動フィルター範囲の最初の行は、自動フィルタードロップダウンアイコンが表示されるヘッダー行になります。これは実際の自動フィルタリングデータの一部ではありません。それに続くすべての行が自動フィルタリングデータです。したがって、自動フィルター範囲は常にヘッダー行と1つ以上のデータ行を含める必要があります(データ行が1つだけの場合は意味がありませんが、PhpSpreadsheetは開発者がこのようなエラーを回避する方法を決定できるように、無意味な範囲を指定することを妨げません)。

フィルターが適用されているかどうかを判断するには、列ヘッダーのアイコンに注意してください。ドロップダウン矢印()は、フィルターが有効化されているが適用されていないことを示します。MS Excelでは、フィルターが有効化されているが適用されていない列のヘッダーにマウスを置くと、ツールチップにその列の最初の行のセルテキストが表示され、「(すべて表示)」というメッセージが表示されます。

「フィルター」ボタン()は、フィルターが適用されていることを示します。フィルターが適用された列のヘッダーにマウスを置くと、ツールチップにその列に適用されたフィルターが表示されます(例:「赤いセルの色に等しい」または「150より大きい」)。

ワークシートに自動フィルタリング範囲を設定する

セルの範囲に自動フィルターを設定します。

$spreadsheet->getActiveSheet()->setAutoFilter('A1:E20');

自動フィルター範囲の最初の行は、自動フィルタードロップダウンアイコンが表示されるヘッダー行になります。これは実際の自動フィルタリングデータの一部ではありません。それに続くすべての行が自動フィルタリングデータです。したがって、自動フィルター範囲は常にヘッダー行と1つ以上のデータ行を含める必要があります(データ行が1つだけの場合は意味がありませんが、PhpSpreadsheetは開発者がこのようなエラーを回避する方法を決定できるように、無意味な範囲を指定することを妨げません)。

ワークシート全体を自動フィルタリング範囲として設定する場合は:

$spreadsheet->getActiveSheet()->setAutoFilter(
    $spreadsheet->getActiveSheet()
        ->calculateWorksheetDimension()
);

これによりフィルタリングが可能になりますが、実際にはフィルターは適用されません。

自動フィルター式

PHPEXcel 1.7.8では、フィルター式の実際の作成、読み取り、および書き込み機能が導入されました。当初はXlsxファイルのみに適用されましたが、より高いバージョンでは他の形式に拡張されました。

自動フィルター範囲にフィルター式を適用するには、まず、このフィルターをどの列に適用するかを決定する必要があります。

$autoFilter = $spreadsheet->getActiveSheet()->getAutoFilter();
$columnFilter = $autoFilter->getColumn('C');

これにより、autoFilter列オブジェクトが返され、その列にフィルター式を適用できます。

自動フィルター式には多くの異なるタイプがあります。最も一般的なのは:

  • 単純フィルター
  • 日付グループフィルター
  • カスタムフィルター
  • 動的フィルター
  • トップ10フィルター

これらの異なるタイプは、どの単一の列内でも相互に排他的です。同じ列で異なるタイプのフィルターを混在させるべきではありません。PhpSpreadsheetはこの操作を積極的に妨げませんが、結果は予測不可能です。

他のフィルター式タイプ(例:セルの色フィルター)はまだサポートされていません。

単純フィルター

MS Excelでは、「単純フィルター」は列で使用されるすべての値のドロップダウンリストで、ユーザーは各オプションの横にあるチェックボックスを選択または選択解除して、表示する値と非表示にする値を選択できます。フィルターを適用すると、選択されたエントリを含む行が表示され、その値を含まない行は非表示になります。

フィルター式を作成するには、まずフィルターのタイプを決定する必要があります。この場合、このフィルターが標準フィルターであることを指定します。

$columnFilter->setFilterType(
    \PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column::AUTOFILTER_FILTERTYPE_FILTER
);

フィルターのタイプを決定したので、フィルター規則を作成し、フィルター値を設定できます:

PhpSpreadsheetで単純フィルターを作成するには、「チェック済み」列の値を指定するだけです:これを行うには、各値に対してフィルター規則を作成できます。

$columnFilter->createRule()
    ->setRule(
        \PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_EQUAL,
        'France'
    );

$columnFilter->createRule()
    ->setRule(
        \PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_EQUAL,
        'Germany'
    );

これにより、2つのフィルター規則が作成されます:「France」または「Germany」と一致する値で列がフィルターされます。単純フィルターの場合、必要に応じて任意の数の規則を作成できます。

単純フィルターは常にEQUALSの比較一致であり、複数の標準フィルターは常にOR条件で結合されます。

空白セルのフィルタリング

空白セルを選択するフィルターを作成する場合は、以下を使用できます:

$columnFilter->createRule()
    ->setRule(
        \PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_EQUAL,
        ''
    );

日付グループフィルター

MS Excelでは、DateGroupフィルターは日付値に対して一連のドロップダウンフィルターセレクターを提供し、年全体、一年の月、または月の日を指定できます。

DateGroupフィルターは、標準フィルターのタイプとして適用されます。

$columnFilter->setFilterType(
    \PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column::AUTOFILTER_FILTERTYPE_FILTER
);

PhpSpreadsheetでDateGroupフィルターを作成するには、「チェック済み」列の値を年、月、日、時間、分、秒の連想配列として指定できます。年と月を選択するには、選択された年と月を識別するDateGroup規則を作成する必要があります:

$columnFilter->createRule()
    ->setRule(
        \PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_EQUAL,
        [
            'year' => 2012,
            'month' => 1
        ]
    )
    ->setRuleType(
        \PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DATEGROUP
    );

連想配列のキーと値は:

  • year
  • month
  • day
  • hour
  • minute
  • second

標準フィルターと同様に、DateGroupフィルターは常にEQUALSの一致であり、複数の標準フィルターは常にOR条件で結合されます。

また、ruleTypeを指定していることに注意してください:これを標準フィルターと区別するために、RuleのTypeを明示的にAUTOFILTER_RULETYPE_DATEGROUPに設定します。標準フィルターと同様に、任意の数のDateGroupフィルターを作成できます。

カスタムフィルター

MS Excelでは、カスタムフィルターを使用して、より複雑な条件を選択できます。典型的な例は、特定の範囲内の値(例:-20から+20まで)またはワイルドカードを持つテキスト値(例:'U'で始まる)です。

カスタムフィルターは2つの規則に限定され、ANDまたはORを使用して結合できます。

まずフィルターのタイプを指定します。今回はCUSTOMFILTERです。

$columnFilter->setFilterType(
    \PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column::AUTOFILTER_FILTERTYPE_CUSTOMFILTER
);

次に、規則を定義します。

以下は、'U'で始まるすべての列エントリを表示する単純なワイルドカードフィルターです。

$columnFilter->createRule()
    ->setRule(
        \PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_EQUAL,
        'U*'
    )
    ->setRuleType(
        \PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_CUSTOMFILTER
    );

MS Excelは*をワイルドカードとして使用して任意の数の文字に一致させ、?を単一の文字に一致させるために使用します。「U*」は「'U'で始まる」に等しく、「*U」は「'U'で終わる」に等しく、「*U*」は「'U'を含む」に等しくなります。

*または?文字を明示的に一致させるには、チルダ(\〜)を使用してエスケープできます。したがって?\〜**は、セル値の2番目の文字として*文字を明示的に一致させ、任意の数の他の文字が続くことを意味します。エスケープする必要がある唯一の他の文字は\〜自体です。

「範囲内」の条件を作成するには、2つの規則を定義する必要があります:

$columnFilter->createRule()
    ->setRule(
        \PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL,
        -20
    )
    ->setRuleType(
        \PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_CUSTOMFILTER
    );
$columnFilter->createRule()
    ->setRule(
        \PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_LESSTHANOREQUAL,
        20
    )
    ->setRuleType(
        \PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_CUSTOMFILTER
    );

また、規則タイプをCUSTOMFILTERに設定します。

これにより、>= -20または<= 20をフィルターする2つの規則が定義されます。したがって、ANDではなくORを反映するように結合条件を変更する必要があります。

$columnFilter->setAndOr(
    \PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column::AUTOFILTER_COLUMN_ANDOR_AND
);

\PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Ruleクラスで定義されているカスタムフィルターの有効な演算子セットには:

演算子定数
AUTOFILTER_COLUMN_RULE_EQUAL '等しい'
AUTOFILTER_COLUMN_RULE_NOTEQUAL '等しくない'
AUTOFILTER_COLUMN_RULE_GREATERTHAN 'より大きい'
AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL 'greaterThanOrEqual'
AUTOFILTER_COLUMN_RULE_LESSTHAN 'より小さい'
AUTOFILTER_COLUMN_RULE_LESSTHANOREQUAL 'lessThanOrEqual'

動的フィルター

動的フィルターは、セル値と比較する値が可変である動的比較条件に基づいています。たとえば、'today'や、セルデータに対してテストする集計(例:「aboveAverage」)などです。一度に1列にのみ1つの動的フィルターを適用できます。

同様に、まずフィルターのタイプを指定します。今回はDYNAMICFILTERです。

$columnFilter->setFilterType(
    \PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column::AUTOFILTER_FILTERTYPE_DYNAMICFILTER
);

動的フィルターの規則を定義する場合、値は定義しません(NULLに設定できますが)、動的フィルターカテゴリを指定できます。

$columnFilter->createRule()
    ->setRule(
        \PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_EQUAL,
        NULL,
        \PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_YEARTODATE
    )
    ->setRuleType(
        \PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMICFILTER
    );

また、規則タイプをDYNAMICFILTERに設定します。

\PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Ruleクラスで定義されている有効な動的フィルターカテゴリセットには:

演算子定数
AUTOFILTER_RULETYPE_DYNAMIC_YESTERDAY '昨日'
AUTOFILTER_RULETYPE_DYNAMIC_TODAY '今日'
AUTOFILTER_RULETYPE_DYNAMIC_TOMORROW '明日'
AUTOFILTER_RULETYPE_DYNAMIC_YEARTODATE '今年の累計'
AUTOFILTER_RULETYPE_DYNAMIC_THISYEAR '今年'
AUTOFILTER_RULETYPE_DYNAMIC_THISQUARTER 'この四半期'
AUTOFILTER_RULETYPE_DYNAMIC_THISMONTH '今月'
AUTOFILTER_RULETYPE_DYNAMIC_THISWEEK '今週'
AUTOFILTER_RULETYPE_DYNAMIC_LASTYEAR '去年'
AUTOFILTER_RULETYPE_DYNAMIC_LASTQUARTER '前四半期'
AUTOFILTER_RULETYPE_DYNAMIC_LASTMONTH '先月'
AUTOFILTER_RULETYPE_DYNAMIC_LASTWEEK '先週'
AUTOFILTER_RULETYPE_DYNAMIC_NEXTYEAR '来年'
AUTOFILTER_RULETYPE_DYNAMIC_NEXTQUARTER '次四半期'
AUTOFILTER_RULETYPE_DYNAMIC_NEXTMONTH '来月'
AUTOFILTER_RULETYPE_DYNAMIC_NEXTWEEK '来週'
AUTOFILTER_RULETYPE_DYNAMIC_MONTH_1 'M1'
AUTOFILTER_RULETYPE_DYNAMIC_JANUARY 'M1'
AUTOFILTER_RULETYPE_DYNAMIC_MONTH_2 'M2'
AUTOFILTER_RULETYPE_DYNAMIC_FEBRUARY 'M2'
AUTOFILTER_RULETYPE_DYNAMIC_MONTH_3 'M3'
AUTOFILTER_RULETYPE_DYNAMIC_MARCH 'M3'
AUTOFILTER_RULETYPE_DYNAMIC_MONTH_4 'M4'
AUTOFILTER_RULETYPE_DYNAMIC_APRIL 'M4'
AUTOFILTER_RULETYPE_DYNAMIC_MONTH_5 'M5'
AUTOFILTER_RULETYPE_DYNAMIC_MAY 'M5'
AUTOFILTER_RULETYPE_DYNAMIC_MONTH_6 'M6'
AUTOFILTER_RULETYPE_DYNAMIC_JUNE 'M6'
AUTOFILTER_RULETYPE_DYNAMIC_MONTH_7 'M7'
AUTOFILTER_RULETYPE_DYNAMIC_JULY 'M7'
AUTOFILTER_RULETYPE_DYNAMIC_MONTH_8 'M8'
AUTOFILTER_RULETYPE_DYNAMIC_AUGUST 'M8'
AUTOFILTER_RULETYPE_DYNAMIC_MONTH_9 'M9'
AUTOFILTER_RULETYPE_DYNAMIC_SEPTEMBER 'M9'
AUTOFILTER_RULETYPE_DYNAMIC_MONTH_10 'M10'
AUTOFILTER_RULETYPE_DYNAMIC_OCTOBER 'M10'
AUTOFILTER_RULETYPE_DYNAMIC_MONTH_11 'M11'
AUTOFILTER_RULETYPE_DYNAMIC_NOVEMBER 'M11'
AUTOFILTER_RULETYPE_DYNAMIC_MONTH_12 'M12'
AUTOFILTER_RULETYPE_DYNAMIC_DECEMBER 'M12'
AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_1 'Q1'
AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_2 'Q2'
AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_3 'Q3'
AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_4 'Q4'
AUTOFILTER_RULETYPE_DYNAMIC_ABOVEAVERAGE '平均以上'
AUTOFILTER_RULETYPE_DYNAMIC_BELOWAVERAGE '平均以下'

一度に1列にのみ1つの動的フィルター規則を適用できます。

トップ10フィルター

トップ10フィルターは、動的フィルターと同様に、セル内の実際のデータ値に基づく集計です。しかし、1つのオプションのみを選択できる「動的フィルター」と異なり、「トップ10フィルター」は複数の条件に基づいて選択できます:

  • 最高(最高)値または最低(最低)値を使用するかを決定できます
  • フィルターで選択する値の数を決定できます
  • パーセンテージまたはアイテム数かを決定できます

動的フィルターと同様に、一度に1列にのみ1つのトップ10フィルターを適用できます。

まずフィルターのタイプを指定します。今回はDYNAMICFILTERです。

$columnFilter->setFilterType(
    \PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column::AUTOFILTER_FILTERTYPE_TOPTENFILTER
);

次に、規則を作成します:

$columnFilter->createRule()
    ->setRule(
        \PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT,
        5,
        \PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP
    )
    ->setRuleType(
        \PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_TOPTENFILTER
    );

これにより、列内の上位5%の値がフィルターされます。

最低値(下位2つの値)を指定するには、次の規則を指定します:

$columnFilter->createRule()
    ->setRule(
        \PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_BY_VALUE,
        5,
        \PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_BOTTOM
    )
    ->setRuleType(
        \PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_TOPTENFILTER
    );

TopTenフィルターのトップ/ボトム値/パーセンテージのオプション値は、\PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Ruleクラスで定義されています:

演算子定数
AUTOFILTER_COLUMN_RULE_TOPTEN_BY_VALUE 'byValue'
AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT 'byPercent'

および

演算子定数
AUTOFILTER_COLUMN_RULE_TOPTEN_TOP 'トップ'
AUTOFILTER_COLUMN_RULE_TOPTEN_BOTTOM 'ボトム'

自動フィルターの実行

MS Excelで自動フィルターを適用すると、選択した条件に基づいて自動フィルター範囲の各行に行の非表示/表示フラグが設定され、フィルター条件に一致する行のみが表示されます。

フィルター式を設定または変更すると、PhpSpreadsheetは同等の機能を自動的に実行しません。ファイルの保存時のみです。

フィルターの適用

スクリプトからフィルターを実行したい場合は、手動で実行する必要があります。autofiltersのshowHideRows()メソッドを使用してこれを実行できます。

$autoFilter = $spreadsheet->getActiveSheet()->getAutoFilter();
$autoFilter->showHideRows();

これにより、フィルター条件に一致するすべての行が表示可能に設定され、自動フィルター範囲内の他のすべての行が非表示になります。

フィルターされた行の表示

自動フィルター範囲内の行をループすると、フィルター条件に一致するかどうかに関係なく、任意の行にアクセスされます。選択的にフィルターされた行のみにアクセスするには、各行の可視性設定をテストする必要があります。

foreach ($spreadsheet->getActiveSheet()->getRowIterator() as $row) {
    if ($spreadsheet->getActiveSheet()
        ->getRowDimension($row->getRowIndex())->getVisible()) {
        echo '    行番号 - ' , $row->getRowIndex() , ' ';
        echo $spreadsheet->getActiveSheet()
            ->getCell(
                'C'.$row->getRowIndex()
            )
            ->getValue(), ' ';
        echo $spreadsheet->getActiveSheet()
            ->getCell(
                'D'.$row->getRowIndex()
            )->getFormattedValue(), ' ';
        echo PHP_EOL;
    }
}

自動フィルターのソート

MS Excelでは、自動フィルターは行のソートも許可します。PhpSpreadsheetはこの機能をサポートしません

タグ: PhpSpreadsheet Excel 自動フィルタリング フィルター式 フluentインターフェース

6月25日 20:13 投稿