Pergunta

Atualmente estou gerando Excel-documentos usando o modelo de objeto do Office. Eu tenho um problema com a edição de gráficos. Em um arquivo de modelo Eu tenho um gráfico de barras que usa a seguinte fonte:

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

O gráfico tem a seguinte fórmula: = Sheet2 $ A $ 1: $ D $ 5

Quando, por exemplo, a coluna '2009' está vazia, eu não quero mostrar a barra no gráfico. Então, eu quero alterar a fórmula para algo como: = Sheet2 A $ 1: D $ 5; sheet2 C $ 1: C $ 5

!

Eu sei que há um método setSourceData, mas eu preciso para obter a fórmula atual ou vão em primeiro lugar.

A minha pergunta é; Como posso obter a fórmula gráfico? Ou talvez haja outra maneira de fazer o que eu quero?

Eu também tentei algo com faixas dinâmicas no Excel, mas este parece funcionar apenas com colunas que são adicionados ou removidos do final do intervalo, não no meio, como a coluna '2009'.

Foi útil?

Solução

Eu fiz o seguinte código para resolver o meu problema. Ele reconstrói todas as fórmulas série existings. Isso não vai funcionar para todos os gráficos possíveis, mas ele faz para os que tem atualmente. No futuro eu provavelmente vou olhar para ele novamente e tentar melhorá-lo. Sugestões para o código abaixo são bem-vindos.

(desculpem a falta de comentários de código)

        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++;
                }

            }

        }

Outras dicas

Não há uma propriedade que contém o intervalo de dados completa de um gráfico. No entanto, cada Series contém informações sobre a sua gama.

O código a seguir irá listar todas as séries e exclua o segundo.

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

Com base em seus dados de exemplo, a saída será código este

= SERIES (Sheet1 $ B $ 1, Sheet1 $ A $ 2:! $ A $ 5, Sheet1 $ B $ 2: $ B $ 5,1) = SÉRIE (Folha1 $ C $ 1, Folha1 $ A $ 2:!! $ A $ 5, $ C Folha1 $ 2: $ C $ 5,2) = SERIES (Sheet1 $ D $ 1, Sheet1 $ A $ 2:! $ A $ 5, Sheet1 $ D $ 2: $ D $ 5,3)

O Series é feita a partir de quatro argumentos:

(Nome Series, XValues, Valores Plot Ordem)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top