如何使用 Open XML 和 SAX 以编程方式检测空行?

Posted

技术标签:

【中文标题】如何使用 Open XML 和 SAX 以编程方式检测空行?【英文标题】:How to Detect Empty Rows Programmatically Using Open XML and SAX? 【发布时间】:2015-12-01 02:44:14 【问题描述】:

我正在开发一个应用程序,该应用程序使用带有 SAX 的 Open XML 解析 xlsx 文件中的工作表中的行。但是,我正在使用一个到处都有空行的电子表格来测试我的实现。我想跳过在循环浏览工作表中的行时可能找到的所有空行。

例如,我有以下电子表格

我使用 Open XML Productivity 工具打开了电子表格,发现带有空单元格的行在标记中只有一个单元格。该单元格有一个名为“s”的属性,其他具有单元格值的单元格似乎没有。

我想知道代码中是否有办法找出给定行是否为空。 到目前为止,我正在做的工作表中的行如下:

do
if (reader.ElementType == typeof(Row))

    reader.ReadFirstChild();
    Type generatedType = typeBuilder.CreateType();
    object generatedObject = Activator.CreateInstance(generatedType);

    PropertyInfo[] properties = generatedType.GetProperties();

    int propertiesCounter = 0;
    // Read all the cells in the row.

    do
    
        if (reader.ElementType == typeof(Cell))
        
            c = (Cell)reader.LoadCurrentElement();

            if (c.DataType != null
                && c.DataType.HasValue
                && c.DataType == CellValues.SharedString
                && int.Parse(c.CellValue.InnerText) < ssTable.ChildElements.Count)
            
                value = ssTable.ChildElements[int.Parse(c.CellValue.InnerText)].InnerText ?? string.Empty;
            
            else
            
                if (c.CellValue != null && c.CellValue.InnerText != null)
                
                    value = c.CellValue.InnerText;
                
                else
                
                    value = string.Empty;
                
            
            Debug.WriteLine(value);
            properties[propertiesCounter].SetValue(generatedObject, value, null);
            propertiesCounter++;
        
     while (reader.ReadNextSibling());
    listObjectsCustomClasses.Add(generatedObject);
 while (reader.Read() && reader.ElementType == typeof(Row));

非常感谢您的热心帮助!

编辑:我刚刚在 SO 中找到了这个 answer,它解释了“s 属性指的是一种样式”。但是,我仍然对使用 Open XML 以编程方式找出一行是否完全没有信息的方法感兴趣。

【问题讨论】:

如果一行是无效的(即没有数据、样式、公式等...),则没有理由将其包含在 XML 文件中。 【参考方案1】:

你能分享你用来测试的excel文件吗? 根据 openXML,如果任何一行为空,则相应的行标签将不可用。

根据以下数据,根本没有生成索引为 2 的行。所以你可以循环遍历行标签,如果它们的属性 r 与循环索引不匹配,那么该行是空的。

<row r="1" x14ac:dyDescent="0.35" spans="1:4">
<c r="A1" t="s">
<v>0</v>
</c>
<c r="B1" t="s">
<v>1</v>
</c>
<c r="C1" t="s">
<v>2</v>
</c>
<c r="D1" t="s">
<v>3</v>
</c>
</row>
<row r="3" x14ac:dyDescent="0.35" spans="1:4">
<c r="A3">
<v>1</v>
</c>
<c r="B3">
<v>2</v>
</c>
<c r="C3">
<v>3</v>
</c>
<c r="D3">
<v>4</v>
</c>
</row>

【讨论】:

以上是关于如何使用 Open XML 和 SAX 以编程方式检测空行?的主要内容,如果未能解决你的问题,请参考以下文章

XML- SAX解析

XML编程总结——使用SAX接口操作xml

JAVA之DOM和SAX解析器

Python读写xml

Python STL xml

XML编程总结——使用StAX接口操作xml