我正在开发一个应用程序,它使用带有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来解释&#34; s属性是指一种风格&#34;。但是,我仍然有兴趣以编程方式查找使用Open XML完全没有信息的行。
答案 0 :(得分:0)
您可以共享用于测试的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>