Есть ли способ SAX перебирать строки OpenXML?

Я анализирую большой файл, используя подход SAX, предлагаемый на: Анализ и чтение больших файлов Excel с помощью Open XML SDK

Это моя модифицированная версия (для простоты я получаю только номер строки)

using (SpreadsheetDocument myDoc = SpreadsheetDocument.Open("BigFile.xlsx", true))
{
    WorkbookPart workbookPart = myDoc.WorkbookPart;
    WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();

    OpenXmlReader reader = OpenXmlReader.Create(worksheetPart);
    String rowNum;
    while (reader.Read())
    {
        if (reader.ElementType == typeof(Row))
        {
            if (reader.HasAttributes)
                rowNum = reader.Attributes.First(a => a.LocalName == "r").Value
        }
    }
}

Проблема в том, что это перебирает каждый элемент/ячейку/столбец/что-то еще и действует только тогда, когда тип элемента - Row.

Есть ли способ SAX перебирать только строки, а не каждый элемент на листе?

Спасибо,


person Manuel    schedule 05.07.2011    source источник


Ответы (1)


Ключ в том, чтобы использовать методы Skip() и ReadNextSibling() читателя...

 using (SpreadsheetDocument myDoc = SpreadsheetDocument.Open("BigFile.xlsx", true))
 {
     WorkbookPart workbookPart = myDoc.WorkbookPart;
     WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
     OpenXmlReader reader = OpenXmlReader.Create(worksheetPart);
     String rowNum;
     while (reader.Read())
     {
         if (reader.ElementType == typeof(Row))
         {
             do
             {
                 if (reader.HasAttributes)
                     rowNum = reader.Attributes.First(a => a.LocalName == "r").Value;

             } while (reader.ReadNextSibling()); // Skip to the next row
             break; // We just looped through all the rows so no need to continue reading the worksheet
         }

         if (reader.ElementType != typeof(Worksheet)) // Dont' want to skip the contents of the worksheet
             reader.Skip(); // Skip contents of any node before finding the first row.
     }
}
person Manuel    schedule 07.07.2011
comment
как получить каждое значение ячейки в строках по порядку. В основном я хочу читать с помощью openxmlreader и писать с помощью openxmlwriter. - person Ramya; 10.03.2018