C#/ Excel:在图表上使用最大系列尺寸

Vin*_*ent 8 c# excel charts series

我需要帮助以编程方式绘制比单个Excel系列中更多的点.

根据http://office.microsoft.com/en-us/excel/HP100738491033.aspx,Excel 2007图表上可显示的最大点数为256000.鉴于每个系列的最高点为32000点,需要8个系列绘制全部256000点.由于我们使用的大型数据集,我的客户需要绘制每个图表的最大点数.

我对C#/ Excel互操作有一定的经验,所以我认为以编程方式创建工作表然后循环遍历每组32000点并将它们作为一个系列添加到图形中,在数据完全绘制时停止或8系列是很容易的被绘制.如果颜色合适,8系列在视觉上与单个系列无法区分.

不幸的是我在这里.我遇到的主要问题是:

(完整大小) 在二维图表的数据系列中可以使用的最大数据点数是32,000 ... http://img14.imageshack.us/img14/9630/errormessagen.png

奇怪的是,当我执行该行时,会出现这个弹出窗口:

chart.ChartType = chartType(其中chartType是xlXYScatterLines)http://img2.imageshack.us/img2/2413/linean.png

并附有:

来自HRESULT的异常:0x800AC472 http://img21.imageshack.us/img21/5153/exceptionb.png

在我甚至指定要绘制的数据之前,我不明白如何生成这样的弹出/警告/异常.Excel在这里试图变得聪明吗?

作为临时解决方法,我将chart.ChartType = chartType语句放入try-catch块中,这样我就可以继续了.

如下所示,我的"分块"代码按预期工作,但在尝试向图表添加数据时仍遇到同样的问题.Excel表示,当我显然不是时,我试图绘制太多的点.

带有观察窗口的(全尺寸图像) 代码块http://img12.imageshack.us/img12/5360/snippet.png

我知道我可能没有正确地将X值与每个系列相关联,但是我想在我走得更远之前让它工作.

任何帮助将不胜感激.

这是完整的代码:

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");
    }
Run Code Online (Sandbox Code Playgroud)

小智 3

如果活动单元格位于数据块中,Excel 可能会假设您要绘制范围。

选择不在数据旁边的空白单元格,然后插入图表。它将是空白的,而不是预先填充的。