ClosedXML Excel按多列中的值筛选行

我有一个Excel文件,有几千行和最多“BP”的列。 我需要通过列C和BP中的特定值来过滤所有这些行。

我按照下面的代码testing了ClosedXML中的filterfunction。

当我将一个filter应用到一列时,所有工作都很好,数据保存在新文件中。

当我尝试应用两个filter时,执行的最后一个是应用的filter。

我试图使用工作表作为范围/表,相同的过滤问题。

我最终创build了“行”expression式,工作,但第一行(标题)被过滤掉。

public static void Filter(string source, string newFile) { using (var workbook = new XLWorkbook(source)) { IXLWorksheet worksheet = workbook.Worksheet(1); int salesFoundCell = worksheet.FirstRow().Cells().First(c => c.Value.ToString() == "Sales Order Description").Address.ColumnNumber; int revenueFoundCell = worksheet.FirstRow().Cells().First(c => c.Value.ToString() == "Revenue recognition date").Address.ColumnNumber; //worksheet.RangeUsed().SetAutoFilter().Column(salesFoundCell).EqualTo("Equipment Sale"); //worksheet.RangeUsed().SetAutoFilter().Column(revenueFoundCell).EqualTo("00.00.0000"); //var rows = worksheet.RowsUsed().Where(r => r.CellsUsed().Any(c => c.GetString().Contains("Equipment Sale")) && // r.CellsUsed().Any(c => c.GetString().Contains("00.00.0000"))); Console.WriteLine(rows.Count()); //workbook.SaveAs(newFile); } } 

我也尝试了在ClosedXML wiki上发布的方法,在那里你将工作表保存为一个MemoryStream,重新应用这个filter,然后将它保存到一个新的文件中。

这是简短的版本:

 public void Create(string filePath) { var wb = new XLWorkbook(); IXLWorksheet ws; #region Multi Column String multiColumn = "Multi Column"; ws = wb.Worksheets.Add(multiColumn); // Add filters ws.RangeUsed().SetAutoFilter().Column(2).EqualTo(3).Or.GreaterThan(4); ws.RangeUsed().SetAutoFilter().Column(3).Between("B", "D"); // Sort the filtered list ws.AutoFilter.Sort(3); #endregion using (var ms = new MemoryStream()) { wb.SaveAs(ms); var workbook = new XLWorkbook(ms); #region Multi Column workbook.Worksheet(multiColumn).AutoFilter.Column(3).EqualTo("E"); workbook.Worksheet(multiColumn).AutoFilter.Sort(3, XLSortOrder.Descending); #endregion workbook.SaveAs(filePath); ms.Close(); } } 

我经历了以下两个expression式的几次迭代:

 worksheet.RangeUsed().SetAutoFilter().Column(salesFoundCell).EqualTo("Equipment Sale"); worksheet.RangeUsed().SetAutoFilter().Column(revenueFoundCell).EqualTo("00.00.0000"); 

我尝试直接在列上过滤,作为一个范围,作为一个表,试图隐藏没有所需值的行。

所有这些或者基于一列进行过滤,或者根本不进行过滤。

“expression式.AddFilter(一些值).AddFilter(一些其他值);” 没有帮助,因为我不想在同一列上添加多个filter

“和/或”function也是一样,在同一列上有多个filter。

有没有人设法根据多个列中的值进行过滤?

任何意见,非常感谢。

尝试在这里find下面的sorting方法

 myRange.SortColumns.Add(firstColumnNumber, XLSortOrder.Ascending); myRange.SortColumns.Add(secondColumnNumber, XLSortOrder.Ascending); myRange.Sort(); 

这是我的答案。 我在同一个问题上挣扎了一段时间。

关键是sorting,在定义filter之后必须完成。

 var excelTable = TableRange.CreateTable(); excelTable.AutoFilter.Column(26).AddFilter("Filter 1"); excelTable.AutoFilter.Column(26).AddFilter("Filter 2"); excelTable.AutoFilter.Sort(1, XLSortOrder.Ascending);