2012-07-09 89 views
5

我有一個VSTO插件,我正在從Excel工作表讀取數據。是否有可能從VSTO中的Range.Value獲取int?

似乎幾乎所有的數字數據都被讀爲double。是否有可能從Range.Value獲得int值?

下面是一些代碼來演示我的意思。

Worksheet w = (Worksheet)Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets["Sheet1"]; 
var value = ((Range)w.Cells[1, 1]).Value; 
bool isInt = value is int; 
bool isDouble = value is double; 

無論我在工作表Sheet1工作表,單元格A1使用哪種格式,isInt總是回來假。

是否有一些格式我應該用來獲得int?我想也許General0會工作,但它似乎沒有。

+1

我不認爲你會永遠得到一個int - Excel在內部永遠不會將數字存儲爲一個int,總是一個double。 – Govert 2012-07-09 15:12:51

+0

@Govert好的,這是我懷疑的,但我想要確認。如果你發佈了一個答案(最好用一個關於該Excel的消息來源),我會接受它。 – 2012-07-09 15:16:21

回答

0

docs當您致電var value = ((Range)w.Cells[1,1]).ValueValue類型是從工作表的值類型派生的。所以看起來您的Excel工作表的值格式爲doubles,而不是int s。 Excel中沒有「整數」格式將轉換爲C#,最好的辦法是在讀取時將值作爲integer進行轉換。Value類型以Excel工作表中的任何格式顯示。

This article顯示Excel如何處理雙精度浮點值。通過Range.Value返回

+0

沒錯,但我的問題實質上是,「工作表格式會給我什麼'int'?」一般,沒有小數的數字,文本,會計都給了我雙打。我錯過了什麼或者沒有這種格式? – 2012-07-09 15:10:03

+1

啊,做一個小小的研究表明,它看起來像數字總是存儲爲Excel中的雙打。您可以在工作表中使用_looks_類似於int的自定義格式,但是當您從C#查詢值時,它們將作爲雙精度返回。如果你這樣做,儘管你可以保證值(作爲雙精度)**真的是整數,那麼你可以把它們當作整型。 – NominSim 2012-07-09 15:17:40

+0

明白了。你可以只提供有關儲存在Excel中的雙打的信息嗎? – 2012-07-09 15:21:17

2

數值是雙打(可能監守它們都存儲在Excel中加倍,一些看起來像一個整數或不是格式化的結果)

,我已經看到的唯一整數來自GetValue的錯誤代碼爲錯誤

例如

  • DIV/0!是值爲-2146826281的Int32
1

Govert正確地表示Excel從不將數字存儲爲整數。

Excel將數字值存儲爲Double Precision Floating Point數字,或者簡稱爲Doubles

Doubles是8字節的變量,可以將數字精確保存到大約15個小數位。

編輯

既然你正在尋找一個鏈接,請參閱本

鏈接:http://support.microsoft.com/kb/78113

1

我敢肯定,所有的數字都在Excel雙打。例如,以下VBA代碼將單元格值設置爲長整數(Int32),然後將其讀回。

Dim n As Long 
n = 123 
Range("A1").Value = n 
Debug.Print VarType(n) 

Dim v As Variant 
v = Range("A1").Value 
Debug.Print VarType(v) 
  • 輸入是VarType函數(N)= 3 = vbLong(Int32)已
  • 輸出是VarType函數(V)= 5 = vbDouble
相關問題