如何将excel文件数据导入到c#中的数据表

我将数据从excel文件移动到数据表,其中第10行是列值。所以我使用EPPLUS库(OfficeOpenXml)下面的代码。当我移动到数据表的列是Item,Description,Accountnumber,Tender,Levelnumbers 。这些都是excel文件的第10行,因此,由于顶级列的合并,它会像Item,Column1,Column2,Description,Column3,Column4,Column5,Tender,Column6,Levelnumbers这样的Item,Column1,Column2,Description,Column3,Column4,Column5,Tender,Column6,Levelnumbers 。我需要一个像首先我需要跳过空行(无数据)列Levelnumbers然后说明列名称应该移动到Column4和当前描述的列应该命名为'Edata',所以列序列应该像Item,Column1,Column2,Edata,Column3,Description,Column5,Tender,Column6,Levelnumbers

所以总的来说,通过使用下面的代码我得到了像数据表中的值

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

如果我明白你在问什么(如果没有,请告诉我),你只是希望能够过滤掉最后一列中缺less值的行? 最好做一个明确的单元格引用调用,而不是像wsRow.Last()那样尝试,因为wsRow范围只会返回其中包含值的单元格,所以Last()永远不会返回对最后一个列单元格的引用,因为它是空值。

至于replace列名,所有你需要的是填充列列表时的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); }