Excel fórmula cambio carta
-
19-09-2019 - |
Pregunta
Actualmente estoy generando Excel-documentos utilizando el modelo de objetos de Office. Tengo un problema con la edición de gráficos. En un archivo de plantilla Tengo una gráfica de barras que utiliza el siguiente código:
2008 2009 2010
A 10% 25% 15%
B 20% 25% 35%
C 30% 25% 45%
D 40% 25% 5%
El gráfico tiene la siguiente fórmula: = Hoja2 $ A $ 1: $ D $ 5
Cuando, por ejemplo, la columna '2009' está vacía, no quiero para mostrar la barra en el gráfico. Así que quiero cambiar la fórmula a algo como: = Hoja2 A $ 1:!! $ D 5; Hoja2 C $ 1: C $ 5
Sé que hay un setSourceData método, pero tengo que conseguir la fórmula actual o rango en primer lugar.
Mi pregunta es; ¿Cómo puedo obtener la fórmula gráfica? O tal vez hay otra manera de hacer lo que quiero?
También intentado algo con rangos dinámicos en Excel, pero esto parece que funciona únicamente con columnas que se agregan o se quitan del extremo superior del rango, no en el medio como la columna '2009'.
Solución
Hice el siguiente código para resolver mi problema. Se reconstruye todas las fórmulas de la serie existings. Esto no funcionará para todas las cartas posibles, pero sí para los que tengo actualmente. En el futuro probablemente me miro de nuevo y tratar de mejorarlo. Sugerencias para el código de abajo son bienvenidos.
(lo siento por la falta de comentarios 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++;
}
}
}
Otros consejos
No es una propiedad que posee la gama completa de datos de un gráfico. Sin embargo, cada Serie contiene información acerca de la gama.
El código siguiente mostrará una lista de todas las series y luego eliminar el 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
Sobre la base de los datos de ejemplo, la salida de este código voluntad
= SERIE (Hoja1 $ B $ 1, Hoja1! $ A $ 2:!! $ A $ 5, Hoja1 $ B $ 2: $ B $ 5,1) = SERIES (Sheet1 $ C $ 1, Sheet1 $ A $ 2:! $ A $ 5, Sheet1 $ C $ 2:! $ C $ 5,2) = SERIE (Hoja1 $ D $ 1, Hoja1! $ A $ 2:!! $ A $ 5, Hoja1 $ D $ 2:! $ D $ 5,3)
La Serie se compone de cuatro argumentos:
(Nombre de la serie, XValues, Valores, Parcela orden)