Python XlsxWriter - 应用过滤器
在 Excel 中,您可以使用逻辑表达式根据条件对表格数据设置过滤器。 在 XlsxWriter 的工作表类中,我们有 autofilter() 方法或目的。 此方法的强制参数是单元格范围。这会在标题行中创建下拉选择器。 要应用某些标准,我们有两种方法可用 − filter_column() 或 filter_column_list()。
为列应用过滤条件
在以下示例中,A1:D51 范围内的数据(即单元格 0,0 到 50,3)用作 autofilter() 方法的范围参数。过滤条件 'Region == East' 使用 filter_column() 方法设置在第 0 列(带有 Region 标题)。
示例
通过将工作表对象的set_row() 方法的hidden 选项设置为true 来隐藏数据范围内不符合过滤条件的所有行。
import xlsxwriter wb = xlsxwriter.Workbook('hello.xlsx') ws = wb.add_worksheet() data = ( ['Region', 'SalesRep', 'Product', 'Units'], ['East', 'Tom', 'Apple', 6380], ['West', 'Fred', 'Grape', 5619], ['North', 'Amy', 'Pear', 4565], ['South', 'Sal', 'Banana', 5323], ['East', 'Fritz', 'Apple', 4394], ['West', 'Sravan', 'Grape', 7195], ['North', 'Xi', 'Pear', 5231], ['South', 'Hector', 'Banana', 2427], ['East', 'Tom', 'Banana', 4213], ['West', 'Fred', 'Pear', 3239], ['North', 'Amy', 'Grape', 6520], ['South', 'Sal', 'Apple', 1310], ['East', 'Fritz', 'Banana', 6274], ['West', 'Sravan', 'Pear', 4894], ['North', 'Xi', 'Grape', 7580], ['South', 'Hector', 'Apple', 9814] ) for row in range(len(data)): ws.write_row(row,0, data[row]) ws.autofilter(0, 0, 50, 3) ws.filter_column(0, 'Region == East') row = 1 for row_data in (data): region = row_data[0] if region != 'East': ws.set_row(row, options={'hidden': True}) ws.write_row(row, 0, row_data) row += 1 wb.close()
输出
当我们借助Excel打开工作表时,我们会发现只有Region='East'的行是可见的,其他的是隐藏的(您可以通过清除过滤器再次显示)。
列参数可以是零索引列号或字符串列名。 Python 中允许的所有逻辑运算符都可以在条件中使用(==、!=、<、>、<=、>=)。 可以在多个列上定义筛选条件,并且可以通过 and 或 or 运算符组合它们。 具有逻辑运算符的条件示例如下 −
ws.filter_column('A', 'x > 2000') ws.filter_column('A', 'x != 2000') ws.filter_column('A', 'x > 2000 and x<5000')
请注意,criteria 参数中的"x"只是一个正式的占位符,可以是任何合适的字符串,因为它无论如何都会在内部被忽略。
ws.filter_column('A', 'price > 2000') ws.filter_column('A', 'x != 2000') ws.filter_column('A', 'marks > 60 and x<75')
XlsxWriter 还允许在包含字符串数据的列的过滤条件中使用通配符"*"和"?"。
ws.filter_column('A', name=K*') #starts with K ws.filter_column('A', name=*K*') #contains K ws.filter_column('A', name=?K*') # second character as K ws.filter_column('A', name=*K??') #any two characters after K
示例
在以下示例中,A 列的第一个过滤器要求区域为西部,D 列的第二个过滤器的条件是"units > 5000"。 不满足条件"region = West"或"units > 5000"的行将被隐藏。
import xlsxwriter wb = xlsxwriter.Workbook('hello.xlsx') ws = wb.add_worksheet() data = ( ['Region', 'SalesRep', 'Product', 'Units'], ['East', 'Tom', 'Apple', 6380], ['West', 'Fred', 'Grape', 5619], ['North', 'Amy', 'Pear', 4565], ['South', 'Sal', 'Banana', 5323], ['East', 'Fritz', 'Apple', 4394], ['West', 'Sravan', 'Grape', 7195], ['North', 'Xi', 'Pear', 5231], ['South', 'Hector', 'Banana', 2427], ['East', 'Tom', 'Banana', 4213], ['West', 'Fred', 'Pear', 3239], ['North', 'Amy', 'Grape', 6520], ['South', 'Sal', 'Apple', 1310], ['East', 'Fritz', 'Banana', 6274], ['West', 'Sravan', 'Pear', 4894], ['North', 'Xi', 'Grape', 7580], ['South', 'Hector', 'Apple', 9814]) for row in range(len(data)): ws.write_row(row,0, data[row]) ws.autofilter(0, 0, 50, 3) ws.filter_column('A', 'x == West') ws.filter_column('D', 'x > 5000') row = 1 for row_data in (data[1:]): region = row_data[0] volume = int(row_data[3]) if region == 'West' or volume > 5000: pass else: ws.set_row(row, options={'hidden': True}) ws.write_row(row, 0, row_data) row += 1 wb.close()
输出
在 Excel 中,可以在 A 列和 D 列标题上看到过滤器图标。 过滤后的数据如下所示 −
应用列列表过滤器
filter_column_list() 方法可用于表示具有 Excel 2007 样式的多个选定条件的过滤器。
ws.filter_column_list(col,list)
第二个参数是一个值列表,给定列中的数据与这些值相匹配。 例如 −
ws.filter_column_list('C', ['March', 'April', 'May'])
它会过滤数据,使 C 列中的值与列表中的任何项目相匹配。
示例
在下面的示例中,filter_column_list() 方法用于过滤区域等于 East 或 West 的 rows。
import xlsxwriter wb = xlsxwriter.Workbook('hello.xlsx') ws = wb.add_worksheet() data = ( ['Region', 'SalesRep', 'Product', 'Units'], ['East', 'Tom', 'Apple', 6380], ['West', 'Fred', 'Grape', 5619], ['North', 'Amy', 'Pear', 4565], ['South', 'Sal', 'Banana', 5323], ['East', 'Fritz', 'Apple', 4394], ['West', 'Sravan', 'Grape', 7195], ['North', 'Xi', 'Pear', 5231], ['South', 'Hector', 'Banana', 2427], ['East', 'Tom', 'Banana', 4213], ['West', 'Fred', 'Pear', 3239], ['North', 'Amy', 'Grape', 6520], ['South', 'Sal', 'Apple', 1310], ['East', 'Fritz', 'Banana', 6274], ['West', 'Sravan', 'Pear', 4894], ['North', 'Xi', 'Grape', 7580], ['South', 'Hector', 'Apple', 9814] ) for row in range(len(data)): ws.write_row(row,0, data[row]) ws.autofilter(0, 0, 50, 3) l1= ['East', 'West'] ws.filter_column_list('A', l1) row = 1 for row_data in (data[1:]): region = row_data[0] if region not in l1: ws.set_row(row, options={'hidden': True}) ws.write_row(row, 0, row_data) row += 1 wb.close()
输出
A 列显示应用了自动过滤器。 显示 Region 为 East 或 West 的所有行,其余行隐藏。
在 Excel 软件中,单击 Region 标题中的 filter 选择器箭头,我们应该会看到应用了等于 East 或 West 的区域过滤器。< /p>