0

我正在使用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]}. 这意味着(据我所知)它被声明为 anobject但它的实际类型是object[1..7]. 但object[1..7]不是我可以转换为的类型,也不是object[*].

我怀疑(或猜测)它可能与数组从 1 而不是 0 开始的事实有关(可能是因为 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; 

Darin 是正确的,它是基于 1 的,但它也不是普通的二维数组。Range 和其他 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 回答