Excel fórmula mudança gráfico
-
19-09-2019 - |
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'.
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)