Frage

Ich brauche programmatisch helfen, mehr Punkte als die grafische Darstellung in einer einzigen Excel-Serie passen.

Nach http://office.microsoft.com/en-us /excel/HP100738491033.aspx die maximale Anzahl der Punkte darstellbarer auf eine Excel 2007-Diagramm ist 256000 Da jede Serie bei 32.000 Punkten Kappen aus, ist 8 Serie erforderlich, um die vollen 256000 Punkte zu zeichnen. Mein Kunde verlangt Plotten von maximal Anzahl an Punkten pro Diagramm aufgrund der großen Datenmengen mit denen wir arbeiten.

I moderate Erfahrung mit C # / Excel Interop so dass ich dachte, es wäre einfach programmatisch ein Arbeitsblatt zu erstellen und dann die Schleife durch jeden Satz von 32.000 Punkten und fügen Sie sie in die Grafik als eine Serie zu stoppen, wenn die Daten vollständig aufgetragen wurden oder 8-Serie wurden aufgetragen. Wenn sie richtig gefärbt, würde die 8-Serie von einer einzigen Serie optisch nicht zu unterscheiden sein.

Leider bin ich hier. Das Hauptproblem ich begegnen, ist:

(full size) Die maximale Anzahl der Datenpunkte Sie in einer Datenreihe für eine 2-D-Grafik 32.000 ist verwenden können ... http://img14.imageshack.us/img14/9630/errormessagen.png

Das Pop-up, seltsam genug, erscheint, wenn ich ausführen die Zeile:

und wird begleitet von:

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

Ich verstehe nicht, wie ich so eine Pop-up / Warnung / Ausnahme zu erzeugen werden konnte, bevor ich sogar die Daten angegeben grafisch dargestellt werden. Ist Excel versuchen, hier klug zu sein?

als eine vorübergehende Lösung, habe ich die Aussage chart.ChartType = charttype in einen Try-Catch-Block, so ich werde halten können.

Wie die folgenden zeigt, mein „Chunking“ Code funktioniert wie gedacht, aber ich treffe immer noch das gleiche Problem bei dem Versuch, Daten zu dem Diagramm hinzuzufügen. Excel sagt Ich versuche, zu viele Punkte grafisch darstellen, wenn klar bin ich nicht.

( Bild in voller Größe ) Codeblock mit Ãœberwachungsfenster http://img12.imageshack.us/img12/5360/snippet .png

Ich verstehe ich nicht die X-Werte mit jeder Serie richtig noch zugeordnet sein kann, aber ich versuche, diese Arbeit zu bekommen, bevor ich weiter gehen.

Jede Hilfe wäre sehr geschätzt.

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");
    }
War es hilfreich?

Lösung

Wenn die aktive Zelle in einem Block von Daten ist, kann Excel übernehmen Sie den Bereich darstellen mögen.

Wählen Sie eine leere Zelle, die auf die Daten nicht weiter, dann das Diagramm einfügen. Es wird leer sein, und nicht vorbelegt.

Andere Tipps

Gibt es in Ihrem Graph tatsächlich in Excel sein? Mit, dass viele Datenpunkte würde die Leistung schrecklich sein.

Ein Vorschlag könnte sein, eine dritte Partei Komponente zu verwenden, um das Diagramm zu erzeugen. Die spezifische Technik dafür, wie dies zu erreichen, hängt davon ab, ob Sie die Daten in Excel oder ob der Ausgang Graph der Lage sein, einfach an anderer Stelle verfügbar sein muss anzuzeigen.

Wenn das Diagramm muss nicht sichtbar in Excel sein, dann nur die Datenpunkte passieren und das Bild in der Grafik-Anwendung oder einem Web-Browser anzuzeigen.

Wenn Sie benötigen das Diagramm mit Excel zu sehen, wenn Sie einen Anruf an die externen Grafik-Applikation machen könnten und es eine Sammlung von Datenpunkten übergeben. Wenn es um das Bild wieder gerade stecken Sie sie in Excel mit VBA.

Ich kann Ihnen weitere Informationen zu beiden Ansätze geben, wenn Sie benötigen.

Auch andere Überlegungen könnten beinhalten, ob Sie Fähigkeit auf dem Diagramm einen Drilldown haben müssen. Mit so vielen Datenpunkten kann ich mir nicht vorstellen, dass Sie würde.


Wenn Sie die folgenden Fragen beantworten können, könnte es Leute helfen, bessere Antworten zu formulieren.

  1. Welche Art von Benutzeroberfläche wird die Ausgabe dieser Elemente präsentiert werden? (Zum Beispiel Excel, ASP.NET Web Application, Windows Forms, WPF, Silverlight, andere).

  2. Sind diese vermeintlichen Graphen auf Anforderung eines Benutzers in Echtzeit erzeugt werden oder sind sie erzeugt und gespeichert? Wenn sie bei Bedarf erzeugt werden, was die maximale Menge an Zeit, die Benutzer akzeptabel halten würden zu warten?

  3. Wie wichtig ist es, dass Sie tatsächlich Excel verwenden? Sind Sie es verwenden, weil es eine Voraussetzung für die Anzeige ist, oder ist das genau das, was praktisch ist?

  4. Wie wichtig ist der „Wow-Faktor“ für die Anzeige der Graphen? Ist einfach die Graphen mit, oder müssen sie extrem schön sein?

  5. Haben Benutzer jede Fähigkeit erfordern in der Grafik aufschlüsseln oder einfach ist in der Lage, das Bild ausreichend anzusehen?

jeden helfen, über diese in der Zukunft kommt, ist hier die vollständige Funktion mit Jons fix:

    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");

        dataSheet.get_Range("Z1", "Z2").Select();   //we need to select some empty space
                                                    //so Excel doesn't try to jam the 
                                                    //potentially large data set into the 
                                                    //chart automatically

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

        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);

            foreach (Series s in seriesCollection)
            {
                s.XValues = xValues;
            }
        }
        else // we need to split the data across multiple series 
        {
            int startRow = 2; 

            while (startRow < totalRows)
            {
                int stopRow = (startRow + SizeOfSeries)-1;  
                if (stopRow > totalRows) stopRow = totalRows;

                Series s = seriesCollection.NewSeries();
                s.Name = "ChunkStartingAt" + startRow.ToString();
                s.XValues = dataSheet.get_Range(xColumnLetter + startRow.ToString(), xColumnLetter + stopRow.ToString());
                s.Values = dataSheet.get_Range(yColumnLetterStart + startRow.ToString(), yColumnLetterStop + stopRow.ToString());

                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");
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top