Domanda

Al momento sto generare Excel-documenti utilizzando il modello oggetto di Office. Ho un problema con la modifica dei grafici. In un file di modello ho avuto un bar-chart, che utilizza la seguente fonte:

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

Il grafico ha la seguente formula: = Sheet2 $ A $ 1: $ D $ 5

Quando ad esempio la colonna '2009' è vuoto, non voglio mostrare la barra del grafico. Quindi voglio cambiare la formula per qualcosa come: = Sheet2 A $ 1:! D $ 5; sheet2 C $ 1: C $ 5

So che c'è un metodo setSourceData, ma ho bisogno di ottenere la formula corrente o l'intervallo prima.

La mia domanda è; Come posso ottenere la formula grafico? O forse c'è un altro modo per fare quello che voglio?

Ho provato anche qualcosa con gamme dinamiche in Excel, ma questo sembra funzionare solo con le colonne che vengono aggiunti o rimossi dalla fine del campo, non nel mezzo, come colonna '2009'.

È stato utile?

Soluzione

Ho fatto il seguente codice per risolvere il mio problema. Si ricostruisce tutte le formule existings serie. Questo non funziona per tutte le possibili classifiche, ma lo fa per quelli che ho attualmente. In futuro io probabilmente guardo di nuovo e cercare di migliorarla. Suggerimenti per il codice qui sotto sono i benvenuti.

(mi dispiace per la mancanza di commenti al codice)

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

            }

        }

Altri suggerimenti

Non c'è una proprietà che contiene la gamma completa dei dati di un grafico. Tuttavia ogni Serie contiene le informazioni su di esso di gamma.

Il codice di seguito vengono elencati tutti i serie e quindi eliminare la seconda.

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

In base ai dati di esempio, l'uscita del codice volontà questo

= SERIE (Foglio1 $ B $ 1, Sheet1! $ A $ 2:!! $ A $ 5, Foglio1 $ B $ 2: $ B $ 5,1) = SERIE (Foglio1 $ C $ 1, Sheet1! $ A $ 2:!! $ A $ 5, Foglio1 $ C $ 2: $ C $ 5,2) = SERIE (Foglio1 $ D $ 1, Sheet1! $ A $ 2:!! $ A $ 5, $ Sheet1 D $ 2: $ D $ 5,3)

Il Serie è composto da quattro argomenti:

(Nome Serie, XValues, Valori, Plot Order)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top