0

Microsoft.Office.Interop.Excel名前空間を使用していて、グラフを作成しています。ある時点で、あるシリーズの値を取得したい。MSDNでは、オブジェクトにプロパティがあると書かています。これは、オブジェクトまたはを返します。私は。を想定しています。私のコードには、次のステートメントがあります。SeriesValuesRangearray of valuesobject[]

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

私はInvalidCastException次のメッセージを受け取ります:Unable to cast object of type 'System.Object[*]' to type 'System.Object[]'.

Visual Studio 2008を使用してデバッグすると、の種類を調べることができ、series.Valuesと表示されますobject{object[1..7]}。これは(私が理解しているように)それがとして宣言されているobjectが、実際のタイプはであるということを意味しobject[1..7]ます。しかしobject[1..7]、実際には私がキャストできるタイプではなく、どちらもキャストできませんobject[*]

配列が0ではなく1から始まるという事実と関係があるのではないかと思います(または推測します)(おそらくVBが原因です)。私はあなたがC#で1ベースの配列を定義できることさえ知りませんでした...

4

3 に答える 3

4

ゼロ以外のインデックスベースの配列を作成することは、C#では奇妙に思えるかもしれませんが、実際には可能です。

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

あなたの場合、配列にキャストして列挙できるはずだと思います。

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

そして、CLRのこのタイプのアレイに関する物語を説明する興味深い記事があります。

于 2009-11-27T21:20:56.933 に答える
0

実際には、配列を作成する前に配列を定義する必要があります。.Valuesプロパティから結果を取得しているためです。

これはうまくいくはずです...

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

ダリンは正しいですが、1ベースですが、通常の2次元配列でもありません。範囲およびその他のExcelオブジェクトは、1ベースの「ギザギザ」(これが正しい説明だと思います)配列を使用します。これは、範囲オブジェクトが必ずしも連続して配置されているとは限らないためです。

Darinの提案のようにArrayクラスを使用すると、任意の形式のオブジェクト配列を受け入れるため、機能します。アイテムを列挙する必要がある場合は、おそらく彼の例を使用して作業する方が簡単です。

于 2010-04-28T23:29:23.620 に答える
-1

これは、WindowsアプリケーションとVSTOモデルの間の問題です。

foreach (object item in series.Values as Array)

VSTOの場合はこれを試してください。

于 2017-07-17T13:55:27.937 に答える