NPOI 中绘制 Chart

 

NPOI 在新版本中增加了对图表的有限支持(仅  xlsx 文件)

项目地址: https://github.com/tonyqus/npoi

支持折线图和散点图

来看 demo :

     const int NUM_OF_ROWS = 3;
           const int NUM_OF_COLUMNS = 10;

          static void CreateChart(IDrawing drawing, ISheet sheet, IClientAnchor anchor, string serie1, string serie2)
        {
            var chart = drawing.CreateChart(anchor) as XSSFChart;   
           //生成图例
            var legend = chart.GetOrCreateLegend();
       //图例位置
            legend.Position = LegendPosition.TopRight;
            
           //图表
            var data = chart.ChartDataFactory.CreateLineChartData<double, double>(); //折线图
       //var data = chart.ChartDataFactory.CreateScatterChartData<double, double>(); //散点图

            // X轴.
            var bottomAxis = chart.ChartAxisFactory.CreateCategoryAxis(AxisPosition.Bottom);            
            bottomAxis.IsVisible = false; //默认为true 不显示  设置为fase 显示坐标轴(BUG?)
            
            //Y轴
            IValueAxis leftAxis = chart.ChartAxisFactory.CreateValueAxis(AxisPosition.Left);
            leftAxis.Crosses = (AxisCrosses.AutoZero);
            leftAxis.IsVisible = false; //设置显示坐标轴

            //数据源
            IChartDataSource<double> xs = DataSources.FromNumericCellRange(sheet, new CellRangeAddress(0, 0, 0, NUM_OF_COLUMNS - 1));
            
            IChartDataSource<double> ys1 = DataSources.FromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, NUM_OF_COLUMNS - 1));
            IChartDataSource<double> ys2 = DataSources.FromNumericCellRange(sheet, new CellRangeAddress(2, 2, 0, NUM_OF_COLUMNS - 1));
            
            //数据系列
            var s1 = data.AddSeries(xs, ys1);
            s1.SetTitle(serie1);
            var s2 = data.AddSeries(xs, ys2);
            s2.SetTitle(serie2);


            chart.Plot(data, bottomAxis, leftAxis);          
            
        }

        static void Main(string[] args)
        {
            IWorkbook wb = new XSSFWorkbook();
            ISheet sheet = wb.CreateSheet("linechart");

            // Create a row and put some cells in it. Rows are 0 based.
            IRow row;
            ICell cell;
            for (int rowIndex = 0; rowIndex < NUM_OF_ROWS; rowIndex++)
            {
                row = sheet.CreateRow((short)rowIndex);
                for (int colIndex = 0; colIndex < NUM_OF_COLUMNS; colIndex++)
                {
                    cell = row.CreateCell((short)colIndex);
                    cell.SetCellValue(colIndex * (rowIndex + 1));
                }
            }

            IDrawing drawing = sheet.CreateDrawingPatriarch();
            //锚点
            IClientAnchor anchor1 = drawing.CreateAnchor(0, 0, 0, 0, 0, 5, 10, 15);
            CreateChart(drawing, sheet, anchor1, "title1","title2");
            IClientAnchor anchor2 = drawing.CreateAnchor(0, 0, 0, 0, 0, 20, 10, 35);
            CreateChart(drawing, sheet, anchor2, "s1", "s2");
            using (FileStream fs =File.Create("test.xlsx"))
            {
                wb.Write(fs);
            }

        }

  

 

 

很多特性都还不支持,这是比较难受的.将就用吧

posted @ 2018-08-07 10:05  盛世桃娘  阅读(5776)  评论(2编辑  收藏  举报