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:
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");
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn die aktive Zelle in einem block von Daten ist, kann Excel übernehmen Sie den zu plottenden Bereich.
Wählen Sie eine leere Zelle, die nicht direkt an die Daten, und fügen Sie anschließend das Diagramm. Es wird leer sein, anstatt vorausgefüllt.
Sieht Ihr graph tatsächlich in Excel? Mit vielen Datenpunkten, die Leistung wäre schrecklich.
Einen Vorschlag möglicherweise die Verwendung einer Dritten Komponente zum generieren der Graphen. Die spezifische Technik, wie dies zu erreichen hängt davon ab, ob Sie in der Lage sein, die Daten in excel oder ob die Ausgabe-Grafik muss einfach nur verfügbar sein anderswo.
Wenn das Diagramm nicht sichtbar sein muss, innerhalb von Excel, dann geben Sie einfach die Daten-Punkte und die Bild in die Grafik-Anwendung oder einen web-browser.
Wenn Sie brauchen, um die Grafik mit excel, Sie könnten einen Aufruf der externen Grafik-Anwendung und es eine Ansammlung von Datenpunkten. Wenn es gibt, dass das Bild einfach stecken Sie Sie in excel mit vba.
Kann ich Ihnen mehr info auf beide Ansätze, wenn Sie brauchen.
Auch andere überlegungen könnte gehören, ob Sie brauchen, um drill-down-Funktionen auf dem Graphen. Mit diesen vielen Daten Punkte, ich kann mir nicht vorstellen, dass Sie würde.
Wenn Sie können, beantworten Sie die folgenden Fragen, es könnte helfen, Leute besser formulieren Antworten.
Welche Art von Benutzer-interface-präsentiert die Ausgabe dieser Gegenstände? (z.B. Excel, ASP.NET Web-Anwendung, Windows Forms -, WPF -, Silverlight und andere.)
Sind diese Diagramme soll erzeugt werden, in Echtzeit auf die Anforderung eines Nutzers oder werden Sie generiert und gespeichert? Wenn Sie generiert werden, auf Nachfrage, was ist die maximale Zeit, die Ihre Benutzer würden als akzeptabel, zu warten?
Wie wichtig ist es, dass Sie tatsächlich mit Excel? Verwenden Sie es, denn es ist eine Anforderung für die Anzeige, oder ist das nur, was ist praktisch?
Wie wichtig ist der "Wow-Faktor" für die Anzeige der Graphen? Ist einfach die Grafiken, oder müssen Sie sehr schön?
Müssen Benutzer keine Möglichkeit, einen Drilldown in den Graphen, oder einfach nur das Bild anzeigen können, für ausreichend?
Irgendjemandem zu helfen, stößt dies in der Zukunft, hier ist die komplette Funktion mit Jon ' s fix: