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'.

¿Fue útil?

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)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top