phpspreadsheet 中文文檔(二) 結構+自動篩選

2019年10月11日13:55:41php

原理圖

01-schematic.png

自動加載器

PhpSpreadsheet依賴於Composer自動加載器。所以,在獨立使用PhpSpreadsheet以前,請確保先運行composer install或使用將其添加到預先存在的項目中composer require phpoffice/phpspreadsheet前端

電子表格在內存中

PhpSpreadsheet的體系結構以能夠用做內存電子表格的方式構建。這意味着,若是要建立與PhpSpreadsheet的對象模型進行通訊的電子表格的基於Web的視圖,則他只須要編寫前端代碼便可。數據庫

就像桌面電子表格軟件同樣,PhpSpreadsheet表示包含一個或多個工做表的電子表格,該工做表包含具備數據,公式,圖像等的單元格。express

讀者和做家

就其自己而言,該Spreadsheet班沒有提供的功能讀取或寫入到一個持久的電子表格(在磁盤或數據庫)。爲了提供該功能,可使用讀取器和寫入器。編程

默認狀況下,PhpSpreadsheet軟件包提供了一些讀取器和寫入器,其中包括一種用於Open XML電子表格格式(也稱爲Excel 2007文件格式)的讀寫器。您不限於默認的讀取器和編寫器,由於您能夠在自定義類中自由實現 \PhpOffice\PhpSpreadsheet\Reader\IReaderand \PhpOffice\PhpSpreadsheet\Writer\IWriter接口。數組

02-readers-writers.png

流利的界面

PhpSpreadsheet在大多數位置都支持流暢的界面。這意味着您能夠輕鬆地「連接」對特定方法的調用,而無需新的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"); 

能夠改寫爲:app

$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"); 

不須要使用流利的接口已經實現了流利的接口以提供方便的編程API。不須要使用它們,可是可使您的代碼更易於閱讀和維護。當您減小對PhpSpreadsheet方法的調用總數時,它也能夠提升性能:在上面的示例中,該 getProperties()方法僅被調用一次,而不是非流利版本中被調用7次composer

 

 

自動篩選參考

介紹

Excel工做簿中的每一個工做表均可以包含一個自動篩選範圍。篩選的數據僅顯示符合您指定條件的行,並隱藏您不想顯示的行。您能夠按不止一列進行過濾:過濾器是加性的,這意味着每一個其餘過濾器都基於當前過濾器,並進一步減小了數據子集。less

01-01-autofilter.png

將自動過濾器應用於必定範圍的單元格時,自動過濾器範圍中的第一行將是標題行,其中顯示自動過濾器下拉圖標。它不是實際的自動篩選數據的一部分。隨後的全部行都是自動過濾的數據。所以,自動篩選器範圍應始終包含標題行和一個或多個數據行(一個數據行幾乎沒有意義),可是PhpSpreadsheet並不會阻止您指定無心義的範圍:由開發人員自行決定如何避免此類錯誤。

要肯定是否應用了過濾器,請注意列標題​​中的圖標。下拉箭頭(01-03-filter-icon-1.png)表示已啓用過濾但未應用過濾。在MS Excel中,當您將鼠標懸停在啓用了過濾但未應用過濾的列的標題上時,屏幕提示將顯示該列第一行的單元格文本,並顯示消息「(顯示所有)」。

01-02-autofilter.png

「過濾器」按鈕(01-03-filter-icon-2.png)表示已應用過濾器。將鼠標懸停在已過濾列的標題上時,屏幕提示會顯示已應用於該列的過濾器,例如「等於紅色單元格顏色」或「大於150」。

01-04-autofilter.png

在工做表上設置一個自動篩選區域

在一系列單元格上設置自動過濾器。

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

自動過濾器範圍的第一行將是標題行,其中顯示自動過濾器下拉圖標。它不是實際的自動篩選數據的一部分。隨後的全部行都是自動過濾的數據。所以,自動篩選器範圍應始終包含標題行和一個或多個數據行(一個數據行是毫無心義的,可是PhpSpreadsheet並不會阻止您指定一個無心義的範圍:這取決於開發人員如何避免此類錯誤。

若是要將整個工做表設置爲自動篩選區域

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

這樣能夠進行過濾,但實際上不該用任何過濾器。

自動過濾器表達式

PHPEXcel 1.7.8引入了實際建立,讀取和寫入過濾器表達式的功能;最初僅適用於Xlsx文件,但更高版本會將其擴展爲其餘格式。

要將過濾器表達式應用於autoFilter範圍,首先須要肯定要將此過濾器應用於哪一列。

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

這將返回一個autoFilter列對象,而後您能夠將過濾器表達式應用於該列。

有許多不一樣類型的自動過濾器表達式。最經常使用的是:

  • 簡單過濾器
  • 日期組過濾器
  • 自定義過濾器
  • 動態濾鏡
  • 十大篩選器

這些不一樣類型在任何單個列中都是互斥的。您不該在同一列中混合使用不一樣類型的過濾器。PhpSpreadsheet不會主動阻止您執行此操做,可是結果是不可預測的。

尚不支持其餘過濾器表達式類型(例如單元格顏色過濾器)。

簡單的過濾器

在MS Excel中,「簡單過濾器」是該列中使用的全部值的下拉列表,用戶能夠經過選中和取消選中每一個選項旁邊的複選框來選擇要顯示的值和要隱藏的值。應用過濾器時,將顯示包含已選中條目的行,不包含那些值的行將被隱藏。

04-01-simple-autofilter.png

要建立過濾器表達式,咱們須要先肯定過濾器類型。在這種狀況下,咱們將僅指定此過濾器爲標準過濾器。

$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' ); 

這將建立兩個過濾規則:該列將使用與「 France」或「 Germany」匹配的值進行過濾。對於簡單過濾器,您能夠根據須要建立任意多個規則

簡單過濾器始終是EQUALS的比較匹配,而多個標準過濾器始終被視爲由OR條件鏈接。

配套空白

若是要建立過濾器以選擇空白單元格,則可使用:

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

日期組過濾器

在MS Excel中,DateGroup篩選器爲日期值提供了一系列下拉篩選器選擇器,所以您能夠指定整個年份或一年中的幾個月,或每月中的幾天。

04-02-dategroup-autofilter.png

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 ); 

關聯數組的鍵值爲:

  • 小時
  • 分鐘
  • 第二

與標準過濾器同樣,DateGroup過濾器始終是EQUALS的匹配項,而且多個標準過濾器始終被視爲由OR條件聯接。

請注意,咱們還指定了ruleType:爲了將其與標準過濾器區分開來,咱們將Rule's Type顯式設置爲AUTOFILTER_RULETYPE_DATEGROUP。與標準過濾器同樣,咱們能夠建立任意數量的DateGroup過濾器。

自定義過濾器

在MS Excel中,自定義過濾器容許咱們使用運算符和值來選擇更復雜的條件。典型示例多是落入某個範圍內的值(例如-20至+20之間),或者是帶有通配符的文本值(例如以字母U開頭)。爲了解決這個問題,他們

04-03-custom-autofilter-1.png

04-03-custom-autofilter-2.png

自定義過濾器限制爲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'」

若是要顯式匹配*或?字符,您可使用波浪號(\〜)對其進行轉義,所以?\〜**將顯式匹配*字符做爲單元格值中的第二個字符,後跟任意數量的其餘字符。惟一須要轉義的其餘字符是\〜自己。

要建立「介於」條件,咱們須要定義兩個規則:

$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。

這定義了兩個規則,即過濾>= -20OR的數字<= 20,所以咱們還須要修改聯接條件以反映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」)。一次只能將一個動態過濾器應用於一列。

04-04-dynamic-autofilter.png

一樣,咱們從指定過濾器類型開始,此次是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 'thisQuarter'
AUTOFILTER_RULETYPE_DYNAMIC_THISMONTH '這個月'
AUTOFILTER_RULETYPE_DYNAMIC_THISWEEK '本星期'
AUTOFILTER_RULETYPE_DYNAMIC_LASTYEAR '去年'
AUTOFILTER_RULETYPE_DYNAMIC_LASTQUARTER 「 lastQuarter」
AUTOFILTER_RULETYPE_DYNAMIC_LASTMONTH '上個月'
AUTOFILTER_RULETYPE_DYNAMIC_LASTWEEK '上個星期'
AUTOFILTER_RULETYPE_DYNAMIC_NEXTYEAR '明年'
AUTOFILTER_RULETYPE_DYNAMIC_NEXTQUARTER '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 '低於平均值'

咱們一次只能將一個動態過濾器規則應用於一列。

十大篩選器

前十個過濾器與動態過濾器類似,由於它們基於單元格中實際數據值的彙總。可是,與只能選擇一個選項的「動態過濾器」不一樣,「十大過濾器」使您能夠根據多個條件進行選擇:

04-05-custom-topten-1.png

04-05-custom-topten-2.png

您能夠肯定要使用最高(最高)值仍是最低(最低)值。能夠肯定要在過濾器中選擇多少個值。能夠肯定是百分比仍是多個項目。

與動態過濾器同樣,一次只能將一個前十名過濾器應用於一列。

咱們從指定過濾器類型開始,此次是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 number - ' , $row->getRowIndex() , ' '; echo $spreadsheet->getActiveSheet() ->getCell( 'C'.$row->getRowIndex() ) ->getValue(), ' '; echo $spreadsheet->getActiveSheet() ->getCell( 'D'.$row->getRowIndex() )->getFormattedValue(), ' '; echo PHP_EOL; } } 

自動篩選排序

在MS Excel中,自動篩選還容許對行進行排序。PhpSpreadsheet 支持此功能

相關文章
相關標籤/搜索