C# NPOI导出dataset----Excel绘制Chart图表

news/2024/7/21 6:01:40 标签: c#, excel

仅限XLSX 2007以后版本(2007之前版本不支持)

1、判断文件夹是否存在,不存在则创建

            //Application.StartupPath当前项目根目录
            if (!Directory.Exists(Application.StartupPath + @"\Excel"))
            {
                //创建文件夹
                Directory.CreateDirectory(Application.StartupPath + @"\Excel");
            }

2、安装NPOI

3、创建Excel工作簿

 string time = DateTime.Now.ToString("yyyyMMddHHmmss"); 

 IWorkbook workbook = new XSSFWorkbook();//创建工作簿
 ISheet sheet1 = null;//表实例
 string path = Application.StartupPath + @"\Excel\分析文件" + time + ".xlsx";//保存路径

4、循环导出Dataset将每个datatable创建新的sheet页


                int count = ds.Tables.Count;
                DataTable dt = null;
                for (int s = 0; s < count; s++)
                {
                    dt = ds.Tables[s];
                    //创建新的sheet
                    sheet1 = workbook.CreateSheet(dt.TableName);

                    //将DataSet导出为Excel
                    if (dt != null && dt.Rows.Count > 0)
                    {
                        int rowCount = dt.Rows.Count;//行数
                        int columnCount = dt.Columns.Count;//列数

                        //设置列头
                        IRow row = sheet1.CreateRow(0);//excel第一行设为列头
                        for (int c = 0; c < columnCount; c++)
                        {
                            ICell cell = row.CreateCell(c);
                            cell.SetCellValue(dt.Columns[c].ColumnName + s);
                        }
                        //设置每行每列的单元格,
                        for (int i = 0; i < rowCount; i++)
                        {
                            row = sheet1.CreateRow(i + 1);
                            for (int j = 0; j < columnCount; j++)
                            {
                                ICell cell = row.CreateCell(j);//excel第二行开始写入数据
                                    if (dt.Rows[i][j].ToString().Length > 0)
                                    {
                                        cell.SetCellValue((double)Convert.ToDecimal((dt.Rows[i][j])));
                                    }
                                    else
                                    {
                                        cell.SetCellValue(dt.Rows[i][j].ToString());
                                    }
                            }
                        }

                        //绘制chart统计图

                        CreateChart(sheet1, rowCount, dt.TableName);

                    }
                }

 

5、向文件写入数据

                using (FileStream fs = File.Open(path, FileMode.Create, FileAccess.Write))
                {
                    workbook.Write(fs);//向打开的这个xls文件中写入数据
                    fs.Close();
                } 

 绘制折线图

static void CreateChart(ISheet sheet, int colcount, string tablename)
        {

            IDrawing drawing = sheet.CreateDrawingPatriarch();
            //锚点(第10-23列  第2-25行)
            IClientAnchor anchor = drawing.CreateAnchor(0, 0, 0, 0, 10, 2, 23, 25);
            IChart chart = drawing.CreateChart(anchor) as XSSFChart;

            chart.SetTitle("成绩统计");


            //生成图例
            var legend = chart.GetOrCreateLegend();
            //表体位置
            legend.Position = LegendPosition.Bottom;

            //图表
            var data = chart.ChartDataFactory.CreateScatterChartData<double, double>(); //散点图

            // X轴.
            var bottomAxis = chart.ChartAxisFactory.CreateCategoryAxis(AxisPosition.Bottom);
            bottomAxis.IsVisible = true; //默认为true 不显示  设置为fase 显示坐标轴

            //Y轴
            IValueAxis leftAxis = chart.ChartAxisFactory.CreateValueAxis(AxisPosition.Left);
            leftAxis.Crosses = (AxisCrosses.AutoZero);
            leftAxis.IsVisible = true; //设置显示坐标轴

            //数据源
            IChartDataSource<double> xs = DataSources.FromNumericCellRange(sheet, new CellRangeAddress(1, colcount, 0, 0));
            IChartDataSource<double> ys1 = DataSources.FromNumericCellRange(sheet, new CellRangeAddress(1, colcount, 1, 1));
            IChartDataSource<double> ys2 = DataSources.FromNumericCellRange(sheet, new CellRangeAddress(1, colcount, 2, 2));
            IChartDataSource<double> ys3 = DataSources.FromNumericCellRange(sheet, new CellRangeAddress(1, colcount, 3, 3));
            IChartDataSource<double> ys4 = DataSources.FromNumericCellRange(sheet, new CellRangeAddress(1, colcount, 4, 4));

            //数据系列
            var s1 = data.AddSeries(xs, ys1);
            s1.SetTitle("语文分数");
            var s2 = data.AddSeries(xs, ys2);
            s2.SetTitle("数学分数");
            var s3 = data.AddSeries(xs, ys3);
            s3.SetTitle("英语分数");
            chart.Plot(data, bottomAxis, leftAxis);

        }


http://www.niftyadmin.cn/n/5278219.html

相关文章

拿到服务器该做的事和升级docker engine

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginsudo -i # 切换到 root 用户apt update -y # 升级 packagesapt install wget curl sudo vim git -y # Debian 系统比较干净&#xff0c;安装常用的软件 安装docker …

form-data、x-www-form-urlencoded、raw 和 binary

在 Postman 中&#xff0c;有四种常见的请求体格式&#xff0c;分别是 form-data、x-www-form-urlencoded、raw 和 binary。它们的区别如下&#xff1a; form-data form-data 格式通常用于上传文件或二进制数据。在 Postman 中&#xff0c;你可以通过选择 Body 标签页&#x…

激活Windows过程及报错解决: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上, 运行“ slui.exe 0x2a 0x803f7001 “以显示错误文本

激活Windows过程及报错问题解决: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上&#xff0c;运行“ slui.exe 0x2a 0x803f7001 “以显示错误文本。 前言 最近在激活Windows过程中&#xff0c;遇到了报错: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上…

C++程序设计比赛常用函数总结

目录 String set map 全排列函数 queue priority_queue vector ​编辑stack 类型转换 String #include <iostream> #include<algorithm> #include<queue> #include<set> using namespace std;int main() {string str "abcde";c…

网工内推 | 上市公司,数据库运维,OCP认证优先,14薪

01 税友集团 招聘岗位&#xff1a;运维工程师 职责描述&#xff1a; 1、对税务局端的日常支持与维护&#xff0c;监控局端&#xff08;或平台&#xff09;程序、数据库、服务器运行情况&#xff1b; 2、税务局端软件测试与升级工作&#xff1b; 3、根据税务局用户的咨询以及相…

速盾网络:sdk游戏盾有什么作用?

速盾cdn是一款非常优秀的CDN加速服务&#xff0c;它能够帮助游戏开发者们提升游戏的性能和稳定性。其中&#xff0c;速盾cdn的sdk游戏盾是其一项非常实用的功能&#xff0c;它能够为游戏提供更加稳定和快速的网络连接。 首先&#xff0c;让我们来了解一下什么是sdk游戏…

MDC Manifest Configurator

基于华为手册总结摘要的&#xff0c;有分布手册没写的&#xff0c;我给补充上了&#xff0c;比如&#xff1a;定义启动设定 CM配置流程&#xff1a;配置流程涵盖定义数据类型、服务接口、子网信息、部署通信、部署通信协议、定义可执行程序和进程、定义应用进程信息、创建服务…

BigDecimal介绍

一、BigDecimal概述 Java在java.math包中提供的API类BigDecimal&#xff0c;用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数&#xff0c;但在实际应用中&#xff0c;可能需要对更大或者更小的数进行运算和处理。 一般情况下&#xff0c;对…