`Series.Values`(Excel 차트)의 값에 어떻게 액세스합니까?
-
05-07-2019 - |
문제
나는 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의 경우 시도해보십시오.