2015-08-31 29 views
0

我將下面的一段代碼用作較大項目的一部分 - 該程序基本上基於從下拉框中選擇的工作表讀取電子表格 - 然後將結果分配給數據表 - 我有一個用於運行下面的函數來獲取單元格的內容並把它添加到DataTableOpenXML是否可以返回公式的結果

public string GetValue(Cell cell, SharedStringTablePart stringTablePart) 
    { 

     if (cell.ChildElements.Count == 0) return null; 

     //get cell value 

     string value = cell.ElementAt(0).InnerText;//CellValue.InnerText; 


     //Look up real value from shared string table 

     if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString)) 

      value = stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText; 

     return value; 

    } 

在我使用但是這會返回一個公式,而不是結果的電子表格循環。電子表格公式爲= Sheet1!A12,基本上,無論用戶輸入到Sheet1中,A12都應顯示在單元格中。現在電子表格中已經填入了信息,但程序不會僅僅根據公式得出結果。

一個例子是:表1 A12包含單詞「狗」,這意味着在Sheet2中單元格A4具有公式= Sheet1A12並應顯示「狗」(它在Excel中執行,但不在程序中)。

考慮到OpenXML已經存在,OpenXML是否能夠顯示結果?

回答

0

OpenXml只是保存SpreadSheet內容的格式。要獲得單元格的結果,您需要SpreadSheet引擎(即excel)

0

對不起但沒有。 OpenXML SDK只是一組用於在低級別操作Word,Excel和PowerPoint文件的類。公式以純文本形式存儲,您需要爲此實現公式評估程序。如果您想參與這項工作,請參見Interpreter design pattern

還可以使用SDK提供的屬性來訪問單元格數據(CellValue,CellFormula)。還要注意,Excel並不總是填充DataType(只有當它不能被正確地推斷得更精確時,例如:共享字符串,而不是讀取值作爲填充數據類型的數字來表明該數字實際上是索引在共享字符串表中,就像你的代碼片段所示)。

我沒有使用ClosedXML但我聽說這是值得一試。

1

我不完全同意給出的兩個答案。 我已經做了一個快速測試,在新工作簿的sheet1中添加了一些值和總和公式,保存爲xmlx,解壓縮並查看/xl/worksheets/sheet1.xml。

<row r="14" spans="1:1" x14ac:dyDescent="0.25"> 
    <c r="A14"> 
     <f>SUM(A1:A13)</f> 
     <v>1295</v> 
    </c> 
</row> 

正如您所看到的,公式及其計算值都是可見的。然後,我做了一個精確的搜索,發現這個:OpenXML SDK: Make Excel recalculate formula

總之:應該絕對可以訪問公式值,甚至可以重新計算,如果需要的話。

+0

如果用戶選擇了「計算選項」>「手動」,是否存儲在文件中的值? – bouvierr

+0

@bouvierr我剛剛再次嘗試手動計算並將其存儲。我可以想象,情況並非總是如此,但是可以使用鏈接的SO帖子中的方法強制進行計算。 – LocEngineer

+0

怎麼樣的文字值 - 我相信它的SharedStringTable,弄亂了這一點? –

相關問題