簡體   English   中英

OpenXML SDK2.5(Excel):如何確定單元格是否包含數字值?

[英]OpenXML SDK2.5 (Excel): How to determine if a cell contains a numeric value?

我正在忙於開發一個從MS Excel(2016)文件導入數據的組件。 該組件使用MS OpenXML SDK2.5庫。 MS Excel的最終用戶安裝基於荷蘭的國家/地區設置。 該文件除其他外,包含帶有財務數據(數字)的列。 該列的位置事先未知。

為了確定一個單元格是否包含數字數據,我評估了Cell.DataType屬性(CellValues類型,它是一個枚舉)。 起初,似乎該屬性是確定此屬性的理想選擇。 CellValues的可能值為:布爾值,數字,錯誤,SharedString,String,InlineString或Date。 因此,我希望將Cell.DataType設置為CellValues.Number。 經過一些調試后,我發現當單元格包含數字數據時Cell.DataType為null。

在Internet上搜索以查找說明時,我發現了以下MSDN文章: https : //msdn.microsoft.com/en-us/library/office/hh298534.aspx

本文正是描述了我在調試過程中發現的內容:

單元格類型提供DataType屬性,該屬性指示單元格內數據的類型。 對於數字和日期類型,DataType屬性的值為null。

有人知道為什么不分別用CellValues.Number或CellValues.Date初始化Cell.DataType嗎?

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

有人知道為什么不分別用CellValues.Number或CellValues.Date初始化Cell.DataType嗎?

這里查看 ECMA-376標准, Cell的(縮寫)XSD如下所示:

<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-數字(默認)
s-共享字符串str-公式字符串

您可以看到"n"代表一個number

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

從上面看來,您可以檢查一個空的Cell.DataTypeCellValues.NumberCell.DataType來判斷一個單元格是否包含一個數字,但這不是那么簡單-最大的問題是日期。

似乎日期的原始存儲機制是使用數字並依靠樣式來確定數字是否實際上是數字或數字是否代表日期。

令人困惑的是,規范已更新為包括Date類型,但並非所有日期都將使用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中打開時如下圖所示:

生成的Excel文件

如果您需要區分日期和數字,則需要查找任何數字(null Cell.DataTypeCellValues.NumberCell.DataType ),然后檢查這些單元格的樣式以確保它們是數字,而不是偽裝成日期的日期數字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM