Как я могу получить доступ к значениям из `Series.Values` (таблица Excel) - PullRequest
0 голосов
/ 27 ноября 2009

Я использую пространство имен 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). Я даже не знал, что вы можете определить массив на основе 1 в C # ...

Ответы [ 3 ]

4 голосов
/ 28 ноября 2009

Даже в C # может показаться странным создание массивов, основанных на ненулевых индексах, это реально возможно:

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

В вашем случае, я думаю, вы должны быть в состоянии привести к массиву и перечислить:

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

И есть интересная статья , объясняющая сагу об этих типах массивов в CLR.

0 голосов
/ 17 июля 2017

Это проблема между приложением Windows и моделью VSTO.

foreach (object item in series.Values as Array)

Попробуйте это в случае VSTO.

0 голосов
/ 29 апреля 2010

Собственно, зачем вообще определять массив перед его созданием. так как вы получаете результат обратно из свойства .Values.

Это должно работать ...

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

Дарин прав, это основано на 1, но это также не обычный двумерный массив. Range и другие объекты Excel используют основанный на 1 массив «неровных» (я думаю, это правильное описание) массив, поскольку любой объект range не обязательно выровнен по совпадению.

Использование класса Array, как в предложении Дарина, будет работать, так как он принимает любую форму массива объектов. Вероятно, проще использовать его пример, если вам просто нужно перечислить элементы.

...