我正在将数据从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
答案 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);
}