문제

나는 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[*].

나는 배열이 0 대신 1에서 시작한다는 사실과 관련이 있을 수 있다고 생각합니다(아마도 VB 때문일 것입니다).C#에서 1 기반 배열을 정의할 수 있다는 것도 몰랐습니다...

도움이 되었습니까?

해결책

C#에서 0이 아닌 인덱스 기반 배열을 만드는 것이 이상하게 보일 수 있습니다. 실제로 가능합니다.

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

귀하의 경우에는 배열에 캐스트하고 열거 할 수 있어야한다고 생각합니다.

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

그리고 흥미로운 것이 있습니다 기사 CLR에서 이러한 유형의 배열 주변의 사가를 설명합니다.

다른 팁

실제로 배열을 만들기 전에 배열을 정의하는 이유는 무엇입니까?.Values ​​속성에서 결과를 다시 가져오고 있기 때문입니다.

이것이 작동해야합니다 ...

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

Darin은 1 기반 배열이 맞지만 일반적인 2차원 배열도 아닙니다.범위 및 기타 Excel 개체는 범위 개체가 반드시 연속적으로 정렬되지는 않기 때문에 1 기반의 "가장자리"(올바른 설명이라고 생각함) 배열을 사용합니다.

Darin의 제안에 따라 Array 클래스를 사용하면 모든 형태의 객체 배열을 허용하므로 작동합니다.항목을 열거하기만 하면 되는 경우에는 그의 예를 사용하여 작업하는 것이 더 쉬울 것입니다.

이것은 Windows 응용 프로그램과 VSTO 모델 사이의 문제입니다.

foreach (object item in series.Values as Array)

VSTO의 경우 시도해보십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top