ClosedXML中的自动筛选功能详解

ClosedXML中的自动筛选功能详解

ClosedXML ClosedXML is a .NET library for reading, manipulating and writing Excel 2007+ (.xlsx, .xlsm) files. It aims to provide an intuitive and user-friendly interface to dealing with the underlying OpenXML API. ClosedXML 项目地址: https://gitcode.com/gh_mirrors/cl/ClosedXML

自动筛选概述

自动筛选(AutoFilter)是Excel中一项强大的数据处理功能,它允许用户快速对工作表中的数据进行排序和筛选。在ClosedXML库中,这一功能得到了完整的实现,开发者可以通过编程方式控制自动筛选的各种行为。

自动筛选的主要特点包括:

  • 可以应用于整个工作表或特定表格
  • 支持多种筛选类型(常规筛选、自定义筛选、动态筛选等)
  • 能够保持排序状态(通过列标题上的箭头指示)
  • 通过漏斗图标显示当前筛选状态

基本使用

创建自动筛选

在ClosedXML中创建自动筛选非常简单。对于工作表范围,可以使用IXLRange.SetAutoFilter()方法;对于表格,则使用IXLTable.SetAutoFilter()方法。

// 创建工作表并插入数据
using var wb = new XLWorkbook();
var ws = wb.AddWorksheet();
var range = ws.Cell("B3").InsertData(new[]
{
    new object[]{ "产品", "销量", "利润率" },
    new object[]{ "蛋糕", 14, 0.25 },
    new object[]{ "牛角包", 15, 0.60 },
    new object[]{ "无花果卷", 56, 0.50 },
    new object[]{ "华夫饼", 74, 0.60 },
});

// 创建自动筛选
range.SetAutoFilter();

清除和重新应用筛选

  • 清除筛选:使用IXLFilterColumn.Clear()方法可以清除特定列的筛选设置,但保留筛选箭头图标
  • 重新应用筛选:当数据或工作簿结构发生变化时,可以使用IXLAutoFilter.Reapply()方法重新评估筛选条件
  • 移除自动筛选:通过IXLAutoFilter.Clear()方法或设置IXLAutoFilter.IsEnabled为false可以完全移除自动筛选

排序功能

自动筛选支持对数据进行排序,但有以下限制:

  • 每次只能按一列排序
  • 排序状态会通过列标题上的箭头显示
// 按利润率降序排序
range.SetAutoFilter().Sort(3, XLSortOrder.Descending);

排序状态可以通过以下属性访问:

  • IXLAutoFilter.Sorted:指示范围是否已排序
  • IXLAutoFilter.SortColumn:用于排序的列
  • IXLAutoFilter.SortOrder:排序顺序(升序或降序)

筛选类型详解

ClosedXML支持多种筛选类型,每种类型适用于不同的场景。

1. 常规筛选

常规筛选允许用户从列中所有可能值的列表中选择要显示的值。在ClosedXML中,可以通过以下方法实现:

// 添加常规筛选
range.SetAutoFilter().Column(1)
    .AddFilter("蛋糕", false)
    .AddFilter("华夫饼");

对于日期数据,还可以使用日期组筛选:

// 添加日期组筛选(筛选2020年1月的数据)
.AddDateGroupFilter(new DateTime(2020, 1, 1), XLDateTimeGrouping.Month);

注意:常规筛选的比较是基于单元格的格式化文本值,并且受当前区域设置影响。

2. 自定义筛选

自定义筛选允许定义更复杂的条件,包括比较和模式匹配。

比较筛选

支持多种比较操作符:

  • GreaterThan(大于)
  • EqualOrGreaterThan(大于等于)
  • EqualTo(等于)
  • NotEqualTo(不等于)
  • EqualOrLessThan(小于等于)
  • LessThan(小于)
// 筛选销量小于等于5的产品
autoFilter.Column(2).EqualOrLessThan(5);

可以组合两个条件,使用AndOr连接:

// 筛选成绩大于"C"且不等于"N/A"的记录
gradesRange.SetAutoFilter().Column(1).GreaterThan("C", false).And.NotEqualTo("N/A");
模式筛选

支持通配符匹配:

  • *:匹配零个或多个字符
  • ?:匹配一个字符
  • ~:转义字符

ClosedXML提供了便捷方法:

  • BeginsWith/NotBeginsWith(以...开头)
  • EndsWith/NotEndsWith(以...结尾)
  • Contains/NotContains(包含)
// 筛选以"CZ"开头的代码
gradesRange.SetAutoFilter().Column(1).BeginsWith("CZ");

3. 动态筛选

目前ClosedXML支持平均值动态筛选:

  • AboveAverage()(高于平均值)
  • BelowAverage()(低于平均值)
// 筛选高于平均值的记录
gradesRange.SetAutoFilter().Column(1).AboveAverage();

4. Top10筛选

Top10筛选用于显示最高或最低的若干条记录,可以指定具体数量或百分比:

// 筛选前25%的记录
gradesRange.SetAutoFilter().Column(1).Top(25, XLTopBottomType.Percent);

注意:当存在相同值时,实际显示的记录数可能会多于指定数量。

最佳实践和注意事项

  1. 性能考虑:当需要设置多个筛选条件时,可以将reapply参数设为false,最后再手动调用Reapply()方法,避免多次重新计算筛选。

  2. 区域设置影响:数字和日期的格式会影响常规筛选的行为,特别是在不同区域设置之间共享工作簿时。

  3. 筛选范围:自动筛选会隐藏整行数据,即使这些单元格不在筛选范围内。

  4. 表格筛选:表格的自动筛选不会包含汇总行。

  5. OpenXML限制:同时使用常规筛选和日期组筛选时,OpenXML SDK会报验证错误(尽管Excel可以正确处理)。

通过掌握ClosedXML中的自动筛选功能,开发者可以创建功能丰富的数据处理应用程序,为用户提供强大的数据分析和操作能力。

ClosedXML ClosedXML is a .NET library for reading, manipulating and writing Excel 2007+ (.xlsx, .xlsm) files. It aims to provide an intuitive and user-friendly interface to dealing with the underlying OpenXML API. ClosedXML 项目地址: https://gitcode.com/gh_mirrors/cl/ClosedXML

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

管旭韶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值