2012-10-31 48 views
0

我試圖讓這種方式從Excel單元格的值:讀取數據2.0

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"); 

然後我檢查theCell1.CellValue.Text propetry,我得到一些奇怪的數據,如45,248等,這實際上遠不是真實的數據。我可以使用Excel查看和編輯的實際值。

有人猜測爲什麼會這樣嗎?

回答

4

每個Excel單元格中的值(大部分)都存儲在一個名爲SharedStringTable的公共位置。這個表格的作用類似於一個數組,其中添加每個唯一值,然後將其索引作爲實際Excel單元格中的值。這意味着您正在檢索的4,5,248實際上是指向該表中指向該單元實際值的索引。該表的要點是幫助減少存儲的冗餘數據量。例如,如果兩個單元格包含相同的字符串,Excel只需要將該字符串存儲在SharedStringTable中一次,然後引用兩次相同的字符串作爲單元格的值。這將有助於減小文件的整體大小,因爲您不需要在組成Excel文件的實際XML中存儲儘可能多的文本。

例如,我添加了文本「測試」,以單元格A1和A2和文本「獨特的」細胞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);