2015-08-18 127 views
3

非常感謝您的幫助。使用EPPlus從Excel中獲取所有單元格值

我想使用EPPlus庫中的ExcelWorksheet對象,並檢索所有包含值以及位置的單元格。

在一天結束時,我想要一本類似這樣的字典。

Dictionary<KeyValuePair<int, int>, object> values. 

我正在尋找一個很好,乾淨的方式來提取單元格值到此字典中以供使用。

我很清楚,你可以像下面那樣直接引用單元格的值,但是提取所有數據是否有很好的乾淨方式?

worksheet.Cells[row, column]; 

任何意見將不勝感激,因爲我對圖書館幾乎一無所知。 :)

感謝

回答

4

有一個在EPPlus沒有原生功能的細胞集直接轉換爲另一個集合,但它確實實現IEnumerable所以你可以很容易與Linq工作表上做到這一點。這個工程出很好,因爲cells只包含包含值的單元格引用,所以你甚至不需要指定行/列的限制:

[TestMethod] 
public void Cells_To_Dictionary_Test() 
{ 
    //http://stackoverflow.com/questions/32066500/get-all-the-cell-values-from-excel-using-epplus 

    //Throw in some data 
    var datatable = new DataTable("tblData"); 
    datatable.Columns.AddRange(new[] { new DataColumn("Col1", typeof(int)), new DataColumn("Col2", typeof(int)), new DataColumn("Col3", typeof(object)) }); 

    for (var i = 0; i < 10; i++) 
    { 
     var row = datatable.NewRow(); 
     row[0] = i; 
     row[1] = i * 10; 
     row[2] = Path.GetRandomFileName(); 
     datatable.Rows.Add(row); 
    } 

    //Create a test file 
    var existingFile = new FileInfo(@"c:\temp\Grouped.xlsx"); 
    if (existingFile.Exists) 
     existingFile.Delete(); 

    using (var pck = new ExcelPackage(existingFile)) 
    { 
     var worksheet = pck.Workbook.Worksheets.Add("Sheet1"); 
     worksheet.Cells.LoadFromDataTable(datatable, true); 
     pck.Save(); 
    } 

    //Load a dictionary from a file 
    using (var pck = new ExcelPackage(existingFile)) 
    { 
     var worksheet = pck.Workbook.Worksheets["Sheet1"]; 

     //Cells only contains references to cells with actual data 
     var cells = worksheet.Cells; 
     var dictionary = cells 
      .GroupBy(c => new {c.Start.Row, c.Start.Column}) 
      .ToDictionary(
       rcg => new KeyValuePair<int, int>(rcg.Key.Row, rcg.Key.Column), 
       rcg => cells[rcg.Key.Row, rcg.Key.Column].Value); 

     foreach (var kvp in dictionary) 
      Console.WriteLine("{{ Row: {0}, Column: {1}, Value: \"{2}\" }}", kvp.Key.Key, kvp.Key.Value, kvp.Value); 
    } 
} 

其中在輸出端產生這樣的:

{ Row: 1, Column: 1, Value: "Col1" } 
{ Row: 1, Column: 2, Value: "Col2" } 
{ Row: 1, Column: 3, Value: "Col3" } 
{ Row: 2, Column: 1, Value: "0" } 
{ Row: 2, Column: 2, Value: "0" } 
{ Row: 2, Column: 3, Value: "o103ujwu.hmq" } 
{ Row: 3, Column: 1, Value: "1" } 
{ Row: 3, Column: 2, Value: "10" } 
{ Row: 3, Column: 3, Value: "awyajw2t.lwa" } 
{ Row: 4, Column: 1, Value: "2" } 
{ Row: 4, Column: 2, Value: "20" } 
{ Row: 4, Column: 3, Value: "mjhlre2d.nh2" } 
{ Row: 5, Column: 1, Value: "3" } 
{ Row: 5, Column: 2, Value: "30" } 
{ Row: 5, Column: 3, Value: "dypjvona.m3w" } 
{ Row: 6, Column: 1, Value: "4" } 
{ Row: 6, Column: 2, Value: "40" } 
{ Row: 6, Column: 3, Value: "s5oushbr.sax" } 
{ Row: 7, Column: 1, Value: "5" } 
{ Row: 7, Column: 2, Value: "50" } 
{ Row: 7, Column: 3, Value: "1vqjxxky.2gn" } 
{ Row: 8, Column: 1, Value: "6" } 
{ Row: 8, Column: 2, Value: "60" } 
{ Row: 8, Column: 3, Value: "2dw00hi0.pjp" } 
{ Row: 9, Column: 1, Value: "7" } 
{ Row: 9, Column: 2, Value: "70" } 
{ Row: 9, Column: 3, Value: "qgottyza.vnu" } 
{ Row: 10, Column: 1, Value: "8" } 
{ Row: 10, Column: 2, Value: "80" } 
{ Row: 10, Column: 3, Value: "yx4tmvdp.2pq" } 
{ Row: 11, Column: 1, Value: "9" } 
{ Row: 11, Column: 2, Value: "90" } 
{ Row: 11, Column: 3, Value: "jutk2r0v.1yx" } 
+0

這是一個好的解決方案謝謝 –

+0

@ Marcel-Is-Hier很高興它有幫助。請記住將其標記爲答案,這樣問題就不存在了。 – Ernie

+0

差點忘了。順便說一句,是否有可能嘲笑工作表對象? –

相關問題