我正在使用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的数组答案 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的情况下尝试此操作。