2009-11-27 6 views
0

J'utilise l'espace de noms Microsoft.Office.Interop.Excel et je crée un graphique. À un certain moment, je veux récupérer les valeurs d'une certaine série. Le MSDN indique qu'un objet Series a la propriété Values. Cela renvoie soit un objet Range ou un array of values, je suppose un object[]. Dans mon code, j'ai fait la déclaration suivante:Comment puis-je accéder aux valeurs de `Series.Values` (tableau Excel)

Series series = (Series)chart.SeriesCollection(i); 
object[] values = (object[])series.Values; 

je reçois un InvalidCastException avec le message: Unable to cast object of type 'System.Object[*]' to type 'System.Object[]'.

Lorsque debugger, en utilisant Visual Studio 2008, je peux vérifier le type de series.Values et il dit object{object[1..7]}. Cela signifie (si je comprends bien) qu'il est déclaré comme object mais son type réel est object[1..7]. Mais object[1..7] n'est pas vraiment un type que je peux lancer et aucun n'est .

Je suppose (ou devinez) que cela pourrait avoir quelque chose à voir avec le fait que le tableau commence à 1 au lieu de 0 (probablement à cause de VB). Je ne savais même pas que vous pouvez définir un tableau basé sur 1 en C# ...

Répondre

4

Même dur il peut sembler bizarre en C# pour créer des tableaux basés sur des indices non nuls, il est en fait possible:

var array = Array.CreateInstance(
    typeof(object), 
    new int[] { 7 }, 
    new int[] { 1 }); 

dans votre cas, je pense que vous devriez être en mesure de jeter à un tableau et d'énumérer:

foreach (object item in (Array)series.Values) 
{ 
} 

et il y a une article intéressante expliquant la saga autour de ce type de tableaux dans le CLR.

+0

Hey - ce lien est maintenant cassé BTW, je pense que le nouveau lien est: http://www.panopticoncentral.net/2004/03/17/non-zero-lower-bounded-arrays-the- other-side-of-the-coin/ – garfbradaz

0

En fait, pourquoi même définir le tableau avant de le créer. puisque vous récupérez le résultat de la propriété .Values.

Cela devrait fonctionner ...

Series series = (Series)chart.SeriesCollection[i]; 
object[,] values = (object[,])series.Values; 

Darin est correcte, il est 1 base, mais il est pas non plus un tableau à 2 dimensions normales. Range et d'autres objets Excel utilisent un tableau "dentelé" basé sur 1 (je pense que c'est la description correcte) puisque tout objet de gamme n'est pas nécessairement aligné de manière contiguë. L'utilisation de la classe Array comme dans la suggestion de Darin fonctionnera puisqu'elle accepte n'importe quelle forme de tableau d'objets. Il est probablement plus facile de travailler avec son exemple si vous avez juste besoin d'énumérer les éléments.

+0

Cette conversion ne fonctionne pas –

+0

Avez-vous utilisé des crochets pour référencer l'élément i dans le tableau? J'ai mis à jour l'exemple de code. –

-1

C'est le problème entre l'application Windows et le modèle VSTO.

foreach (object item in series.Values as Array) 

Essayez ceci dans le cas de VSTO.

Questions connexes