从 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>