如何在Excel中将excel文件数据导入数据表

时间:2015-12-07 13:48:43

标签: c# .net excel epplus

我正在将数据从excel文件移动到datatable,其中第10行是列值。所以我使用EPPLUS库(OfficeOpenXml)使用以下代码。当我移动到datatable时,列是Item,Description,Accountnumber,Tender,Levelnumbers。我说这些所有这些都是excel文件的第10行,因此由于顶层列的合并,它将以Item,Column1,Column2,Description,Column3,Column4,Column5,Tender,Column6,Levelnumbers之类的顺序出现。我需要一个逻辑,就像我需要跳过列{{的空行(无数据) 1}}然后将描述列名称移动到Column4,并将Description的当前列命名为' Edata',因此列序列应该类似于Levelnumbers

因此,通过使用以下代码,我得到了数据表中的值,如

Item,Column1,Column2,Edata,Column3,Description,Column5,Tender,Column6,Levelnumbers

但它应该是这样的(跳过的值有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

使用的代码是

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

1 个答案:

答案 0 :(得分:1)

如果我理解你的要求(如果没有,请告诉我)你只是希望能够过滤掉最后一列中缺少值的行?最好进行显式的单元格引用调用,而不是尝试类似wsRow.Last()之类的内容,因为wsRow范围只会返回包含值的单元格,因此Last()永远不会返回对最后一个的引用列单元格,因为它将为null。

至于替换列名,填写列列表时只需要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);
}