创build高级filter

我想在C#中创build一个Excel中的高级filter,以将独特的数据从一张表复制到另一张表,至less我在Excel中得到它,如果我使用这样的Interop:

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可以做同样的事情会更好。

那么有可能?

由于高级filter是一个Excelfunction,你需要完整的Excel DOM来访问它。 Epplus没有这个function – 它只是生成了XML来提供给excel,然后再应用它的“解释”,可以这么说。

但是由于您拥有.NET的强大function,您可以通过查询单元存储并使用.distinct()获取唯一列表,轻松使用linq来做同样的事情。 唯一的问题是你必须创build你自己的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()); } } }