2019年10月11日13:55:41php
PhpSpreadsheet依赖于Composer自动加载器。所以,在独立使用PhpSpreadsheet以前,请确保先运行composer install
。或使用将其添加到预先存在的项目中composer require phpoffice/phpspreadsheet
。前端
PhpSpreadsheet的体系结构以能够用做内存电子表格的方式构建。这意味着,若是要建立与PhpSpreadsheet的对象模型进行通讯的电子表格的基于Web的视图,则他只须要编写前端代码便可。数据库
就像桌面电子表格软件同样,PhpSpreadsheet表示包含一个或多个工做表的电子表格,该工做表包含具备数据,公式,图像等的单元格。express
就其自己而言,该Spreadsheet
班没有提供的功能读取或写入到一个持久的电子表格(在磁盘或数据库)。为了提供该功能,可使用读取器和写入器。编程
默认状况下,PhpSpreadsheet软件包提供了一些读取器和写入器,其中包括一种用于Open XML电子表格格式(也称为Excel 2007文件格式)的读写器。您不限于默认的读取器和编写器,由于您能够在自定义类中自由实现 \PhpOffice\PhpSpreadsheet\Reader\IReader
and \PhpOffice\PhpSpreadsheet\Writer\IWriter
接口。数组
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
将自动过滤器应用于必定范围的单元格时,自动过滤器范围中的第一行将是标题行,其中显示自动过滤器下拉图标。它不是实际的自动筛选数据的一部分。随后的全部行都是自动过滤的数据。所以,自动筛选器范围应始终包含标题行和一个或多个数据行(一个数据行几乎没有意义),可是PhpSpreadsheet并不会阻止您指定无心义的范围:由开发人员自行决定如何避免此类错误。
要肯定是否应用了过滤器,请注意列标题中的图标。下拉箭头()表示已启用过滤但未应用过滤。在MS Excel中,当您将鼠标悬停在启用了过滤但未应用过滤的列的标题上时,屏幕提示将显示该列第一行的单元格文本,并显示消息“(显示所有)”。
“过滤器”按钮()表示已应用过滤器。将鼠标悬停在已过滤列的标题上时,屏幕提示会显示已应用于该列的过滤器,例如“等于红色单元格颜色”或“大于150”。
在一系列单元格上设置自动过滤器。
$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中,“简单过滤器”是该列中使用的全部值的下拉列表,用户能够经过选中和取消选中每一个选项旁边的复选框来选择要显示的值和要隐藏的值。应用过滤器时,将显示包含已选中条目的行,不包含那些值的行将被隐藏。
要建立过滤器表达式,咱们须要先肯定过滤器类型。在这种状况下,咱们将仅指定此过滤器为标准过滤器。
$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筛选器为日期值提供了一系列下拉筛选器选择器,所以您能够指定整个年份或一年中的几个月,或每月中的几天。
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开头)。为了解决这个问题,他们
自定义过滤器限制为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。
这定义了两个规则,即过滤>= -20
OR的数字<= 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”)。一次只能将一个动态过滤器应用于一列。
一样,咱们从指定过滤器类型开始,此次是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 | '低于平均值' |
咱们一次只能将一个动态过滤器规则应用于一列。
前十个过滤器与动态过滤器类似,由于它们基于单元格中实际数据值的汇总。可是,与只能选择一个选项的“动态过滤器”不一样,“十大过滤器”使您能够根据多个条件进行选择:
您能够肯定要使用最高(最高)值仍是最低(最低)值。能够肯定要在过滤器中选择多少个值。能够肯定是百分比仍是多个项目。
与动态过滤器同样,一次只能将一个前十名过滤器应用于一列。
咱们从指定过滤器类型开始,此次是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 不支持此功能。