我正在学习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获取单元格值可能有不同的替代方法?
答案 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
我希望这对你有所帮助。