首页 > 其他分享 >使用NPOI库操作Chart图表使用心得

使用NPOI库操作Chart图表使用心得

时间:2024-11-27 16:55:17浏览次数:4  
标签:Dml Chart NPOI OpenXmlFormats marker new 心得 CT

最近使用NPOI处理Chart图表时遇到了一些问题。

以下做一些总结,先上完整代码

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

    // 创建数据
    IRow row = sheet.CreateRow(0);
    row.CreateCell(0).SetCellValue("X");
    row.CreateCell(1).SetCellValue("Y");

    for (int i = 1; i <= 10; i++)
    {
        row = sheet.CreateRow(i);
        row.CreateCell(0).SetCellValue(i);
        row.CreateCell(1).SetCellValue(i * i); // Y = X^2
    }

    // 创建图表
    XSSFDrawing drawing = (XSSFDrawing)sheet.CreateDrawingPatriarch();
    XSSFClientAnchor anchor = (XSSFClientAnchor)drawing.CreateAnchor(0, 0, 0, 0, 0, 12, 10, 30);

    XSSFChart chart = (XSSFChart)drawing.CreateChart(anchor);
    chart.SetTitle("Scatter Plot");

    IChartDataFactory dataFactory = chart.ChartDataFactory;
    IChartAxisFactory axisFactory = chart.ChartAxisFactory;

    IChartAxis categoryAxis = axisFactory.CreateCategoryAxis(AxisPosition.Bottom);
    IChartAxis valueAxis = axisFactory.CreateValueAxis(AxisPosition.Left);
    valueAxis.Crosses = AxisCrosses.AutoZero;

    IScatterChartData<double, double> data = dataFactory.CreateScatterChartData<double, double>();

    IChartDataSource<double> xs = DataSources.FromNumericCellRange(sheet, new CellRangeAddress(1, 10, 0, 0));
    IChartDataSource<double> ys = DataSources.FromNumericCellRange(sheet, new CellRangeAddress(1, 10, 1, 1));

    IScatterChartSeries<double, double> series = data.AddSeries(xs, ys);
    series.SetTitle("Sample Series");

    chart.Plot(data, categoryAxis, valueAxis);

    // 设置系列线条颜色和宽度
    var ctScatterChart = chart.GetCTChart().plotArea.scatterChart[0];
    var ctSer = ctScatterChart.ser[0];
    if(ctSer.spPr == null)
    {
        ctSer.spPr=new NPOI.OpenXmlFormats.Dml.Chart.CT_ShapeProperties();
    }
    var lineProperties = ctSer.spPr.AddNewLn();
    lineProperties.solidFill = new NPOI.OpenXmlFormats.Dml.CT_SolidColorFillProperties();
    lineProperties.solidFill.srgbClr = new NPOI.OpenXmlFormats.Dml.CT_SRgbColor() { val = new byte[] { 255, 0, 0 } }; // 红色
    lineProperties.w = (int)(12700*1.5); // 1.5磅

    // 设置标记边框和填充颜色
    var marker = ctSer.marker;
    if(marker == null)
    {
        marker = new CT_Marker();
        ctSer.marker=marker;
    }
    marker.symbol = new NPOI.OpenXmlFormats.Dml.Chart.CT_MarkerStyle() { val = NPOI.OpenXmlFormats.Dml.Chart.ST_MarkerStyle.circle };
    marker.size = new CT_MarkerSize { val = 5 };
    marker.spPr = new NPOI.OpenXmlFormats.Dml.Chart.CT_ShapeProperties();
    marker.spPr.ln = new NPOI.OpenXmlFormats.Dml.CT_LineProperties();
    marker.spPr.ln.solidFill = new NPOI.OpenXmlFormats.Dml.CT_SolidColorFillProperties();
    marker.spPr.ln.solidFill.srgbClr = new NPOI.OpenXmlFormats.Dml.CT_SRgbColor() { val = new byte[] { 0, 255, 0 } }; // 绿色
    marker.spPr.solidFill = new NPOI.OpenXmlFormats.Dml.CT_SolidColorFillProperties();
    marker.spPr.solidFill.srgbClr = new NPOI.OpenXmlFormats.Dml.CT_SRgbColor() { val = new byte[] { 0, 0, 255 } }; // 蓝色

    using (var fs = new FileStream("chart.xlsx", FileMode.Create, FileAccess.Write))
    {
        workbook.Write(fs);
    }

}

易错点:

  1. 如果按照Apache POI的用法,修改图表中的线条样式的逻辑大致应该按照下面的逻辑,但是NPOI(目前最新版本2.7.4)尚未实现Apache POI中的XDDFChart,因此不能直接使用下面的代码:
XDDFChart xddfChart = chart.GetCTChart();
XDDFLineChartData lineChartData = (XDDFLineChartData)xddfChart.GetChartSeries()[0];
XDDFLineChartData.Series lineSeries = (XDDFLineChartData.Series)lineChartData.GetSeries()[0];

XDDFSolidFillProperties fill = new XDDFSolidFillProperties(XDDFColor.From(PresetColor.ORANGE));
XDDFLineProperties lineProperties = new XDDFLineProperties();
lineProperties.SetFillProperties(fill);

lineSeries.SetShapeProperties(new XDDFShapeProperties(lineProperties));
  1. 在NPOI中设置系列线条宽度时,单位为点,12700点和Excel中的1磅宽度大致相同。因此需要使用下面的代码设置
lineProperties.w = (int)(12700 * 1.5); // 1.5磅
  1. 颜色目前支持rgb分量输入使用(srgbClrscrgbClr ),暂不支持直接输入System.Drawing.Color
marker.spPr.solidFill.srgbClr = new NPOI.OpenXmlFormats.Dml.CT_SRgbColor() { val = new byte[] { 0, 0, 255 } }; // 蓝色

标签:Dml,Chart,NPOI,OpenXmlFormats,marker,new,心得,CT
From: https://www.cnblogs.com/yilong-blog/p/18572615

相关文章

  • 【数据可视化入门】Python散点图全攻略:Matplotlib、Seaborn、Pyecharts实战代码大公开
    数据可视化入门-系列文章目录Python散点图全攻略:Matplotlib、Seaborn、Pyecharts实战代码大公开!文章目录数据可视化入门-系列文章目录Python散点图全攻略:Matplotlib、Seaborn、Pyecharts实战代码大公开!前言1.Matplotlib:基础绘图库2.Seaborn:基于Matplotlib的高级绘......
  • echarts有数据展示,没有数据则清空数据-集团平台
    一、需求如果有数据则根据数据进行柱状图的展示,如果没有数据则清空if(this.chart){this.chart.dispose()this.chart=null}1、获得接口返回的对象长度letorgList=[]this.$store.getters.orgList.forEach(r=>{if(r.isStati......
  • 最全ECharts 实战大全(速记版+资源)
    hello,大家好,我是程序员海军,公众号已经快一年多没更新了,没更新的这段时间,我去哪了呢。这两年经历了很多事情,主要情感上占据大部分时间,从失恋-谈对象-再失恋。言归正传,近期我负责的公司人力资源系统中,薪酬统计模块的开发进度正稳步推进。在此过程中,我发现需要展示多种图表(如......
  • 使用 Vue 2 和 ECharts 构建 3D 柱状图
    使用Vue2和ECharts构建3D柱状图在现代前端开发中,Vue.js是一个非常流行的框架,它提供了强大的响应式数据绑定和组件化开发,使得前端开发更加灵活高效。而ECharts是一个开源的可视化图表库,具有强大的功能支持,能够轻松生成交互式和美观的数据可视化图表。结合Vue和......
  • echart 双坐标 柱状图-折线图
    <!DOCTYPEhtml><html><head><metacharset="utf-8"><title>ECharts</title><!--引入echarts.js--><scriptsrc="./echarts.min.js"></script></head><bodyst......
  • C#Npoi实现DataTable数据导出到Excel支持多表头
    至于Npoi的引用就省略了1.相关类的代码usingSystem;usingSystem.Collections.Generic;usingSystem.Data;usingSystem.IO;usingSystem.Linq;usingNPOI.SS.UserModel;usingNPOI.XSSF.UserModel;usingNPOI.HSSF.UserModel;usingNPOI.SS.Util;///<summary>//......
  • python+Django+MySQL+echarts+bootstrap制作的教学质量评价系统,包括学生、老师、管理
    项目介绍该教学质量评价系统基于Python、Django、MySQL、ECharts和Bootstrap技术,旨在为学校或教育机构提供一个全面的教学质量评估平台。系统主要包括三种角色:学生、老师和管理员,每个角色有不同的功能权限。学生角色:学生可以通过该平台对所选课程进行评价,评价内容包括老师的......
  • Echarts实现数据可视化教程(超详细)
    ECharts是一个由百度开源的纯JavaScript图表库,它提供了丰富多样的数据可视化图表和组件,支持各种图表的任意组合。以下是ECharts的主要特点和优势,以及它的发展历程和社区支持情况的简述:ECharts的主要特点和优势开源免费:ECharts是开源免费的,用户可以免费使用而不需要缴......
  • 图表全能王(ChartStudio) - 终极图表制作工具
    在如今数据驱动的时代,能够快速、准确地将数据可视化已成为个人和企业的一项必备技能。图表全能王(ChartStudio)是一款强大的图表制作工具,不仅支持丰富的图表类型,还能够帮助用户以极简的操作轻松创建专业级别的可视化效果。下载地址立即下载ChartStudio:https://apps.appl......
  • 大一机械学生自学C语言50天的历程与心得
    1、迷茫自高考结束后 直到填报志愿前我都没有找到我感兴趣的专业方向 看到身边的朋友学医学机械学生物学计算机学数学甚至是生物化学 大部分都是在高中时就展现出一定的兴趣报志愿果断填报而我为了好的就业就只好志愿全填工科类专业  也如愿以偿的被录取到......