将数据从Excel导入到DataTable
某些不包含任何数据的行将被跳过,并且该行中有数据的下一个行被用作空行的值
例如
在Excel中,当我使用openxml将excel转换为Datatable时,共有37行,它跳过了空行,只读取了29行
WorksheetPart worksheetPart = (WorksheetPart)spreadSheetDocument.WorkbookPart.GetPartById(relationshipId);
Worksheet workSheet = worksheetPart.Worksheet;
SheetData sheetData = workSheet.GetFirstChild<SheetData>();
IEnumerable<Row> rows = sheetData.Descendants<Row>();
foreach (Row row in rows) //this will also include your header row...
{
DataRow tempRow = dt.NewRow();
int ko = row.Descendants<Cell>().Count();
for (int i = 0; i < row.Descendants<Cell>().Count(); i++)
{
tempRow[i] = GetCellValue(spreadSheetDocument, row.Descendants<Cell>().ElementAt(i));
}
dt.Rows.Add(tempRow);
}
如果您查看Excel工作表的Open XML标记,您会发现标记中甚至不存在空行。这意味着当您在foreach
循环中读取行时,将跳过那些空的,不存在的行。
如果要在中显示那些空行DataTable
,则必须读取每个现有行,并跟踪所看到的最后一个行号。如果当前行号和您看到的最后一个行号之间存在间隙,则需要填写该间隙,DataRow
在DataRow
为当前行添加新实例之前添加空实例。
若要了解如何确定行号,应查看示例工作表的Open XML标记。例如,以下标记显示了精简的示例工作表,其中仅包含sheetData
元素和许多row
子元素。您将看到每个row
元素(Row
类的实例)都有一个名为r
(类的属性)的属性,该RowIndex
属性Row
指定行索引。在此示例中,我们看到第2、3、5和8行,因此我们看到第4、6和7行丢失了。
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<sheetData>
<row r="2" spans="2:2" x14ac:dyDescent="0.25">
<c r="B2">
<v>2</v>
</c>
</row>
<row r="3" spans="2:2" x14ac:dyDescent="0.25">
<c r="B3">
<v>3</v>
</c>
</row>
<row r="5" spans="2:2" x14ac:dyDescent="0.25">
<c r="B5">
<v>5</v>
</c>
</row>
<row r="8" spans="2:2" x14ac:dyDescent="0.25">
<c r="B8">
<v>8</v>
</c>
</row>
</sheetData>
</worksheet>
@Thomas,当我们使用(SpreadsheetDocument spreadSheetDocument = SpreadsheetDocument.Open(file,false))调试=>的第一行时,它只返回29行。那我怎么检查行号。
@rajadurai,我更新了答案,显示了一些带有多行(
row
带有r
属性的元素)的示例标记,并指出了相关的强类型类(Row
带有RowIndex
属性)。是的,对我有用。谢谢@Thomas。基于前一行和当前行的值,如果缺少任何行,我会添加空行。
@rajadurai,听起来不错。然后,请接受此答案并投票。