2010-12-03 43 views
3

J'essaie d'obtenir des cellules d'exceller dans csharp mais je ne sais pas quel est le meilleur type de variable pour le lire.Comment extraire une valeur de cellule à partir d'Excel en utilisant VSTO?

Si je fais de la variable une chaîne et que la valeur de la cellule est un double, j'obtiens une erreur d'analyse. Si je fais double la variable, alors quand la cellule est une chaîne, ça ne marchera pas.

Voici le code que je suis en cours d'exécution:

try 
{ 
     string i = Globals.Sheet1.Cells[7, 7].Value; 
     double num; 
     if (i == null) return; 

     if (double.TryParse(i, out num)) 
     { 
       . 
       . 
       . 
     } 
} 
catch (Exception e) 
{ 
     MessageBox.Show(e.ToString()); 
} 

Répondre

4

en font un objet, puis trouver le bon type après avoir obtenu la valeur de la cellule.

Je ne connaissais pas VSTO, mais dans l'assembly Excel Interop, il y avait un Value2 et une propriété Text qui renvoyait l'objet, et pouvait être transtypée par le polymorphisme au type correct. Est-ce que VSTO ne les fournit pas?

+1

chaîne foo = ((Range) MyWorksheet.Cells [2, 3]) Value2.ToString(); –

+1

Bien que je n'ai pas pu accéder à cet article SO à cause du même problème, le problème .Text a résolu un problème que j'avais avec Value2 avec un DateTime stocké dans une cellule. Au lieu de cela, il me renvoyait une double valeur, et en utilisant .Text.ToString() m'a renvoyé la valeur textuelle du champ que je voulais. Je n'étais pas conscient de la propriété .Text. Merci. – TravisWhidden

0

Vous pouvez appeler simplement ToString() sur l'objet puis ne Double.TryParse() pour voir si la valeur est numérique ou texte

0

simplement

double x = (double)Globals.Sheet1.Cells[7, 7].Value; 

vous obtiendrez la valeur double ou lancer une exception (pas besoin de l'attraper, il sera affiché correctement dans une boîte de dialogue dans Excel si rien ne l'attrape en amont).

0

Je préfère obtenir la valeur de texte directement et je ne veux pas traiter le type de données sous-jacent pour la plupart. Je reçois la valeur textuelle comme le commentaire TravisWhidden mentionné, voici mon code VSTO C# pour obtenir une lecture à partir d'une cellule et retourner une valeur de texte indépendamment de l'objet de base.

Cette ma méthode d'extension qui fonctionne à partir de la page de feuille:.

public static string CellGetStringValue(this WorksheetBase theSheet, int row, int column) 
{ 
    var result = string.Empty; 

    if (theSheet != null) 
    { 
     var rng = theSheet.Cells[row, column] as Excel.Range; 

     if (rng != null) 
      result = (string) rng.Text; 
    } 

    return result; 
} 
+0

@TravisWhidden J'ai pris votre commentaire comme conseil et j'ai créé une extension pour utiliser 'Text' pour obtenir une valeur; ensuite affiché comme une réponse à la question. – OmegaMan

0
try 
{ 

    dynamic mycell = Globals.Sheet1.Cells[7, 7]; 
    double num; 
    if (mycell.Value == null) return; //you can use mycell.Text too. 

    if (double.TryParse(mycell.Text, out num)) 
    { 
      . 
      . 
      . 
    } 
} 
catch (Exception e) 
{ 
     MessageBox.Show(e.ToString()); 
}