0

私はこの方法で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プロパティをチェックしていますが、実際のデータとはかけ離れた4,5,248などの奇妙なデータを取得しています。Excelを使用して表示および編集できる実際の値。

なぜそうなるのか、誰か推測できますか?

4

1 に答える 1

4

各Excelセルの値(ほとんどの場合)は、と呼ばれる共通の場所に格納されSharedStringTableます。このテーブルは、それぞれの一意の値が追加され、そのインデックスが実際のExcelセルの値として配置される配列のように機能します。つまり、取得している4、5、248は、実際にはそのセルの実際の値を指すこのテーブルへのインデックスです。この表のポイントは、保存される冗長データの量を減らすのに役立つことです。たとえば、2つのセルに同じ文字列が含まれている場合、Excelは文字列をに1回格納してSharedStringTableから、セルの値として同じ文字列を2回参照するだけで済みます。これは、Excelファイルを構成する実際のXMLに多くのテキストを格納する必要がないため、ファイルの全体的なサイズを縮小するのに役立ちます。

たとえば、セルA1とA2にテキスト「test」を追加し、セルA3にテキスト「unique」を追加しました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>

テストが1回だけ保存されることに注意してください。セルの値は次のとおりです。

<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);
于 2012-11-01T10:36:16.940 に答える