asp.net图表,代码基于使用excel构建的图表

时间:2013-09-17 14:37:01

标签: c# charts ms-word dotnetcharting

我需要在运行时确定图表中的数据并将其放在.doc中。 为了构造文档,我使用Aspose来替换.doc模板中的元素。 通过将Excel工作簿导入Word进行示例图表,他们大多使用默认值,但我无法构建看起来像它的图表。

What the graph should look like What I got so far

右边是我试图在代码中创建的示例图表,左边是我到目前为止所做的。

  1. 没有标记每个数据点的点
  2. 刻度标记位于刻度标记处而不是位于其间(使用Axis位置完成)不知道如何在代码中执行此操作。
  3. 图表的高度被压缩,因为.net图表制作的图片是方形的,需要在示例图片边界内填充(如何更改宽度/高度比?)
  4. 大号码没有格式化。每组三个数字之间。
  5. .docx不是一个选项,文件格式必须是.doc。

    我构建图表的代码。使用数据调用此代码以填充图形。

        public MemoryStream MakeLineChart(string title, string[] captions, Color[] colors, decimal[][] values)
        {
            var chart = new Chart();
    
            var area = new ChartArea("MyChartArea");
            area.AxisY2.LineWidth = 0;
            area.AxisY.LineWidth = 0;
            area.AxisY.MajorGrid.Enabled = false;
            area.AxisY.MinorGrid.Enabled = false;
            area.AxisX.IsMarginVisible = true;
    
            foreach (var axis in area.Axes)
            {
                axis.LineColor = Color.LightGray;
                axis.MajorGrid.LineColor = Color.LightGray;
                axis.MajorTickMark.Enabled = false;
            }
    
            var legend = new Legend();
            legend.LegendStyle = LegendStyle.Row;
            legend.Docking = Docking.Bottom;
            legend.DockedToChartArea = area.Name;
            legend.Enabled = true;
    
            chart.Legends.Add(legend);
            chart.ChartAreas.Add(area);
            chart.BorderlineColor = Color.Black;
            chart.BorderlineWidth = 2;
            chart.Titles.Add(title);
            chart.TextAntiAliasingQuality = TextAntiAliasingQuality.High;
            chart.AntiAliasing = AntiAliasingStyles.All;
    
            for (int i = 1; i < values.Length; i++)
            {
                var line = new Series(captions[i - 1]);
                line.ChartArea = area.Name;
                line.ChartType = SeriesChartType.Spline;
                line.Color = colors[i - 1];
                line.BorderWidth = 5;
    
                for (int j = 0; j < values[i].Length; j++)
                {
                    line.Points.AddXY(values[0][j], values[i][j]);
                }
    
                chart.Series.Add(line);
            }
    
            var image = new MemoryStream();
    
            chart.SaveImage(image, ChartImageFormat.Emf);
    
            return image;
        }
    

1 个答案:

答案 0 :(得分:0)

我解决了其中几个问题:

  1. 指定系列

    上的标记
            line.MarkerStyle = MarkerStyle.Circle;
            line.MarkerSize = 7;
    
  2. 还是一个问题,刻度线标签值是有问题的,我需要它们恰好是x轴值,就像在Word中使用Excel工作簿时的默认值一样。

  3. 指定图表大小:

        chart.Width = 280;
        chart.Height = 180;
    
  4. 指定格式:

        area.AxisY.LabelStyle.Format = "€{#,##0 }";
    
  5. 我发现了另外两个问题,如果我不能解决它们,会问另一个问题。

    1. 消除锯齿功能不适用于线条图形。 (即使图表AntiAliasing设置为All)。
    2. 图例位于图表绘制区域内,有时会阻挡实际图形的视图。