【问题标题】:ClosedXML Excel filter rows by values in multiple columnsClosedXML Excel 按多列中的值过滤行
【发布时间】: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(某个其他值);”没有帮助,因为我不想在同一列上添加多个过滤器

“与/或”功能的作用相同,在同一列上有多个过滤器。

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

非常感谢任何建议。

【问题讨论】:

标签: c# excel windows-7 closedxml


【解决方案1】:

试试下面找到的排序方法here

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

【讨论】:

    【解决方案2】:

    这是我的答案。我为同样的问题苦苦挣扎了一段时间。

    关键是排序,必须在定义过滤器后完成。

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

    【讨论】:

    • 是的,这仅在您仅过滤一列时有效。这就是我想要做的:var table = workbook.Worksheet(1).RangeUsed().CreateTable(); table.AutoFilter.Column(3).AddFilter("Filter 1"); table.AutoFilter.Column(58).AddFilter("Filter 2"); table.AutoFilter.Sort(1, XL.XLSortOrder.Ascending);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多