C#/Excel: Arbeiten, Um Maximale Serie Größe Auf Die Karte

Ich brauche Hilfe programmatisch Grafik mehr Punkte als die können passen in ein einzelnes Excel-Serie.

Laut http://office.microsoft.com/en-us/excel/HP100738491033.aspx die maximale Anzahl der Punkte Kš Onnen auf eine Excel 2007-Diagramm ist 256000. Da jede Serie Kappen aus bei 32000 Punkte, 8-Serie erforderlich sind, um eine Darstellung der vollständigen 256000 Punkte. Mein Kunde verlangt das zeichnen der maximale Anzahl der Punkte pro Diagramm aufgrund der großen Datenmengen arbeiten wir mit.

Habe ich mäßige Erfahrung mit C#/Excel-interop-so dachte ich, es wäre einfach, programmgesteuert erstellen Sie ein Arbeitsblatt und dann in einer Schleife durch jeden Satz von 32000 Punkte, und fügen Sie das Diagramm als eine Serie beenden, wenn die Daten vollständig gezeichnet oder 8-Serie wurden aufgetragen. Wenn farbige richtig, die 8-Serie würde optisch nicht zu unterscheiden von einer einzigen Serie.

Leider bin ich hier. Das Hauptproblem, dem ich begegne ist:

(in voller Größe)
Die maximale Anzahl der Datenpunkte, die Sie verwenden können, um eine Datenserie für ein 2-D-Diagramm 32.000... http://img14.imageshack.us/img14/9630/errormessagen.png

Diese pop-up, komischerweise erscheint, wenn ich ausführen die Zeile:

C#/Excel: Arbeiten, Um Maximale Serie Größe Auf Die Karte

wird begleitet von:

Ausnahme von HRESULT: 0x800AC472 http://img21.imageshack.us/img21/5153/exceptionb.png

Verstehe ich nicht, wie ich sein könnte generieren eine solche popup/Warnung/Ausnahme vor ich habe sogar angegeben die Daten graphisch dargestellt werden. Wird Excel versuchen, schlau zu sein hier?

Als vorübergehende Lösung, ich habe den chart.ChartType = chartType-Anweisung in einem try-catch-block, so kann ich weitermachen.

Wie das folgende zeigt, mein "chunking" - code wie vorgesehen funktioniert, aber ich trotzdem tritt dasselbe problem wenn Sie versuchen, um Daten an das Diagramm. Excel sagt, ich versuche die Grafik zu viele Punkte, wenn klar bin ich nicht.

(Bild in voller Größe)
code-block mit überwachungsfenster http://img12.imageshack.us/img12/5360/snippet.png

Ich verstehen, kann ich nicht die X-Werte korrekt im Zusammenhang mit der jeweiligen Serie noch, aber ich bin versucht, diese zu arbeiten, bevor ich weiter gehen.

Jegliche Hilfe würde sehr geschätzt werden.

Hier ist der vollständige code:

public void DrawScatterGraph(string xColumnLetter, string yColumnLetterStart, string yColumnLetterStop, string xAxisLabel, string yAxisLabel, string chartTitle, Microsoft.Office.Interop.Excel.XlChartType chartType, bool includeTrendline, bool includeLegend)
    {
        int totalRows = dataSheet.UsedRange.Rows.Count; //dataSheet is a private class variable that 
                                                        //is already properly set to the worksheet
                                                        //we want to graph from

        if (totalRows < 2) throw new Exception("Not generating graph for " + chartTitle.Replace('\n', ' ') 
                                            + " because not enough data was present");

        ChartObjects charts = (ChartObjects)dataSheet.ChartObjects(Type.Missing);
        ChartObject chartObj = charts.Add(100, 300, 500, 300);
        Chart chart = chartObj.Chart;

        try { chart.ChartType = chartType; }
        catch { }   //i don't know why this is throwing an exception, but i'm
                    //going to bulldoze through this problem temporarily 

        if (totalRows < SizeOfSeries) //we can graph the data in a single series - yay!
        {
            Range xValues = dataSheet.get_Range(xColumnLetter + "2", xColumnLetter + totalRows.ToString());
            Range yValues = dataSheet.get_Range(yColumnLetterStart + "1", yColumnLetterStop + totalRows.ToString());
            chart.SetSourceData(yValues, XlRowCol.xlColumns);
            SeriesCollection seriesCollection = (SeriesCollection)chart.SeriesCollection(Type.Missing);
            foreach (Series s in seriesCollection)
            {
                s.XValues = xValues;
            }
        }
        else //we need to split the data across multiple series -- this doesn't work yet
        {
            int startRow = 1; 
            while (startRow < totalRows)
            {
                int stopRow = (startRow + SizeOfSeries)-1;  
                if (stopRow > totalRows) stopRow = totalRows;
                Range curRange = dataSheet.get_Range(yColumnLetterStart + startRow.ToString(), yColumnLetterStop + stopRow.ToString());
                try
                {
                    ((SeriesCollection)chart.SeriesCollection(Type.Missing)).Add(curRange, XlRowCol.xlColumns, 
                                                                            Type.Missing, Type.Missing, Type.Missing);
                }
                catch (Exception exc)
                {
                    throw new Exception(yColumnLetterStart + startRow.ToString() + "!" + yColumnLetterStop + stopRow.ToString() + "!" + exc.Message);
                }
                startRow = stopRow+1;
            }
        }

        chart.HasLegend = includeLegend;
        chart.HasTitle = true;
        chart.ChartTitle.Text = chartTitle;

        Axis axis;
        axis = (Axis)chart.Axes(XlAxisType.xlCategory, XlAxisGroup.xlPrimary);
        axis.HasTitle = true;
        axis.AxisTitle.Text = xAxisLabel;
        axis.HasMajorGridlines = false;
        axis.HasMinorGridlines = false;

        axis = (Axis)chart.Axes(XlAxisType.xlValue, XlAxisGroup.xlPrimary);
        axis.HasTitle = true;
        axis.AxisTitle.Text = yAxisLabel;
        axis.HasMajorGridlines = true;
        axis.HasMinorGridlines = false;

        if (includeTrendline)
        {
            Trendlines t = (Trendlines)((Series)chart.SeriesCollection(1)).Trendlines(Type.Missing);
            t.Add(XlTrendlineType.xlLinear, Type.Missing, Type.Missing, 0, 0, Type.Missing, false, false, "AutoTrendlineByChameleon");
        }

        chart.Location(XlChartLocation.xlLocationAsNewSheet, "Graph");
    }
InformationsquelleAutor Vincent | 2009-09-14
Schreibe einen Kommentar