Как всегда пропустить указанное количество строк, используя DocumentFormat.OpenXml - PullRequest
1 голос
/ 01 апреля 2019

Я перебираю строки, используя DocumentFormat.OpenXml, иногда мне нужно начинать с 4-й, 8-й, 11-й строки.Я определяю, сколько строк должно быть пропущено с помощью «skipRows» и «If» ниже, давайте пропустим ненужные строки:

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

Проблема в том, что иногда, когда строка полностью пуста, она автоматически не перебирает ее,Иногда, когда он пуст, он перебирает его.Он всегда повторяется, когда в указанной строке записана какая-либо ячейка.Это почему?Как я могу гарантировать, что он всегда пропускает, например, 6 строк, независимо от того, есть ли какие-либо данные в ячейках в этих строках?

1 Ответ

1 голос
/ 05 апреля 2019

Иногда, когда он пуст, он перебирает его.Он всегда повторяется, когда в указанной строке записана какая-либо ячейка.Почему это так?

Это связано с тем, как определяется схема XML.Строка не является обязательной в схемеесли в строке нет данных, то нет необходимости записывать их в XML (хотя ничто не мешает их записи).Если в строке есть ячейка, то строка должна быть записана в XML, так как ячейка является дочерним элементом строки;без строки было бы некуда написать ячейку.

Как я могу гарантировать, что она всегда пропускает, например, 6 строк, независимо от того, есть ли данные в ячейках в этих строках?

Вы можете использовать свойство RowIndex Row, чтобы узнать фактический индекс читаемого 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);
    }
}
...