如何访问`Series.Values`中的值(Excel Chart)

时间:2009-11-27 14:17:55

标签: c# arrays charts excel-interop

我正在使用Microsoft.Office.Interop.Excel命名空间,我正在创建一个图表。在某个时刻,我想要检索某个系列的值。在MSDN上,它表示Series对象具有属性Values。这将返回Range个对象或array of values,我假设object[]。在我的代码中,我有以下声明:

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[*]

我怀疑(或猜测)它可能与数组从1而不是0开始的事实有关(可能是因为VB)。我甚至不知道你可以在c#...

中定义一个基于1的数组

3 个答案:

答案 0 :(得分:4)

即使在C#中创建基于非零索引的数组看起来很奇怪,实际上也是可能的:

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

在你的情况下,我认为你应该能够转换为数组并枚举:

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

还有一个有趣的article解释了CLR中这类数组的传奇。

答案 1 :(得分:0)

实际上为什么甚至在创建数组之前定义它。因为你从.Values属性获得了结果。

这应该有用......

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

Darin是正确的,它基于1,但它也不是正常的二维数组。范围和其他Excel对象使用基于1的“锯齿状”(我认为这是正确的描述)数组,因为任何范围对象都不一定是有条理的对齐。

在Darin的建议中使用Array类将起作用,因为它接受任何形式的对象数组。如果您只需要枚举项目,可能更容易使用他的示例。

答案 2 :(得分:-1)

这是Windows应用程序与VSTO模型之间的问题。

foreach (object item in series.Values as Array)

在VSTO的情况下尝试此操作。