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

news2024/11/25 11:24:03

仅限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.coloradmin.cn/o/1325594.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高通平台开发系列讲解(USB篇)adb应用adbd分析

沉淀、分享、成长,让自己和他人都能有所收获!😄 在apps_proc/system/core/adb/adb_main.cpp文件中main()函数会调用adb_main()函数,然后调用uab_init函数 在uab_init()函数中,会创建一个线程,在线程中会调用init_functionfs()函数,利用ep0控制节点,创建ep1、ep2输…

Git报错x509: certificate signed by unknown authority

下载报错&#xff1a; Error downloading object: model-00001-of-00008.safetensors (ed3ac49): Smudge error: Error downloading model-00001-of-00008.safetensors (ed3ac4983f682a999b0e4b6f072aad294c4fd9a7e968e90835ba5c4b466d3c7c): LFS: Get https://cdn-lfs.huggin…

可定制化的企业电子招标采购系统源码

随着企业的快速发展&#xff0c;招采管理逐渐成为企业运营中的重要环节。为了满足公司对内部招采管理提升的要求&#xff0c;建立一个公平、公开、公正的采购环境至关重要。在这个背景下&#xff0c;我们开发了一款电子招标采购软件&#xff0c;以最大限度地控制采购成本&#…

maven限制内存使用峰值/最大内存

前言 通过设置虚拟机的内存大小&#xff0c;达到限制maven内存使用峰值的效果 方法1&#xff1a;修改mvn脚本 找到mvn脚本在MAVEN_OPTS参数值添加-Xms、-Xmx参数&#xff1a;MAVEN_OPTS"$MAVEN_OPTS -Xms512m -Xmx512m"效果图 windows系统下修改MAVEN_OPTS参数 …

31 在Vue3中如何使用slot插槽

概述 插槽在真实的开发中使用非常的多&#xff0c;比如我们去用一些第三方组件库的时候&#xff0c;通常都需要通过自定义插槽来实现内容的自定义。 在Vue3中使用插槽非常的简单。 插槽相当于在组件中给你预留一块位置&#xff0c;你可以将自己的vue3相关的代码插入到这个位…

netty源码:(29)ChannelInboundHandlerAdapter

它实现的方法都有一个ChannelHandlerContext参数&#xff0c;它的方法都是直接调用ChannelHandlerContext参数对应的方法&#xff0c;该方法会调用下一个handler对应的方法。 可以继承这个类&#xff0c;重写感兴趣的方法,比如channelRead. 这个类有个子类&#xff1a;SimpleC…

PyTorch深度学习实战(26)——卷积自编码器(Convolutional Autoencoder)

PyTorch深度学习实战&#xff08;26&#xff09;——卷积自编码器 0. 前言1. 卷积自编码器2. 使用 t-SNE 对相似图像进行分组小结系列链接 0. 前言 我们已经学习了自编码器 (AutoEncoder) 的原理&#xff0c;并使用 PyTorch 搭建了全连接自编码器&#xff0c;但我们使用的数据…

AttributeError: module ‘_winapi‘ has no attribute ‘SYNCHRONIZE‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

贪吃蛇(三)绘制蛇身

绘制蛇身的逻辑不难&#xff0c;存储上面使用结构体。 第一行和第十九行绘制--其它行&#xff0c;绘制|&#xff0c;分别在头尾处。 (1) 扫描蛇身&#xff0c;如果扫描到则绘制[]。 (2) 扫描蛇身&#xff0c;如果扫描不到则绘制空白。 #include"curses.h"struct Sn…

VS Code+MinGW 搭建Windows C++开发环境

官方文档是最香香的&#xff1a;https://code.visualstudio.com/docs/cpp/config-mingw 文章目录 1、一些非常不友好的名词1.1 什么TMD是 GNU、MinGW、GCC、gcc、g&#xff1f;1.2 MSVC 2、获取g编译器3、VS Code单文件编译和调试流程3.1 安装插件3.2 单个源文件编译运行3.3 ta…

32 在Vue3中如何同时定义多个插槽

概述 当你想要给外部预留多个位置的时候&#xff0c;具名插槽就非常有用了。 比如&#xff0c;我们定义一个卡片&#xff0c;让别人使用的时候&#xff0c;标题可以自定义&#xff0c;内容也可以自定义&#xff0c;这个时候就需要两个插槽。 基本用法 我们创建src/componen…

功能丰富的十六进制编辑器:ImHex 逆向工程得力助手 | 开源日报 No.119

WerWolv/ImHex Stars: 30.2k License: GPL-2.0 ImHex 是一个用于逆向工程师、程序员和在凌晨 3 点时还关心视网膜的人们的十六进制编辑器。该项目具有以下主要功能&#xff1a; 功能丰富的十六进制查看字节修补修补管理复制字节作为特性 (包括字节数组、16 进制字符串等)ASCI…

AI数字人盘活本地生活!

据艾瑞咨询统计&#xff0c;2022年中国本地生活服务市场规模达到3.8万亿元&#xff0c;同比增长23.5%。另据QuestMobile&#xff0c;2023年4月&#xff0c;本地生活综合服务行业全网渗透率38.4%&#xff0c;外卖服务渗透率15.6%。 本地生活市场仍具较大空间&#xff0c;各大平台…

WT588F34B-16S语音芯片:四通道16K采样率混音播放的应用优势

随着科技的不断进步&#xff0c;语音芯片在电子产品中的应用越来越广泛。其中&#xff0c;WT588F34B-16S语音芯片凭借其卓越的性能和创新的功能&#xff0c;引起了市场的广泛关注。特别是其支持四通道16K采样率混音播放的功能&#xff0c;为实际应用带来了显著的优势。本文将深…

聪明高效能力广,AGI如何赋能内容管理?

文 | 智能相对论 作者 | 叶远风 毫无疑问&#xff0c;现在的大模型在技术比拼之外&#xff0c;如何通过产品化的方式走入到实际业务&#xff0c;是各厂商的着力点。 而一些一贯与数字化场景紧密融合的服务厂商&#xff0c;在大模型浪潮一开始就已经走在落地一线。 大数据基…

Gamma分布

分布的概率密度为&#xff1a; 其中参数 分布的数学期望等于&#xff0c;方差等于。

新品|带同轴光远心镜头发布,专攻小物体高精度检测

远心镜头&#xff0c;因其高精密、低畸变的特性&#xff0c;在工业制造领域检测中有着广泛应用。但在使用远心镜头对小工件进行视觉检测的过程中&#xff0c;由于被测产品尺寸小、产品材质特性、空间限制等因素&#xff0c;往往存在以下问题: 视觉系统难部署 由于被测产品尺寸…

大华 DSS 城市安防数字监控系统 SQL 注入漏洞

漏洞简介 大华DSS数字监控系统itcBulletin接口对传入的数据没有预编译和充足的校验&#xff0c;导致该接口存在SQL注入漏洞&#xff0c;可通过注入漏洞获取数据库敏感信息。 资产测绘 app“dahua-DSS” 漏洞复现 POC: POST /portal/services/itcBulletin?wsdl HTTP/1.1 H…

生物识别规划人脸识别方案的概述

方案概述 人脸识别方案采用高性能AI芯片&#xff0c;支持RGB和IR摄像头&#xff0c; 支持LCD显示屏。方案特点 • 普通RGB摄像头和IR摄像头同时参与3D成像RGB摄像头 支持屏幕回显 • 双目摄像头得到特征点视差计算人脸相 对3D深度信息&#xff0c; 同时利用可见光和红外 光谱信…

如何做好买货查窜货这件事

窜货是大多数品牌都会遇到的渠道问题&#xff0c;店铺窜货是为了更多的利润空间&#xff0c;所以窜货还会伴随低价&#xff0c;治理窜货是品牌的义务&#xff0c;更是品牌的责任&#xff0c;品牌在管控渠道时应配合一套完整的控价流程&#xff0c;治理窜货也不例外&#xff0c;…