【问题标题】:Empty rows are getting skipped while getting data from Excel to DataTable将数据从 Excel 获取到 DataTable 时会跳过空行
【发布时间】:2020-05-17 02:33:29
【问题描述】:

任务

从excel导入数据到DataTable

问题

一些不包含任何数据的行将被跳过,并且该行中包含数据的下一个行被用作空行的值

在 Excel 中,当我使用 openxml 转换 excel 时,总共有 37 行 到 Datatable 它跳过空行并仅读取 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);
}

【问题讨论】:

  • 可能和这个问题一样的问题:stackoverflow.com/questions/3837981/…
  • 空单元格对我来说不是问题。它来得很完美。当我有一个空行时,它会跳过行。在 Excel 中总共有 37 行它只读取了 29 行。
  • 下面我的回答对您解决问题有帮助吗?还是您需要更多输入来解决它?

标签: c# excel datatable openxml worksheet


【解决方案1】:

如果您查看 Excel 工作表的 Open XML 标记,您会发现标记中甚至不存在空行。这意味着当您在 foreach 循环中读取行时,您将跳过那些空的、不存在的行。

如果您想要 DataTable 中的那些空行,则必须读取每个现有行,并跟踪您看到的最后一行编号。如果当前行号与您看到的最后一个行号之间存在差距,则需要在为当前行添加新的DataRow 之前添加空的DataRow 实例。

2020-02-03 更新

要了解如何确定行号,您应该查看示例工作表的 Open XML 标记。例如,以下标记显示了一个简化的示例工作表,其中仅包含 sheetData 元素和许多 row 子元素。您将看到每个row 元素(Row 类的实例)都有一个名为r 的属性(Row 类的RowIndex 属性),它指定行索引。在此示例中,我们看到第 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 和 @987654336 @ 属性)。
  • 是的,它对我有用。谢谢@Thomas。如果缺少任何行,我会根据先前和当前行值添加空行。
  • @rajadurai,听起来不错。那么请接受这个答案并投票。
猜你喜欢
  • 2016-07-06
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
  • 2021-10-10
相关资源
最近更新 更多