如何使用 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 以编程方式检测空行?的主要内容,如果未能解决你的问题,请参考以下文章