我正试图以这种方式从Excel单元格中获取价值:
SpreadsheetDocument spreadSheetDocument = SpreadsheetDocument.Open(filePath, true);
WorksheetPart worksheetPart = getWorksheetByName(spreadSheetDocument, DEFAULT_SHEET_NAME);
SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>();
Cell theCell1 = worksheetPart.Worksheet.Descendants<Cell>().FirstOrDefault(c => c.CellReference == "A5");
Cell theCell2 = worksheetPart.Worksheet.Descendants<Cell>().FirstOrDefault(c => c.CellReference == "A6");
Cell theCell3 = worksheetPart.Worksheet.Descendants<Cell>().FirstOrDefault(c => c.CellReference == "B5");
Cell theCell4 = worksheetPart.Worksheet.Descendants<Cell>().FirstOrDefault(c => c.CellReference == "B6");
然后我正在检查Cell1.CellValue.Text propetry并且我得到了一些奇怪的数据,如4,5,248等,这实际上远非真实数据。我可以使用Excel查看和编辑实际值。
有人猜到为什么会这样吗?
答案 0 :(得分:4)
每个Excel单元格(大部分)中的值都存储在一个名为SharedStringTable
的公共位置。此表的作用类似于一个数组,其中添加了每个唯一值,然后将其索引作为实际Excel单元格中的值。这意味着您要检索的4,5,248实际上是此表中的索引,指向该单元格的实际值。该表的目的是帮助减少存储的冗余数据量。例如,如果两个单元格包含相同的字符串,Excel只需要在SharedStringTable
中存储一次字符串,然后将相同的字符串引用为单元格的两倍。这将有助于减少文件的整体大小,因为您不需要在构成Excel文件的实际XML中存储尽可能多的文本。
例如,我将文本'test'添加到单元格A1和A2以及文本'unique'添加到单元格A3,这就是SharedStringTable
XML的样子:
<x:sst count="3" uniqueCount="2" xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<x:si>
<x:t>test</x:t>
</x:si>
<x:si>
<x:t>unique</x:t>
</x:si>
</x:sst>
注意测试只存储一次。这是单元格值:
<x:c r="A1" t="s">
<x:v>0</x:v>
</x:c>
<x:c r="B1" t="s">
<x:v>0</x:v>
</x:c>
<x:c r="C1" t="s">
<x:v>1</x:v>
</x:c>
注意A1和A2的值都是0,因为它们都指向SharedStringTable
中的相同文本。
索引访问SharedStringTable的简单代码片段为:
workbookPart.SharedStringTablePart.SharedStringTable.Elements<SharedStringItem>().ElementAt(index);