2009-10-06 2 views
1

현재 Office 개체 모델을 사용하여 Excel 문서를 생성하고 있습니다. 차트 편집에 문제가 있습니다. 템플릿 파일에서 나는 다음과 같은 소스를 사용하는 막대 차트를 가지고 :Excel 차트 변경 수식

2008 2009 2010 
A 10%  25%  15% 
B 20%  25%  35% 
C 30%  25%  45% 
D 40%  25%  5% 

차트가 다음 수식 : = 시트 2! $ A $ 1 : $의 D $ (5)

때 예제에 대한 '2009'열이 비어 있는데 차트에 막대를 표시하고 싶지 않습니다. 그래서 공식을 다음과 같이 변경하고 싶습니다.= sheet2! A $ 1 : D $ 5; sheet2! C $ 1 : C $ 5

나는 setSourceData 메소드가 있다는 것을 알고 있지만, 현재 공식 또는 범위를 가져와야합니다. 먼저.

내 질문은; 차트 수식을 얻으려면 어떻게해야합니까? 아니면 내가 원하는 것을 할 수있는 또 다른 방법이 있을까요?

나는 또한 Excel에서 동적 범위를 사용하여 시도했지만 이것은 '2009'열과 같은 중간이 아니라 범위 끝에 추가되거나 제거 된 열에서만 작동하는 것으로 보입니다.

답변

1

문제를 해결하기 위해 다음 코드를 작성했습니다. 그것은 모든 실존 ​​시리즈 공식을 재건합니다. 이것은 가능한 모든 차트에서 작동하지 않지만 현재 가지고있는 차트에서는 가능합니다. 앞으로도 다시 살펴보고 개선하기 위해 노력할 것입니다. 아래 코드에 대한 제안은 환영합니다. (코드 주석의 부족 죄송합니다)

 foreach (Excel.ChartObject chart in (Excel.ChartObjects)sheet.ChartObjects(Type.Missing)) 
     { 
      IDictionary<int, Boolean> colHasValues = new Dictionary<int, Boolean>(); 
      ArrayList seriesFormulas = new ArrayList(); 

      foreach (Excel.Series series in (Excel.SeriesCollection)chart.Chart.SeriesCollection(Type.Missing)) 
      { 
       seriesFormulas.Add(series.Formula); 

       Array sValues = (Array)series.Values; 
       int i = 1; 
       foreach (Object o in sValues) 
       { 
        if(!colHasValues.Keys.Contains(i)) colHasValues.Add(i, false);       
        if (o != null) 
        { 
         colHasValues[i] = true;        
        } 
        i++; 
       } 
      } 

      if (!colHasValues.Values.Contains(true)) 
      { 
       chart.Delete(); 
      } 
      else if (colHasValues.Values.Contains(false) && seriesFormulas.Count > 1) 
      {  

       ArrayList newSeriesFormulas = new ArrayList(); 

       foreach (String formula in seriesFormulas) 
       { 

        String[] formulaBits = formula.Split(";".ToCharArray()); 
        if (formulaBits.Length == 4) 
        { 

         for (int arrNr = 1; arrNr <= 2; arrNr++) 
         { //1 = XValues, 2 = Values 
          int indexFirstChar = formulaBits[arrNr].IndexOf(':'); 
          int indexLastChar = formulaBits[arrNr].LastIndexOf('$', indexFirstChar) + 1; 

          String firstRow = formulaBits[arrNr].Substring(indexLastChar, indexFirstChar - indexLastChar); 
          String firstColumn = formulaBits[arrNr].Substring(indexLastChar - 2, 1); 

          formulaBits[arrNr] = ""; 

          foreach (KeyValuePair<int, Boolean> cat in colHasValues) 
          { 
           if (cat.Value == true) 
           { 
            formulaBits[arrNr] += "overzichten!$" + getExcelColumnName((getExcelColumnNumber(firstColumn) + cat.Key - 1)) + "$" + firstRow + ":$" + getExcelColumnName((getExcelColumnNumber(firstColumn) + cat.Key - 1)) + "$" + firstRow + ";"; 
           } 
          } 
          formulaBits[arrNr] = formulaBits[arrNr].TrimEnd(";".ToCharArray()); 
          if (formulaBits[arrNr].Contains(';')) 
          { 
           formulaBits[arrNr] = "(" + formulaBits[arrNr] + ")"; 
          } 
         } 

         newSeriesFormulas.Add(String.Join(";", formulaBits)); 

        } 

       } 

       int seriesid = 0; 
       foreach (Excel.Series series in (Excel.SeriesCollection)chart.Chart.SeriesCollection(Type.Missing)) 
       { 
        series.Formula = newSeriesFormulas[seriesid].ToString(); 
        seriesid++; 
       } 

      } 

     } 
0

차트의 전체 데이터 범위를 보유하는 속성이 없습니다. 그러나 각각 시리즈에는 범위에 대한 정보가 있습니다.

아래 코드는 모든 시리즈를 나열한 다음 두 번째 시리즈를 삭제합니다. 하여 예 데이터에 기초

Sub ChartRanges() 

Dim lngSeries As Long 

    ActiveSheet.ChartObjects("Chart 1").Select 

    For lngSeries = 1 To ActiveChart.SeriesCollection.Count 
     Debug.Print ActiveChart.SeriesCollection(lngSeries).Formula 
    Next lngSeries 
'List out series in chart 

    ActiveChart.SeriesCollection(2).Delete 
'Delete a series from the chart 

End Sub 

코드를 출력이

= SERIES (시트 1 $ B $ 1 시트 1 $ A $ 2! $ A $ 5 시트 1 $ B : $ 2! $ B $ 5,1) = 시리즈 (Sheet1! $ D $ 1, Sheet1! $ A) = 시리즈 (Sheet1! $ C $ 1, Sheet1! $ A $ 2 : $ A $ 5, Sheet1! $ C $ 2 : $ 2 : $ A $ 5 Sheet1의 $ D $ 2 :하세요 시리즈 네 개의 인자로 구성되어

$의 D $ 5,3 일) :

(일련 이름, X 값, 값, 플롯 주문)

+0

덕분에,하지만 내 예에 행 A, B, C 및 D는 시리즈입니다. 나는 그것을위한 자료가 없으면 종류 (200820092010)를 제거하고 싶다. – user168998