OpenXML的Cell.InnerText返回无意义的结果

时间:2012-11-15 10:57:38

标签: c# openxml

我正在学习OpenXML并遇到一个我无法解释的奇怪问题,也许论坛上有人可以解释并提供解决方案。

我一直在测试一些代码来收集单个Excel单元格中的信息,使用一些看起来像这样的代码:

Cell theCell = wsPart.Worksheet.Descendants<Cell>().
            Where(c => c.CellReference == "F4").FirstOrDefault();
            if (theCell != null)
            {
                cellvalue = theCell.InnerText;
                ....

我可以安全地假设我已经拨打了所有workbook部分和sheets等。

当我调用此例程,并且最近没有打开 Excel 时,我可以调用Cell.InnerText并返回我期望的值。

但是,如果我使用 Excel 打开电子表格,请进行更改,然后关闭电子表格,调用Cell.InnerText会返回一些奇怪的内容,例如“29” “或”33“。

有谁知道为什么?或者在OpenXML中从Excel获取单元格值可能有不同的替代方法?

2 个答案:

答案 0 :(得分:0)

&#34;或者在OpenXML中从Excel获取单元格值可能有不同的选择?&#34; 是的。单元格具有值标记:<v>。此标记包含整数。如果单元格包含整数,则此标记包含此值。但是如果您的单元格包含字符串,则此标记包含来自xl \ sharedStrings.xml部分的字符串索引,原始单元格值存储,因此该值包含与您的单元格值不同的值。 我猜想当你使用Excel重新保存电子表格时,它会重构你的文档,只要在xl \ sharedStrings.xml部分中字符串被更改了索引,就可以更改值。

答案 1 :(得分:0)

我想在你进行更改后,你在Cell中输入了CellValues.SharedString(theCell.DataType)。该类型返回SharedStringTable的索引。要读取SharedStringTable,请使用该代码:

Dim stringTablePart As SharedStringTablePart = WorkbookPart.GetPartsOfType(Of SharedStringTablePart).FirstOrDefault()
If stringTablePart IsNot Nothing Then
    For Each item As SharedStringItem In stringTablePart.SharedStringTable.Elements(Of SharedStringItem)()
        Dim text as string = item.InnerText
    Next
End If

我希望这对你有所帮助。