2012-07-09 8 views
5

Tengo un complemento VSTO y estoy leyendo datos de una hoja de cálculo de Excel.¿Es posible obtener un int de Range.Value en VSTO?

Parece que casi todos los datos numéricos se leen como double. ¿Es posible obtener un valor de int desde Range.Value?

Aquí hay algunos códigos para demostrar lo que quiero decir.

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; 

No importa el formato de hoja de cálculo que utilizo en la Hoja1, celda A1, isInt siempre vuelve falsa.

¿Hay algún formato que debería usar para obtener int? Pensé que quizás General o 0 funcionarían, pero parece que no.

+1

No creo que alguna vez se obtendría un int - Excel nunca almacena números como un int internamente, siempre un doble. – Govert

+0

@Govert Bien, eso es lo que sospechaba pero quería confirmación. Si publica una respuesta (preferiblemente con una fuente sobre ese tidbit de Excel) lo aceptaré. –

Respuesta

0

Desde el docs cuando llama al var value = ((Range)w.Cells[1,1]).Value, el tipo Value se deriva del tipo de valor de la Hoja de trabajo. Por lo tanto, parece que su hoja de cálculo de Excel tiene los valores formateados como doubles, no int s. No hay un formato "entero" para Excel que se traduzca en C#, la mejor opción sería emitir el valor como integer al leerlo. El tipo Value viene en cualquier formato que estuviera dentro de la hoja de cálculo de Excel.

This article muestra cómo Excel trata los valores de punto flotante de doble precisión.

+0

Correcto, pero mi pregunta es esencialmente: "¿Qué formato de hoja de trabajo me dará' int'? " General, Número sin decimales, Texto, Contabilidad, todos me dan dobles. ¿Me estoy perdiendo algo o no hay tal formato? –

+1

Ah, haciendo un poco de investigación muestra que parece que los números siempre se almacenan como dobles en Excel. Puede hacer un formato personalizado que _parezca_ como un int en la hoja de trabajo, pero cuando consulte los valores desde C# se devolverán como dobles. Si haces esto, aunque puedes garantizar que los valores (como dobles) serán ** realmente ** enteros, entonces puedes simplemente lanzar como int. – NominSim

+0

Entendido. ¿Puedes proporcionar la fuente sobre solo los dobles almacenados en Excel? –

2

Los valores numéricos devueltos por Range.Value son dobles (posiblemente becuase que se almacenan como dobles en Excel, un número buscando como un entero o no es el resultado de formato)

Los únicos enteros que he visto entrando en GetValue son los ErrorCodes para los errores

por ejemplo

  • DIV/0! es un Int32 con un valor de -2146826281
1

Govert está en lo cierto al decir que Excel nunca almacena números como números enteros.

Excel almacena valores numéricos como números Double Precision Floating Point, o como usted sabe Doubles para abreviar.

Doubles son variables de 8 bytes que pueden almacenar números con una precisión de aproximadamente 15 decimales.

EDITAR:

Desde que busca un enlace, ver este

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

1

Estoy bastante seguro de todos los números son dobles en Excel. Por ejemplo, el siguiente código de VBA establece un valor de celda para un entero largo (Int32) y luego lo lee de nuevo.

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) 
  • entrada es VarType (n) = 3 = vbLong (Int32)
  • salida es VarType (v) = 5 = vbDouble
Cuestiones relacionadas