使用OpenXML SDK 2.0从Excel单元格中读取数据

时间:2012-10-31 15:10:16

标签: c# excel openxml-sdk

我正试图以这种方式从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查看和编辑实际值。

有人猜到为什么会这样吗?

1 个答案:

答案 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);