将DataTable中的数据保存到Excel (二) 使用NPOI

news2024/10/5 13:52:13

文章目录

      • 背景
      • 1 NPOI 简介
      • 2 使用NPOI
        • 2.1 创建一个简单的工作簿
        • 2.2 简单的读取内容
        • 2.3 将DataTable数据导出到Excel(NPOI)
        • 2.4 Excel(NPOI)导入到DataTable
      • 3 NPOI 总结

背景

前面写过一篇DataTable导出到Excel的文章,使用的是Office COM组件进行导入导出,用户体验感有点差,对环境依赖性太强(比如“检索COM类工厂…”错误),且需要通过Marshal.ReleaseComObject方法释放资源,但依然避免不了性能差。

之后一直寻找新的方法,发现了NPOI,一个干净又强大且免费使用的开源控件。

1 NPOI 简介

NPOI是一个开源的.NET组件,可以读写Excel文件,支持Office97-2007格式,功能强大。且不需要安装Microsoft Ofifce.

主要优势:
1 免费使用,不涉及任何版权问题
2 支持对标准Excel的读写(单元格格式、数据格式、公式等等)
3 基于.net 2.0 也支持xlsx 和docx格式(当然更高框架的4.0也支持)
4 比起使用Office 的API更加方便,更人性化,易于上手
5 性能优异(相对于前面的方法)

GitHub开源地址: https://github.com/nissl-lab/npoi
使用案例(Demo)地址: https://github.com/nissl-lab/npoi-examples

2 使用NPOI

在这里插入图片描述
可以通过Nuget安装包管理下载安装。

文章目前用的是NPOI的最新版本2.0.6.0 ,使用到的程序集有 NPOI.dllNPOI.OOXML.dllNPOI.OpenXmlFormats.dll直接添加到项目引用即可。

最常用的对象主要位于NPOI.HSSF.UserMode空间下,主要有以下对象,对应的接口位于NPOI.SS.UserMode空间下

HSSF对象SS接口描述
HSSFWorkbookIWorkbookExcel文件
HSSFSheetISheet工作表
HSSFRowIRow
HSSFCellICell

2.1 创建一个简单的工作簿

创建一个Workbook对象,添加一个工作表,在工作表中添加行和列,并设置单元格的内容。

using System.IO;

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
 void CreateSheet()
        {
            //创建workbook对象
            IWorkbook workbook = new HSSFWorkbook();
            //创建工作表
            ISheet sheet = workbook.CreateSheet("testSheet1");
            workbook.CreateSheet("testSheet2");
            workbook.CreateSheet("testSheet3");
            //在工作表1中添加行
            IRow row = sheet.CreateRow(0);
            sheet.CreateRow(1);
            //在行中添加一列
            ICell cell = row.CreateCell(0);
            //设置单元格的内容
            cell.SetCellValue("Hello Test");
            //继续添加列
            cell = row.CreateCell(1);
            //设置单元格的内容
            cell.SetCellValue("HHH");
            //写入文件中
            FileStream file = new FileStream(@"test.xls", FileMode.Create);
            workbook.Write(file);
            file.Close();
        }

效果图如下:
在这里插入图片描述

2.2 简单的读取内容

使用FileStream读取上一小节生成的Excel的内容

  void ReadExcel()
        {
            //文件路径
            string path = @"test.xls";

            //创建workbook对象
            IWorkbook workBook = null;

            using(FileStream fs = File.OpenRead(path))
            {//文件流读取
               
                workBook = new HSSFWorkbook(fs);

                //读取工作簿
                ISheet sheet = workBook.GetSheetAt(0);
                if(sheet == null)
                {
                    return;
                }

                //读取行
                IRow row = sheet.GetRow(0);
                if(row == null)
                {
                    return;
                }

                //获取单元格
                ICell cell = row.GetCell(0);
                if(cell == null)
                {
                    return;
                }

                //获取单元格内容
                string value = cell.ToString();
                //打印测试一下读取到的值
                Console.WriteLine(value);

                cell = row.GetCell(1);
                if (cell == null)
                {
                    return;
                }

                //获取单元格内容
                 value = cell.ToString();
                //打印测试一下读取到的值
                Console.WriteLine(value);
            }
        }

效果图

在这里插入图片描述

2.3 将DataTable数据导出到Excel(NPOI)

将DataTable中的数据导出到本地,使用Excel保存。

     private DataTable dataTable;

        /// <summary>
        /// 初始化DataTable数据
        /// </summary>
        private void InitTable()
        {
            dataTable = new DataTable();
            dataTable.Columns.Add("姓名", typeof(string));
            dataTable.Columns.Add("年龄", typeof(string));
            dataTable.Columns.Add("城市", typeof(string));

            List<string> citys = new List<string>
           {
              "广州","深圳","佛山","东莞","中山", 
               "珠海","江门","肇庆","惠州"
           };

            Random random = new Random();

            for(int i=0; i<500; i++)
            {
                DataRow row = dataTable.NewRow();
                //姓名
                row[0] = "小" + i.ToString("d3");
                //年龄
                row[1] = random.Next(18, 36).ToString();
                //城市
                row[2] = citys[i % 9];

                dataTable.Rows.Add(row);
            }
        }


        /// <summary>
        /// DataTable导出到Excel
        /// </summary>
        void DataTableToExcel()
        {
            //初始化DataTable的数据
            InitTable();

            //创建工作簿对象
            IWorkbook workBook = new HSSFWorkbook();

            //创建一个sheet
            ISheet sheet = workBook.CreateSheet("DataTable");

            //创建标题行
            IRow headerRow = sheet.CreateRow(0);
            ICell cell;
            for(int i=0; i<dataTable.Columns.Count; i++)
            {
                cell = headerRow.CreateCell(i);
                cell.SetCellValue(dataTable.Columns[i].Caption);
            }
           
            //将内容写入
            for(int i=0; i<dataTable.Rows.Count; i++)
            {
                //创建新行
                headerRow = sheet.CreateRow(i + 1);

                for (int j = 0; j < dataTable.Columns.Count; j++)
                {
                    //创建单元格并设置内容
                    cell = headerRow.CreateCell(j);
                    cell.SetCellValue(dataTable.Rows[i][j].ToString());
                }
            }
            

            //写入文件
            using(FileStream fs = File.OpenWrite(@"DataTable.xls"))
            {
                workBook.Write(fs);
                fs.Close();
            }

        }

效果图:导出速度还是很快的
在这里插入图片描述

2.4 Excel(NPOI)导入到DataTable

读取Excel数据,并存到DataTable中


        /// <summary>
        /// 读取Excel数据,存储到DataTable
        /// </summary>
        DataTable ExcelToDataTable()
        {
           // 初始化DataTable
            DataTable table = new DataTable();
           
            string path = @"DataTable.xls";
            using(FileStream fs = File.OpenRead(path))
            {
                //获取文件
                IWorkbook workBook = new HSSFWorkbook(fs);
                if(workBook == null)
                {
                    return table;
                }

                //获取Sheet
                ISheet sheet = workBook.GetSheetAt(0);
                if (sheet == null)
                {
                    return table;
                }

                //获取标题行
                IRow headerRow = sheet.GetRow(0);
                if(headerRow == null)
                {
                    return table;
                }
                //获取列和行的数量
                int cellCount = headerRow.LastCellNum;
                int rowCount = sheet.LastRowNum;

                for(int i=headerRow.FirstCellNum; i < cellCount; i++)
                {//设置列标题
                    DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
                    table.Columns.Add(column);
                }

                for(int i= (sheet.FirstRowNum + 1); i<=rowCount; i++)
                {//行
                    DataRow dataRow = table.NewRow();
                    IRow row = sheet.GetRow(i);
                    
                    if(row == null)
                    {
                        continue;
                    }

                    for(int j= row.FirstCellNum; j < cellCount; j++)
                    {//列
                        if(row.GetCell(j) != null)
                        {

                            dataRow[j] = row.GetCell(j).ToString();
                        }
                    }
                    //将行添加到DataTable
                    table.Rows.Add(dataRow);
                }
                
            }

            //Console.WriteLine(table.Rows[0][0].ToString());
            //Console.WriteLine(table.Rows[0][1].ToString());
            //Console.WriteLine(table.Rows[0][2].ToString());
            return table;

        }

效果图:验证一下,存入Table中的数据是对的
在这里插入图片描述

3 NPOI 总结

1 开发中主要用到的对象是在 NPOI.HSSF.UserMode命名空间下

2 对应的接口位于 NPOI.SS.UserMode命名空间下

3 主要对象 HSSFWorkbook(IWorkbook)、 HSSFSheet(ISheet) 、 HSSFRow (IRow)、HSSFCell (ICell)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/443953.html

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

相关文章

第五章 法律规范

目录 第一节 法律规则 一、法律规范与法律规则的概念辨析二、法律规则的逻辑结构 &#xff08;一&#xff09;假定&#xff1a;&#xff08;二&#xff09;行为模式&#xff1a;&#xff08;三&#xff09;法律后果&#xff1a; 三、法律规则与法律条文的关系 &#xff08;想法…

【vue2】使用vue-admin-template动态添加路由的思路/addRoutes的使用

&#x1f609;博主&#xff1a;初映CY的前说(前端领域) ,&#x1f4d2;本文核心&#xff1a;用原生js实现省市区联动 【前言】在通用的后台管理项目的开发中&#xff0c;不仅仅是会涉及到对表单数据等的增删改查操作还会涉及到一些关于权限管理的问题。我们将基于一个RBAC的思维…

FPGA设计实战演练.高级技巧篇-----读书笔记

第一章 从PCB开始研究FPGA设计问题 一、PCB布线 1、要求 对所有器件进行电源滤波&#xff0c;均匀分配电源&#xff0c;降低系统噪声。 匹配信号线&#xff0c;减小信号反射。 降低并行走线之间的串扰。 减小地反弹效应。 进行阻抗匹配。 2、微带传输布局&#xff0c;走…

全景丨0基础学习VR全景制作,平台篇第六章:全局功能-开场提示

大家好欢迎观看蛙色平台使用教程 编辑器功能位置 1、功能说明 开场提示是指VR漫游作品加载好以后&#xff0c;进入到全景里面时&#xff0c;优先展示的图像。 PC端/移动端&#xff0c;均可设置起到指引用户的作用。 2、功能要用在哪&#xff1f; &#xff08;1&#xff09;场…

无人机影像处理流程

无人机由于其方便快捷&#xff0c;精度高等特点已经广泛应用于农田尺度的作物生长监测。尤其是近年来大疆推出了两个多光谱无人机&#xff0c;价格也相较便宜。但目前无人机的使用实际上需要进一步处理才能获取得到农田的基本信息&#xff0c;主要包括影像的校正和图像拼接&…

FME教程:GIS建筑面转CAD格式JMD,还原房屋建筑结构、层数、地物样式,shp转CAD,GIS转dwg

GIS数据转CAD数据&#xff0c;是经常遇到的需求&#xff0c;但是CAD数据形式与GIS相差甚远&#xff0c;因此GIS转CAD后&#xff0c;要还原图形样式和地物属性便成为了一个难点。 今天介绍使用FME进行shp格式房屋面数据转dwg格式的JMD图层的方法。实现房屋的地物样式、结构、层…

Android studio Activity启动模式

1.四种启动模式&#xff1a; 1&#xff09;.standard&#xff08;标准模式&#xff09; 特点&#xff1a;1.Activity的默认启动模式 2.每启动一个Activity就会在栈顶创建一个新的实例。例如&#xff1a;闹钟程序 缺点&#xff1a;当Activity已经位于栈顶时…

C#模拟实现输出进销存管理系统中的每月销售明细(实验五)

实验五&#xff1a;模拟实现输出进销存管理系统中的每月销售明细 任务要求&#xff1a; 运行程序&#xff0c;输入要查询的月份&#xff0c;如果输入的月份正确&#xff0c;则显示本月商品销售明细&#xff1b;如果输入的月份不存在&#xff0c;则提示“该月没有销售数据或者…

什么是企业数智化的创新加速器?

数智商业创新&#xff0c;使得企业的发展模式有了一个更大的跃升。在数智化转型热潮中&#xff0c;打造数据驱动的智慧企业&#xff0c;实现商业创新与转型升级&#xff0c;构建企业新的竞争优势成为这一阶段企业管理者的核心诉求。围绕这一核心诉求&#xff0c;企业关键要考虑…

javascript通过canvas实现不同时区的时钟绘制

这里使用Javascript的class和canvas技术实现时钟的绘制&#xff0c;并且通过类实例来实现不同时区的时间显示&#xff0c;增强复用性。 如下图&#xff1a; 一、基本知识 在绘制前&#xff0c;我们先熟悉下本次使用到的Canvas相关基础知识&#xff0c;以便后面更好理解并使用。…

Bill Gates 和 Linus Torvalds 同时推崇的编程语言,不可复制的经典

1 缘起 “我们为什么没有这样的东西&#xff1f;&#xff01;” -- Bill Gates 1988年春天&#xff0c;Alan Copper坐在微软的大会议室中&#xff0c;给Bill Gates和微软的十几名员工做了一次著名的演示。 这是个叫做Tripod的开发工具&#xff0c;控制面板上面是一些按钮&…

电视剧是大众文化娱乐的载体,情感、喜剧、悬疑,你钟爱哪种题材?

电视剧作为一种重要的文化娱乐产品&#xff0c;一直以来都受到了人们的热爱和关注。它们通过故事情节、角色塑造、美术设计等方面的表现&#xff0c;向观众展现了生活中的各种情感和经历&#xff0c;同时也传递了一些价值观和思想观念 做为低成本的的娱乐方式&#xff0c;能够为…

1. 数据结构与算法概述

1. 数据结构与算法概述 1.1 什么是数据结构&#xff1f; 官方解释&#xff1a; 数据结构是一门研究非数值计算的程序设计问题中的操作对象&#xff0c;以及他们之间的关系和操作等相关问题的学科。 大白话&#xff1a; 数据结构就是把数据元素按照一定的关系组织起来的集合…

讲真的,我哭死,搞了一个画图软件

文章目录 &#x1f475;回来咯&#x1f474;一起画图吧&#x1f471;画图软件&#x1f47c;项目地址 专栏Python零基础入门篇&#x1f525;Python网络蜘蛛&#x1f525;Python数据分析Django基础入门宝典&#x1f525;小玩意儿&#x1f525;Web前端学习tkinter学习笔记Excel自动…

数据结构——堆和优先队列

文章目录 前言堆堆的引入堆的定义堆的储存结构 优先队列优先队列简介优先队列的基础操作入队出队 优先队列的实现 堆的应用堆排序TOP-K问题什么是TOP-K问题TOP-K问题的排序解法TOP-K问题的堆解法 总结 前言 堆是一个比较基础&#xff0c;且实现起来难度也不算太大的一个数据结…

高性能RPC框架:TARS简介、设计思想、架构、特性学习

文章目录 一、TARS简介二、设计思想三、整体架构3.1 架构拓扑3.2 服务交互流程3.3 Web管理系统3.4 服务结构 四、Tars特性4.1 Tars协议4.2 调用方式4.3 负载均衡4.4 容错保护4.5 过载保护4.6 消息染色4.7 IDC分组4.8 SET分组4.9 数据监控4.10 集中配置 声明&#xff1a;以下内容…

文心一言 vs GPT-4 —— 全面横向比较

文心一言 vs GPT-4 —— 全面横向比较 3月15日凌晨&#xff0c;OpenAI发布“迄今为止功能最强大的模型”——GPT-4。我第一时间为大家奉上了体验报告《OpenAI 发布GPT-4——全网抢先体验》。 时隔一日&#xff0c;3月16日下午百度发布大语言模型——文心一言。发布会上&#…

开放式蓝牙耳机推荐,列举出几款值得入手的开放式蓝牙耳机

随着耳机市场的发展&#xff0c;骨传导耳机的出现也逐渐受到了市场的认可&#xff0c;骨传导耳机&#xff0c;是通过颅骨来进行声音传导的一种耳机。与传统的入耳式耳机不同&#xff0c;骨传导耳机不需要将耳朵堵上&#xff0c;而是通过颅骨震动将声音传到内耳&#xff0c;所以…

IDEA快速部署Spring Boot 项目到Docker

IDEA快速部署Spring Boot 项目到Docker 文章目录 IDEA快速部署Spring Boot 项目到Docker一、IDEA 连接 Docker自己的虚拟机远程服务器 二、Maven插件与Dockerfiledocker-maven-pluginDockerfile 三、项目打包上传镜像四、容器的创建与运行容器的创建环境的检查访问项目检验 一、…

4月18日第壹简报,星期二,农历闰二月廿八

4月18日第壹简报&#xff0c;星期二&#xff0c;农历闰二月廿八坚持阅读&#xff0c;静待花开1. 《中国卫生健康发展评价报告&#xff08;2022&#xff09;》蓝皮书发布&#xff0c;排名前十依次为&#xff1a;北京、深圳、杭州、上海、青岛、武汉、昆明、广州、厦门和宁波。2.…