2017-02-22 99 views
1

我正忙於開發一個從MS Excel(2016)文件導入數據的組件。 該組件使用MS OpenXML SDK2.5庫。 MS Excel的最終用戶安裝基於荷蘭國家/地區設置。 該文件包含一個包含財務數據(數字)的列。這一欄的位置並不是事先知道的。OpenXML SDK2.5(Excel):如何確定單元格是否包含數值?

若要確定一個單元格是否包含數值數據我評估屬性Cell.DataType(類型CellValues,這是一個枚舉)。 起初,這個屬性似乎是確定這個問題的最佳人選。 CellValues的可能值爲: 布爾值,數字,錯誤,SharedString,String,InlineString或Date。所以我期望Cell.DataType設置爲CellValues.Number。 經過一些調試後,我發現當單元格包含數值數據時,Cell.DataType爲null。

在尋找互聯網上找到一個解釋,我發現下面的MSDN文章: https://msdn.microsoft.com/en-us/library/office/hh298534.aspx

本文介紹的正是我在調試過程中發現:

的細胞類型提供了一個數據類型屬性,指示單元格內數據的類型。數字和日期類型的DataType屬性的值爲空。

有沒有人知道爲什麼Cell.DataType沒有分別用CellValues.Number或CellValues.Date初始化?

確定單元格是否包含數值的最佳方法是什麼?

回答

3

有沒有人知道爲什麼Cell.DataType未分別使用CellValues.Number或CellValues.Date進行初始化?

望着從here的ECMA-376標準中,(略)XSD的Cell看起來是這樣的:

<xsd:complexType name="CT_Cell"> 
    ... 
    <xsd:attribute name="t" type="ST_CellType" use="optional" default="n"/> 
    ... 
</xsd:complexType> 

該屬性代表類型。請注意,它是可選的,默認值爲"n"。部18.18.11 ST_CellType(細胞型)列出了類型它們是有效的值:

b - 布爾
d - 日期
ë - 錯誤
inlineStr - 一個內聯串
N - 數(默認值)
秒 - 一個共享字符串 str - 一個公式字符串

可以看到,"n"代表number

確定單元格是否包含數值的最佳方法是什麼?

這似乎從上面的,你可以檢查空Cell.DataTypeCellValues.Number一個Cell.DataType說,如果一個單元格包含數字,但它不是想象中的那麼簡單 - 最大的問題是日期。

看起來,日期的原始存儲機制是使用一個數字,並依賴風格來知道數字是否實際上是一個數字,或者如果數字表示日期。

令人困惑的是,規範已更新,包括Date類型,但並非所有日期都將使用日期類型Date類型表示單元格包含ISO 8601格式的日期,但它對於將日期存儲爲具有正確樣式的數字是完全有效的。例如下面的XML片段展示了在這兩個NumberDate格式同日(2017年2月1日):

<sheetData> 
    <row r="1" spans="1:1" x14ac:dyDescent="0.25"> 
     <c r="A1" s="1"> 
      <v>42767</v> 
     </c> 
    </row> 
    <row r="2" spans="1:1" x14ac:dyDescent="0.25"> 
     <c r="A2" s="1" t="d"> 
      <v>2017-02-01</v> 
     </c> 
    </row> 
</sheetData> 

在Excel中打開時,它看起來像這樣:

The resulting Excel file

如果您需要要區分日期和數字,那麼你需要找到任何數字(空Cell.DataTypeCell.DataType,Cell.DataType,CellValues.Number),然後檢查這些單元格的樣式,以確保它們是數字而不是數字僞裝成數字。

相關問題