【问题标题】:Create advanced filter创建高级过滤器
【发布时间】:2015-10-29 19:09:28
【问题描述】:

我正在尝试从 C# 在 Excel 中创建一个高级过滤器,以将唯一数据从一个工作表复制到另一个工作表,至少我在 Excel 中得到它,如果我像这样使用互操作:

   Excel.Range rang = sheet2.get_Range("A2");  
   Excel.Range oRng = sheet.get_Range("I2", "I" + (lst.Count + 1));


    oRng.AdvancedFilter(Excel.XlFilterAction.xlFilterCopy, CriteriaRange: Type.Missing,
                        CopyToRange: rang, Unique: true);

工作正常,但我正在使用 EPPlus 完成我的所有应用程序,如果我能在没有 Interop 的情况下做同样的事情会更好。

那么,有可能吗?

【问题讨论】:

    标签: excel interop epplus


    【解决方案1】:

    由于高级过滤器是一个 Excel 函数,您需要完整的 Excel DOM 才能访问它。 Epplus 没有 - 它只是生成 XML 以提供给 excel,然后应用它的“解释”,可以这么说。

    但由于您可以使用 .NET 的强大功能,因此您可以通过查询单元存储并使用 .distinct() 获取唯一列表来相当轻松地使用 linq 来做同样的事情。唯一的问题是您必须创建自己的IEquitableComparer。这样就可以了:

    [TestMethod]
    public void Distinct_Filter_Test()
    {
        //Throw in some data
        var datatable = new DataTable("tblData");
        datatable.Columns.AddRange(new[]
        {
            new DataColumn("Col1", typeof (int)), new DataColumn("Col2", typeof (string))
        });
    
        var rnd = new Random();
        for (var i = 0; i < 10; i++)
        {
            var row = datatable.NewRow();
            row[0] = rnd.Next(1, 3) ;row[1] = i%2 == 0 ? "even": "odd";
            datatable.Rows.Add(row);
        }
    
        //Create a test file
        var fi = new FileInfo(@"c:\temp\Distinct_Filter.xlsx");
        if (fi.Exists)
            fi.Delete();
    
        using (var pck = new ExcelPackage(fi))
        {
            //Load the random data
            var workbook = pck.Workbook;
            var worksheet = workbook.Worksheets.Add("data");
            worksheet.Cells.LoadFromDataTable(datatable, true);
    
            //Cells only contains references to cells with actual data
            var rows = worksheet.Cells
                .GroupBy(cell => cell.Start.Row)
                .Skip(1) //Exclude header
                .Select(cg => cg.Select(c => c.Value).ToArray())
                .Distinct(new ArrayComparer())
                .ToArray();
    
            //Copy the data to the new sheet
            var worksheet2 = workbook.Worksheets.Add("Distinct");
            worksheet2.Cells.LoadFromArrays(rows);
    
            pck.Save();
        }
    
    }
    
    
    public class ArrayComparer: IEqualityComparer<object[]>
    {
        public bool Equals(object[] x, object[] y)
        {
            return !x.Where((o, i) => !o.Equals(y[i])).Any();
        }
    
        public int GetHashCode(object[] obj)
        {
            //Based on Jon Skeet Stack Overflow Post
            unchecked
            {
                return obj.Aggregate((int) 2166136261, (acc, next) => acc*16777619 ^ next.GetHashCode());
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-22
      • 2011-02-01
      相关资源
      最近更新 更多