Pregunta

Estoy usando el espacio de nombres Microsoft.Office.Interop.Excel y estoy creando un gráfico. En un momento determinado, quiero recuperar los valores de una serie determinada. En MSDN dice que un objeto Series tiene una propiedad Values ??. Esto devuelve un objeto Range o un conjunto de valores , asumo un objeto [] . En mi código tengo la siguiente declaración:

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

Obtengo una InvalidCastException con el mensaje: No se puede convertir el objeto de tipo 'System.Object [*]' para escribir 'System.Object []'.

Cuando depuro, usando Visual Studio 2008, puedo inspeccionar el tipo de series.Values ?? y dice object {object [1..7]} . Esto significa (como entiendo) que está declarado como un objeto pero su tipo real es objeto [1..7] . Pero object [1..7] no es realmente un tipo al que puedo convertir y tampoco es object [*] .

Sospecho (o supongo) que podría tener algo que ver con el hecho de que la matriz comienza en 1 en lugar de 0 (probablemente debido a VB). Ni siquiera sabía que podías definir una matriz basada en 1 en c # ...

¿Fue útil?

Solución

Incluso difícil que parezca extraño en C # crear arrays basados ??en índices distintos de cero, en realidad es posible:

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

En su caso, creo que debería poder convertir a una matriz y enumerar:

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

Y hay un interesante artículo que explica la saga sobre este tipo de arrays en el CLR.

Otros consejos

En realidad, ¿por qué incluso definir la matriz antes de crearla? ya que está obteniendo el resultado de la propiedad .Values.

Esto debería funcionar ...

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

Darin es correcto, está basado en 1, pero tampoco es una matriz bidimensional normal. El rango y otros objetos de Excel utilizan un " jagged " (creo que esta es la descripción correcta), ya que cualquier objeto de rango no está necesariamente alineado de forma contigua.

Usar la clase Array como en la sugerencia de Darin funcionará ya que acepta cualquier forma de matriz de objetos. Probablemente sea más fácil trabajar con su ejemplo si solo necesita enumerar los elementos.

Este es el problema entre la aplicación de Windows y el modelo VSTO.

foreach (object item in series.Values as Array)

Prueba esto en caso de VSTO.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top