OpenXML linq查询

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

我正在使用OpenXML打开一个电子表格,并在电子表格的行中循环。我有一个linq查询,它返回一行中的所有单元格。linq查询直接从MSDN上的演示中删除

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()
    集合,查看单元格引用是否有值
  • 使用第三方工具,例如或作为Excel数据的包装器,并查询其界面,这对开发人员更为友好
  • 使用ClosedXML:

    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。再次感谢!啊,这么多的努力浓缩成这么少的代码。谢谢