2

这对各位大师来说可能是一件非常简单的事情,但我不熟悉 C#4 和 INTEROP。因此,我很难过。这是我的问题。我有一个包含重复数据的 excel 列,我想将其修剪为唯一值。数据如下所示:

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

所以,最后我只想要 ColB 的唯一名称:

Adam
Jane
Eve

我知道我可以通过将所有这些值放入一个 List 中,然后向其中添加 Distinct 功能来做到这一点。但我认为我做错了什么。无论如何,这是我的程序:

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 执行此操作?

提前致谢。

4

3 回答 3

6

您可以使用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()
于 2012-05-02T20:56:06.337 回答
1

LinqToExcel 内置 distinct() 支持单个属性。我在下面使用来区分多个列:

  1. 将它移到内存中,.AsEnumerable()。
  2. 使用结构(c#),而不是类。struct 是值类型,class 不是。

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
于 2015-02-06T16:32:35.460 回答
-2

在 Excel 中,选择列,转到.. 数据 > 删除重复项

在此处输入图像描述

这为您留下了独特的价值。

于 2012-12-04T20:37:14.583 回答