OpenXML linq查询
我正在使用OpenXML打开一个电子表格,并在电子表格的行中循环。我有一个linq查询,它返回一行中的所有单元格。linq查询直接从MSDN上的演示中删除OpenXML linq查询,linq,openxml,openxml-sdk,closedxml,Linq,Openxml,Openxml Sdk,Closedxml,我正在使用OpenXML打开一个电子表格,并在电子表格的行中循环。我有一个linq查询,它返回一行中的所有单元格。linq查询直接从MSDN上的演示中删除 IEnumerable<String> textValues = from cell in row.Descendants<Cell>() where cell.CellValue != null select (cell.DataType != null &&a
IEnumerable<String> textValues =
from cell in row.Descendants<Cell>()
where cell.CellValue != null
select (cell.DataType != null
&& cell.DataType.HasValue
&& cell.DataType == CellValues.SharedString
? sharedString.ChildElements[int.Parse(cell.CellValue.InnerText)].InnerText
: cell.CellValue.InnerText);
IEnumerable textValues=
来自行中的单元格。子体()
其中cell.CellValue!=无效的
选择(cell.DataType!=null
&&cell.DataType.HasValue
&&cell.DataType==CellValues.SharedString
?sharedString.ChildElements[int.Parse(cell.CellValue.InnerText)].InnerText
:cell.CellValue.InnerText);
linq查询在返回所有有值的单元格方面非常出色,但它不会返回没有值的单元格。这反过来又使我们无法分辨哪个细胞是哪个细胞。让我再解释一下。例如,我们的电子表格中有三列:名称、SSN和地址。这个linq查询的工作方式是,它只返回那些对给定行具有值的单元格。因此,如果有一行数据包含“John”、“173 Sycamore”,那么linq查询在枚举中只返回“John”和“173 Sycamore”,这反过来使我无法知道“173 Sycamore”是SSN还是地址字段
让我在此重申:我需要的是返回所有单元格,而不仅仅是包含值的单元格
我试图用我能想到的任何方法来蒙骗linq查询,但我一点运气都没有(即删除where子句不是诀窍)。任何帮助都将不胜感激。谢谢 OpenXML标准没有为没有数据的单元格定义占位符。换句话说,它在XML中的底层存储是稀疏的。您可以通过以下两种方式之一解决此问题:
行.subjects()
集合,查看单元格引用是否有值var wb = new XLWorkbook("YourWorkbook.xlsx");
var ws = wb.Worksheet("YourWorksheetName");
var range = ws.RangeUsed();
foreach(var row in range.Rows())
{
// Do something with the row...
// ...
foreach(var cell in row.Cells())
{
// Now do something with every cell in the row
// ...
}
}
我推荐的一种方法是用空白数据填充所有空单元格,这样它们将由linq语句返回。有关如何做到这一点,请参见本节。我使用ClosedXML导出Excel电子表格,但我认为它根本无法导入。是吗?今天早些时候,我甚至很快地浏览了他们的网站,但没有看到(尽管这是一个非常快速的浏览)。不过我会看一看ePlus。但实际上,每次我尝试使用OpenXML做任何事情时,我都会惊讶于看似简单的事情最终却变成了不简单的事情!如果导入意味着读写数据的能力,那么OpenXML和EPPlus都可以做到这一点。我同意直接使用OpenXML做任何事情都是一件非常痛苦的事情,但是使用上面提到的工具和作为SDK一部分的Document Explorer,它比我们过去必须处理的旧COM互操作要好得多!ClosedXML工作得很好。我希望我从一开始就使用它,而不是胡乱使用OpenXML。再次感谢!啊,这么多的努力浓缩成这么少的代码。谢谢