如何使用 DocumentFormat.OpenXml 始终跳过指定数量的行

How to always skip specified number of Rows using DocumentFormat.OpenXml

我使用 DocumentFormat.OpenXml 遍历行,有时我需要从第 4、8、11 行开始。我在下面用 "skipRows" 和 "If" 定义了应该跳过多少行让我跳过不必要的行:

var rows = sheet.Descendants<Row>();
foreach (Row row in rows)
{
    if (dataRowIndex < skipRows)
    {
         dataRowIndex++;
         continue;
    }

问题是,有时当行完全为空时,它不会自动遍历它。有时当它为空时,它会遍历它。当在所述行中写入任何单元格时,它总是迭代。这是为什么?我怎样才能确保它总是跳过例如 6 行,无论这些行中的单元格中是否有任何数据?

Sometimes when it's empty it iterates through it. It always iterates when there is any cell written in said row. Why is that?

这是由于 XML 架构的定义方式所致。一行在模式中是完全可选的;如果一行中没有数据,则不需要将其写入 XML (尽管也没有什么可以阻止它被写入)。如果一行中有一个单元格,则行 必须 写入 XML,因为单元格是行的子行;没有行就没有地方可以写单元格。

How can I ensure that it always skips for example 6 rows no matter if there is any data in cells in those rows?

您可以使用 RowRowIndex 属性 来找出正在读取的 Row 的实际索引。

以下示例应该可以满足您的需求:

using (SpreadsheetDocument document = SpreadsheetDocument.Open(filePath, false))
{
    WorkbookPart workbookPart = document.WorkbookPart;
    WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
    SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();

    SharedStringTablePart stringTable = workbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();

    var rows = sheetData.Descendants<Row>();

    foreach (Row row in rows)
    {
        if (row.RowIndex <= skipRows)
        {
            continue;
        }

        //this is just to show that it's outputting from the first non-skipped row
        Cell cell = row.GetFirstChild<Cell>();
        string contents;

        if (cell.DataType == CellValues.SharedString)
        {
            int index = int.Parse(cell.CellValue.InnerText);
            contents = stringTable.SharedStringTable.ElementAt(index).InnerText;
        }
        else
        {
            contents = cell.InnerText;
        }
        Console.WriteLine(contents);
    }
}