从 Excel 获取数据到 DataTable 时跳过空行
Empty rows are getting skipped while getting data from Excel to DataTable
任务
将数据从 excel 导入 DataTable
问题
一些不包含任何数据的行将被跳过,并且下一行中包含数据的行将用作空行的值
In Excel Totally in have 37 Rows when i use openxml to convert excel
to Datatable it skipped empty rows and read 29 rows only
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 工作表的打开 XML 标记,您会发现标记中甚至不存在空行。这意味着当您在 foreach
循环中读取行时,您将跳过那些空的、不存在的行。
如果您想要 DataTable
中的那些空行,您将必须读取每个现有行,并跟踪您看到的最后一个行号。如果当前行号和您看到的最后一个行号之间有空隙,您需要填补空隙,在为当前行添加新的 DataRow
之前添加空的 DataRow
实例。
更新 2020-02-03
要了解如何确定行号,您应该查看示例工作表的打开 XML 标记。例如,以下标记显示了一个精简和简化的示例工作表,其中仅包含 sheetData
元素和多个 row
子元素。您会看到每个 row
元素(Row
class 的实例)都有一个名为 r
的属性(RowIndex
属性 of Row
class),指定行索引。在此示例中,我们看到第 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>
任务
将数据从 excel 导入 DataTable
问题
一些不包含任何数据的行将被跳过,并且下一行中包含数据的行将用作空行的值
In Excel Totally in have 37 Rows when i use openxml to convert excel to Datatable it skipped empty rows and read 29 rows only
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 工作表的打开 XML 标记,您会发现标记中甚至不存在空行。这意味着当您在 foreach
循环中读取行时,您将跳过那些空的、不存在的行。
如果您想要 DataTable
中的那些空行,您将必须读取每个现有行,并跟踪您看到的最后一个行号。如果当前行号和您看到的最后一个行号之间有空隙,您需要填补空隙,在为当前行添加新的 DataRow
之前添加空的 DataRow
实例。
更新 2020-02-03
要了解如何确定行号,您应该查看示例工作表的打开 XML 标记。例如,以下标记显示了一个精简和简化的示例工作表,其中仅包含 sheetData
元素和多个 row
子元素。您会看到每个 row
元素(Row
class 的实例)都有一个名为 r
的属性(RowIndex
属性 of Row
class),指定行索引。在此示例中,我们看到第 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>