LinqToExcel:在Excel列不同的值(LinqToExcel: Distinct valu

2019-09-16 23:51发布

这可能是一个非常简单的事情对你的大师,但我不熟悉C#4和INTEROP。 因此,我很为难。 这里是我的问题。 我有一个具有重复数据的Excel列,我想修剪下来到唯一的值。 下面是数据的模样:

ColA    ColB
10      Adam
12      Jane
14      Adam
18      Adam
20      Eve

所以,最后我只想从COLB唯一的名称:

Adam
Jane
Eve

我知道,我可以让所有这些值转换成一个列表,然后将所述不同的功能,它做到这一点。 但我觉得我做错了什么。 总之,这里是我的程序:

Application XLApp = new Microsoft.Office.Interop.Excel.Application();
var XLBook = XLApp.Workbooks.Open(@"c:\temp\Test.xls", ReadOnly: false);
// Grab the 1st sheet
var XLSheet = (Microsoft.Office.Interop.Excel.Worksheet)XLBook.Worksheets.get_Item(1);

XLApp.Visible = true;
// I think I need help with the following lines
IEnumerable<string> myCol = XLApp.Range["B2", XLApp.Range["B2"].End[XlDirection.xlDown]].Select();
myCol.ToList().Distinct();

XLBook.Close(false, System.Reflection.Missing.Value, System.Reflection.Missing.Value);
((_Application)XLApp).Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(XLApp);

我该如何去这样做使用C#4对Excel的?

提前致谢。

Answer 1:

您可以使用LinqToExcel轻松搞定一列中的重复值

var excel = new ExcelQueryFactory("worksheetFileName");
var distinctNames = (from row in excel.WorkSheet()
                     select row["ColB"]).Distinct()

编辑:

要使用Distinct的LinqToExcel,你必须使用对应于该行数据的类。

public class WorksheetRow
{
    public string ColA { get; set; }
    public string ColB { get; set; }
}

var excel = new ExcelQueryFactory("worksheetFileName");
var distinctNames = (from row in excel.WorkSheet<WorksheetRow>()
                     select row.ColB).Distinct()


Answer 2:

LinqToExcel内置独特的()支持的一个属性。 我下面使用不同的多个列:

  1. 它移动到内存,.AsEnumerable()。
  2. 使用结构(C#),而不是类。 结构是值类型,类是没有的。

public struct RowStruct  
{
    public string C1 {get; set;}
    public string C2 {get; set;}
    public int C3 {get; set;}
}

public class RowClass // class is NOT distinct friendly
{
    public string C1 {get; set;}
    public string C2 {get; set;}
    public int C3 {get; set;}
}

void Main()
{
    var excel = new ExcelQueryFactory(@"C:\Temp\a.xlsx");
    var qs = from c in excel.Worksheet<RowStruct>("Sheet1") select c;
    Console.WriteLine ("struct distinct is:{0}", 
         qs.AsEnumerable().Distinct().Count());

    var qc = from c in excel.Worksheet<RowClass>("Sheet1") select c;
    Console.WriteLine ("class distinct is:{0}", 
         qc.AsEnumerable().Distinct().Count());
}

我a.xlsx有重复的数据,这里是我的结果:

struct distinct is:235
class distinct is:329


Answer 3:

在Excel中,选择列,去..数据>删除重复

这使你具有独特的价值。



文章来源: LinqToExcel: Distinct values in excel column