Excel.Office.INTEROP está volviendo el doble incluso cuando es un entero

StackOverflow https://stackoverflow.com/questions/20353790

  •  25-08-2022
  •  | 
  •  

Pregunta

Lo siguiente obtiene objetos de una hoja de cálculo de Excel que se pueden lanzar a string o castible con double. El problema es que incluso si sé que el objeto es visiblemente un entero, formateado como "general" dentro de la hoja de cálculo, Excel.Office.Enterop siempre devuelve un double. Si bien sería fácil convertir el doble al más cercano int, ¿hay alguna forma de obtener un objeto castigable a un int?

    // returns null if the cell is empty
    // returns an object castable to a string if it is a string
    // returns an object castable to a double if it is a floating point or integer number

    internal object GetCell(int row, int column)
    {
        if ((row != 0) && (column != 0) && (worksheet != null))
        {
            string cellName = ExcelCellReference(row, column);
            Microsoft.Office.Interop.Excel.Range oneCellRange;
            oneCellRange = worksheet.get_Range(cellName, cellName);
            object oneObject;

            // contrary to MSDN, the value Empty, checkable with method IsEmpty() 
            // does not work if the cell was empty.
            // instead, what happens is that null is returned.
            oneObject = 
               (object)
oneCellRange.get_Value(Microsoft.Office.Interop.Excel.XlRangeValueDataType.xlRangeValueDefault);

            return oneObject;
        }
        else
        {
            if (worksheet == null)
                throw new Exception("null worksheet reference");
            else
                throw new Exception("invalid argument");
        }
    }

Editar: si cada número en Excel se representa como un número de punto flotante, incluso si es visiblemente un entero, entonces eso explicaría este comportamiento, en cuyo caso no hay otra solución que no sea la conversión.

Editar: la gente sigue publicando respuestas de conversión. Esta es la pregunta está destinada a solicitar idiomática Interop Respuestas, no respuestas de conversión.

Editar: la respuesta de Chris en un comentario int i = (int)(double)GetCell(r, c) posiblemente sea correcto pero no lo que tenía en mente porque la conversión está ocurriendo fuera de Interop.

¿Fue útil?

Solución

De acuerdo a adrianm,

No existe un entero en las células de Excel. Los únicos tipos disponibles son número, texto, lógico y error. El número se asigna para duplicarse en la interoperativa.

Entonces, la respuesta es simplemente lanzar el doble a un int, que comoChris señala en realidad funciona. Tenga en cuenta que si el doble no es igual a un entero para empezar, es posible que desee hacer una conversión más adecuada de acuerdo con su necesidad.

Otros consejos

Por que no ToString() tu objeto, luego analiza usando int.Parse(...) o int.TryParse(...) ?

Puedes convertir tu object dentro double y luego en int, pero debes cuidar como double el valor es mucho más grande que int. Así que mejor convierte tu double dentro long.

Prueba esto:

object val = /*your value*/;
double db = Convert.ToDouble(val);
long x = Convert.ToInt64(db);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top