Frage

Ich bin mit dem Microsoft.Office.Interop.Excel namespace, und ich bin Sie ein Diagramm erstellen.In einem bestimmten moment, ich will Sie zum abrufen der Werte einer bestimmten Serie.Auf MSDN es sagt, dass eine Series - Objekt hat eine Eigenschaft Values.Dies gibt entweder eine Range - Objekt oder ein array of values, Ich nehme an, dass eine object[].In meinem code habe ich die folgende Anweisung:

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

Ich bekomme eine InvalidCastException mit der Meldung:Unable to cast object of type 'System.Object[*]' to type 'System.Object[]'.

Wenn ich Debuggen mit Visual Studio 2008, ich kann untersuchen Sie die Art der series.Values und es sagt object{object[1..7]}.Dies bedeutet, dass (wie ich verstehe), dass es deklariert ist als object aber seine eigentliche Typ ist object[1..7].Aber object[1..7] ist nicht wirklich ein Typ, den ich werfen kann, und weder sind object[*].

Ich vermute (oder erraten), dass es vielleicht etwas mit der Tatsache zu tun, dass das array beginnt bei 1 anstelle von 0 (wahrscheinlich wegen der VB).Ich wusste gar nicht, könnten Sie ein 1-basiertes array in c#...

War es hilfreich?

Lösung

Auch hart könnte es seltsam in C # scheint nicht-Null-Index basierten Arrays zu erstellen und es ist tatsächlich möglich:

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

In Ihrem Fall denke ich, sollten Sie auf ein Array werfen können und aufzählen:

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

Und es ist eine interessante Erklären der Saga um diese Arten von Arrays in der noreferrer"> Artikel rel="nofollow CLR.

Andere Tipps

Eigentlich, warum selbst definieren Sie das array, bevor Sie Sie erstellen.da Sie immer das Ergebnis wieder aus .Eigenschaft Werte.

Dies sollte funktionieren...

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

Darin ist richtig es ist 1-basiert, aber es ist auch nicht eine normale 2-dimensionale array.Palette und andere Excel-Objekten verwenden Sie eine 1 "gezackte" (ich denke, das ist die richtige Bezeichnung) array, da jedes range-Objekt wird nicht unbedingt contigiously ausgerichtet.

Durch die Verwendung der Array-Klasse wie Darin vorgeschlagen werden funktionieren, da es akzeptiert jede form der Objekt-array.Es ist wahrscheinlich einfacher, mit zu arbeiten an seinem Beispiel wenn Sie gerade brauchen, zum aufzählen der Elemente.

Das ist das Problem zwischen der Windows-Anwendung gegenüber dem VSTO-Modell.

foreach (object item in series.Values as Array)

Versuchen Sie, dies bei VSTO.

scroll top