【发布时间】:2017-09-05 14:01:27
【问题描述】:
我有一个包含数千行和数千列的 Excel 文件,直到“BP”。 我需要按列 C 和 BP 中的特定值过滤所有这些行。
我按照下面的代码测试了 ClosedXML 中的过滤器功能。
当我对一列应用过滤器时,一切正常,数据保存在新文件中。
当我尝试应用两个过滤器时,最后一个执行的就是应用的那个。
我曾尝试将工作表用作范围/表格,同样的过滤问题。
我最终创建了“行”表达式,它有效,但第一行(标题)被过滤掉了。
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,重新应用过滤器,然后将其保存到新文件中。
这是简短的版本:
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();
}
}
我对以下两个表达式进行了多次迭代:
worksheet.RangeUsed().SetAutoFilter().Column(salesFoundCell).EqualTo("Equipment Sale");
worksheet.RangeUsed().SetAutoFilter().Column(revenueFoundCell).EqualTo("00.00.0000");
我尝试直接在列上过滤,作为范围,作为表格,试图隐藏没有所需值的行。
所有这些要么基于一列过滤,要么根本不过滤。
“表达式.AddFilter(某个值).AddFilter(某个其他值);”没有帮助,因为我不想在同一列上添加多个过滤器
“与/或”功能的作用相同,在同一列上有多个过滤器。
有没有人设法根据多列中的值进行过滤?
非常感谢任何建议。
【问题讨论】:
-
我认为这是对过滤器的误解 - 每张纸只能有一个:请参阅我的问题和自我回答。 stackoverflow.com/a/60325493/3561565
标签: c# excel windows-7 closedxml