2012-07-09 6 views
5

Ho un addin VSTO e sto leggendo i dati da un foglio di lavoro Excel.E 'possibile ottenere un int da Range.Value in VSTO?

Sembra che quasi tutti i dati numerici vengano letti come double. È mai possibile ottenere un valore int da Range.Value?

Ecco un codice per dimostrare cosa intendo.

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; 

Indipendentemente dal formato che uso nel foglio di lavoro Foglio1, cella A1, isInt torna sempre falso.

C'è qualche formato che dovrei usare per ottenere int? Ho pensato che forse General o 0 avrebbe funzionato, ma non sembra.

+1

Non credo che ci si mai arrivare un int - Excel non memorizza mai i numeri come int internamente, sempre un doppio. – Govert

+0

@Govert Ok, questo è quello che sospettavo ma volevo una conferma. Se pubblichi una risposta (preferibilmente con una fonte su quel bocconcino di Excel), accetterò. –

risposta

0

Da docs quando si chiama var value = ((Range)w.Cells[1,1]).Value il tipo Value deriva dal tipo di valore dal foglio di lavoro. Quindi sembrerebbe che il tuo foglio di lavoro Excel abbia i valori formattati come doubles, non int s. Non esiste una formattazione "integer" per Excel che si traduca in C#, la scelta migliore sarebbe quella di trasmettere il valore come integer quando lo si legge. Il tipo Value è disponibile in qualsiasi formato all'interno del foglio di lavoro di Excel.

This article mostra come Excel gestisce i valori in virgola mobile a precisione doppia.

+0

Giusto, ma la mia domanda è essenzialmente "quale formato del foglio di lavoro mi darà' int'? " Generale, Numero senza decimali, Testo, Contabilità tutti mi danno il doppio. Mi manca qualcosa o non esiste un formato simile? –

+1

Ah, facendo una piccola ricerca mostra che sembra che i numeri siano sempre memorizzati come doppi in Excel. È possibile creare un formato personalizzato che _looks_ come un int nel foglio di lavoro, ma quando si interrogano i valori da C# verranno restituiti come doppi. Se lo fai, puoi garantire che i valori (come i doppi) saranno ** veramente ** interi, quindi puoi semplicemente trasmettere come int. – NominSim

+0

Capito. Puoi fornire la fonte che solo i doppi vengono archiviati in Excel? –

2

valori numerici restituiti da Range.Value sono doppie (possibilmente becuase sono tutti memorizzati come doppie in Excel, un numero cercando come un numero intero o non è il risultato di formattazione)

Gli unici interi che ho visto provenienti da GetValue sono gli ErrorCodes per errori

ad es.

  • DIV/0! è un Int32 con un valore di -2146826281
1

Govert è corretto nel dire che Excel non memorizza mai numeri come numeri interi.

Excel memorizza valori numerici come Double Precision Floating Point numeri, o come si conosce Doubles in breve.

Doubles sono variabili a 8 byte in grado di memorizzare numeri esatti a circa 15 posizioni decimali.

EDIT:

Dal momento che siete alla ricerca di un link, vedere questo

Link: http://support.microsoft.com/kb/78113

1

Sono abbastanza sicuro che tutti i numeri sono doppie in Excel. Ad esempio il seguente codice VBA imposta un valore di cella su un intero lungo (Int32), quindi lo legge di nuovo.

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) 
  • ingresso è VarType (n) = 3 = vbLong (Int32)
  • uscita è VarType (v) = 5 = vbDouble