2015-12-07 52 views
0

我正在將數據從excel文件移動到數據表,其中第10行是列值。因此,我通過使用EPPLUS庫(OfficeOpenXml)使用以下代碼。當我移動到數據表時列是Item,Description,Accountnumber,Tender,Levelnumbers。我說這些都是excel文件的第10行,因此由於頂級列的合併,它會像Item,Column1,Column2,Description,Column3,Column4,Column5,Tender,Column6,Levelnumbers這樣的序列進來。我需要一個像第一個邏輯,我需要跳過空行(無數據)列Levelnumbers然後描述列名應移到Column4和描述的當前列應命名,如「EDATA」,所以列順序應該是這樣Item,Column1,Column2,Edata,Column3,Description,Column5,Tender,Column6,Levelnumbers如何將excel文件數據導入到c#中的數據表中

所以乾脆用下面的代碼我得到了在數據表中的值一樣

Item,Column1,Column2,Description,Column3,Column4,Column5,Tender,Column6,Levelnumbers 
1,null,null,Efax,null,Edescription1,null,Tfirst,null,123353 
2,null,null,Zfax,null,Zdescription1,null,Tsecond,null,null 
3,null,null,Xfax,null,Xdescription1,null,Tthird,null,456546 

但它應該像(Levelnumbers空白的跳過值),如何實現它?使用

Item,Column1,Column2,Edata,Column3,Description,Column5,Tender,Column6,Levelnumbers 
1,null,null,Efax,null,Edescription1,null,Tfirst,null,123353 
3,null,null,Xfax,null,Xdescription1,null,Tthird,null,456546 

代碼

public static DataTable getDataTableFromExcel(string path) 
     { 
      using (var pck = new OfficeOpenXml.ExcelPackage()) 
      { 
       DataTable tbl = new DataTable(); 
       try 
       { 
        using (var stream = File.OpenRead(path)) 
        { 
         pck.Load(stream); 
        } 
        var ws = pck.Workbook.Worksheets.First(); 
        bool hasHeader = true; // adjust it accordingly(i've mentioned that this is a simple approach) 
        string ErrorMessage = string.Empty; 
        foreach (var firstRowCell in ws.Cells[10, 1, 17, ws.Dimension.End.Column]) 
        { 
         tbl.Columns.Add(hasHeader ? firstRowCell.Text : string.Format("Column {0}", firstRowCell.Start.Column)); 
        } 
        var startRow = hasHeader ? 11 : 1; 
        for (var rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++) 
        { 
         var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column]; 
         var row = tbl.NewRow(); 
         foreach (var cell in wsRow) 
         { 
          row[cell.Start.Column - 1] = cell.Text; 
         } 
         tbl.Rows.Add(row); 
        } 
       } 
       catch (Exception exp) 
       { 

       } 
       return tbl; 
      } 
     } 
+0

我需要它,我得到的,而不是Excel數據表玩? – peter

回答

1

如果我理解你的要求(讓我知道如果不)你只是希望能夠過濾掉行缺少在最後一列的值?最好做一個明確的單元格引用調用,而不是嘗試類似wsRow.Last(),因爲wsRow範圍將只返回其中包含值的單元格,因此Last()將永遠不會返回對最後一列單元格的引用,因爲它將爲空。

至於替換列名稱,填充列列表時只需填入if語句。

這應做到:

//foreach (var firstRowCell in ws.Cells[10, 1, 17, ws.Dimension.End.Column]) -- ASSUME YOU MEANT ONLY THE 10TH ROW? 
foreach (var firstRowCell in ws.Cells[10, 1, 10, ws.Dimension.End.Column]) 
{ 
    if (!hasHeader) 
     tbl.Columns.Add(string.Format("Column {0}", firstRowCell.Start.Column)); 
    else if(firstRowCell.Text == "Description") 
     tbl.Columns.Add("Edata"); 
    else if (firstRowCell.Text == "Column4") 
     tbl.Columns.Add("Description"); 
    else 
     tbl.Columns.Add(firstRowCell.Text); 
} 

var startRow = hasHeader ? 11 : 1; 
for (var rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++) 
{ 
    //Skip row if last column is null 
    if (ws.Cells[rowNum, ws.Dimension.End.Column].Value == null) 
     continue; 

    var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column]; 
    var row = tbl.NewRow(); 
    foreach (var cell in wsRow) 
    { 
     row[cell.Start.Column - 1] = cell.Text; 
    } 
    tbl.Rows.Add(row); 
} 
+0

讓我試試看,我會隨我的更新而來,謝謝 – peter

相關問題