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

时间:2015-09-04 21:02:50

标签: c# openxml sax import-from-excel

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

例如,我有以下电子表格

Excel Spreadsheet with Empty Row

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

我想知道代码中是否有办法找出给定的行是否为空。 到目前为止,我要通过工作表中的行进行以下操作:

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来解释&#34; s属性是指一种风格&#34;。但是,我仍然有兴趣以编程方式查找使用Open XML完全没有信息的行。

1 个答案:

答案 0 :(得分:0)

您可以共享用于测试的excel文件吗? 根据openXML,如果任何行为空,则相应的行标记将不可用。

根据以下数据,根本不会生成索引为2的行。因此,您可以遍历行标记,如果它们的属性r与循环索引不匹配,则该行为空。

enter image description here

<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>