Excel.office.interop revient le double même lorsqu'il s'agit d'un entier

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

  •  25-08-2022
  •  | 
  •  

Question

Ce qui suit obtient des objets d'une feuille de calcul Excel qui est coulable pour string ou castable à double. Le problème est que même si je sais que l'objet est visiblement un entier, formaté comme "Général" à l'intérieur de la feuille de calcul, Excel.office.interop renvoie toujours un double. Alors qu'il serait facile de convertir le double au plus proche int, y a-t-il un moyen d'obtenir un objet coulable à 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");
        }
    }

EDIT: Si chaque nombre d'Excel est représenté comme un numéro de point flottant, même s'il est visiblement un entier, cela expliquerait ce comportement, auquel cas il n'y a pas d'autre solution que la conversion.

Edit: les gens continuent de publier des réponses de conversion. Cette question est censée solliciter idiomatique Interop Réponses, pas les réponses de conversion.

Edit: la réponse de Chris dans un commentaire int i = (int)(double)GetCell(r, c) est sans doute correct mais pas ce que j'avais en tête parce que la conversion se produit en dehors Interop.

Était-ce utile?

La solution

Selon adrianm,

Il n'existe pas en entier dans les cellules Excel. Les seuls types disponibles sont le numéro, le texte, la logique et l'erreur. Le numéro est mappé pour doubler dans l'interop.

La réponse est donc de simplement lancer le double à un int, qui commeChris Souligne en fait fonctionne réellement. Notez que si le double n'est pas égal à un entier pour commencer, vous voudrez peut-être effectuer une conversion plus appropriée en fonction de vos besoins.

Autres conseils

Pourquoi pas ToString() Votre objet, puis analyser en utilisant int.Parse(...) ou int.TryParse(...) ?

Vous pouvez convertir votre object dans double puis dans int, mais tu devrais prendre soin de double La valeur est beaucoup plus grande que int. donc mieux convertir votre double dans long.

Essaye ça:

object val = /*your value*/;
double db = Convert.ToDouble(val);
long x = Convert.ToInt64(db);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top