【问题标题】:Is there a SAX way to loop through OpenXML rows?是否有一种 SAX 方式来循环 OpenXML 行?
【发布时间】:2011-09-29 04:44:55
【问题描述】:

我正在使用以下提供的 SAX 方法解析一个大文件: Parsing and Reading Large Excel Files with the 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
        }
    }
}

问题在于,这会循环遍历每个项目/单元格/列/whatnot,并且仅在元素类型为 Row 时才起作用。

是否有一种 SAX 方式只循环遍历行而不是工作表中的每个项目?

谢谢,

【问题讨论】:

    标签: c# excel openxml sax openxml-sdk


    【解决方案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.
         }
    }
    

    【讨论】:

    • 如何按顺序获取行中的每个单元格值。基本上我想使用 openxmlreader 读取并使用 openxmlwriter 写入。
    猜你喜欢
    • 2012-02-15
    • 2020-03-25
    • 2021-03-22
    • 2022-01-21
    • 2016-02-02
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    相关资源
    最近更新 更多