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);

Excel に対して C#4 を使用してこれを行うにはどうすればよいですか?

前もって感謝します。

4

3 に答える 3

6

LinqToExcelを使用して、列の個別の値を簡単に取得できます

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

編集:

DistinctLinqToExcel で使用するには、行データに対応するクラスを使用する必要があります。

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#) を使用します。構造体は値型ですが、クラスはそうではありません。

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 に答える