C# 如何使用开放XML和SAX以编程方式检测空行?
我正在开发一个应用程序,它使用带SAX的开放XML解析xlsx文件中工作表中的行。然而,我用一个到处都是空行的电子表格测试我的实现。我想跳过所有空行,我可能会发现,而我是通过一个表中的行循环 例如,我有以下电子表格 我使用OpenXMLProductivity工具打开了电子表格,发现满是空单元格的行在标记中只有一个单元格。该单元格具有一个名为“s”的属性,而具有单元格值的其他单元格似乎没有该属性 我想知道在代码中是否有一种方法可以确定给定的行是否为空。 到目前为止,我对工作表中的行所做的操作如下:C# 如何使用开放XML和SAX以编程方式检测空行?,c#,openxml,sax,import-from-excel,C#,Openxml,Sax,Import From Excel,我正在开发一个应用程序,它使用带SAX的开放XML解析xlsx文件中工作表中的行。然而,我用一个到处都是空行的电子表格测试我的实现。我想跳过所有空行,我可能会发现,而我是通过一个表中的行循环 例如,我有以下电子表格 我使用OpenXMLProductivity工具打开了电子表格,发现满是空单元格的行在标记中只有一个单元格。该单元格具有一个名为“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));
do{
if(reader.ElementType==typeof(行))
{
reader.ReadFirstChild();
类型generatedType=typeBuilder.CreateType();
object generatedObject=Activator.CreateInstance(generatedType);
PropertyInfo[]properties=generatedType.GetProperties();
int propertiesCounter=0;
//读取行中的所有单元格。
做
{
if(reader.ElementType==typeof(单元格))
{
c=(单元格)reader.LoadCurrentElement();
如果(c.DataType!=null
&&c.DataType.HasValue
&&c.DataType==CellValues.SharedString
&&int.Parse(c.CellValue.InnerText)
非常感谢你的帮助
EDIT:我刚刚在中找到了这个,这就解释了“s属性指的是一种样式”。但是,我仍然对一种方法感兴趣,它可以通过编程的方式使用Open XML来确定一行是否完全没有信息。您可以共享用于测试的excel文件吗? 根据openXML,如果任何行为空,则相应的行标记将不可用 根据以下数据,根本不生成索引为2的行。因此,可以循环遍历行标记,如果它们的属性r与循环索引不匹配,则该行为空
0
1.
2.
3.
1.
2.
3.
4.
如果一行无效(即没有数据、样式、公式等),则没有理由将其包含在XML文件中。