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

news/2024/7/21 5:04:22 标签: excel, c#, NPOI, windform

文章目录

      • 背景
      • 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,一个干净又强大且免费使用的开源控件。

NPOI__6">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

NPOI_18">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);
            }
        }

效果图

在这里插入图片描述

NPOI_131">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();
            }

        }

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

NPOIDataTable_220">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中的数据是对的
在这里插入图片描述

NPOI__301">3 NPOI 总结

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

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

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


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

相关文章

IPSCE

文章目录 1.什么是数据认证&#xff0c;有什么作用&#xff0c;有哪些实现的技术手段?2.什么是身份认证&#xff0c;有什么作用&#xff0c;有哪些实现的技术手段?3.什么VPN技术?4.VPN技术有哪些分类?5.IPSEC技术能够提供哪些安全服务?6.IPSEC的技术架构是什么?7.AH与ESP…

Linux环境下 通过V4L2读取视频+UDP发送图片文件

该图为整个项目的流程图 其中左边的流程为总流程&#xff0c;包括通过中断读取摄像头的帧数据&#xff0c;通过内存映射将内核态的数据映射到用户态&#xff0c;读取用户态的数据&#xff0c;采用循环发送图片数据。 右边是发送图片的流程图&#xff0c;将用户态的缓冲区的数…

腾讯安全助力高校信息安全建设,护航湾区教育高质量发展

2023年4月20日-21日&#xff0c;首届大湾区信息网络安全大会在广州市长隆国际会展中心隆重召开。会议以“同筑安全屏障&#xff0c;共赢湾区未来”为主题&#xff0c;旨在响应国家安全战略&#xff0c;推动粤港澳大湾区信息网络安全的建设和发展&#xff0c;保障经济社会稳定运…

如何构建适合自己的DevOps软件测试改进方案

根据2022年的DevOps全球调查报告显示&#xff0c;主流软件企业采用或部分采用DevOps且已获得良好成效的占比已达70%&#xff0c;DevOps俨然成为当下软件开发研究的重要方向。 测试作为软件开发的必要过程&#xff0c;是提升软件可靠性、保证软件质量的关键环节。然而&#xff…

wps - 使用宏来为每行标记序号

在WPS中遇到需要加序号的虽然可以用项目符符号来标注# 但或许用宏更厉害一些 WPS 的宏是一种自动化工具&#xff0c;可以通过编写宏代码来自动执行一些操作&#xff0c;例如创建和编辑文档、打印、格式化等。 WPS 宏的编写可以使用 VBA&#xff08;Visual Basic for Applicat…

分析 | 通过 NFTScan 率先捕获 NFT 投资趋势

NFT 市场信息高度动态且机会稍纵即逝&#xff0c;了解市场第一信息对于 NFT 的参与者来说都是至关重要的。所以市场主体参与者必须密切关注各种渠道&#xff0c;努力获取最新一手 NFT 信息&#xff0c;这对参与者抓住先机和获益至关关键&#xff0c;若信息滞后&#xff0c;容易…

设计模式(十三)之访问者模式

文章目录 什么是访问者模式例子总结 什么是访问者模式 访问者模式&#xff08;Visitor&#xff09;是一种操作一组对象的操作&#xff0c;它的目的是不改变对象的定义&#xff0c;但允许新增不同的访问者&#xff0c;来定义新的操作。 核心&#xff1a;数据结构与处理分离开来…

嵌入式Linux(3):设备驱动--杂项驱动(MISC)

文章目录 简介杂项设备的描述注册杂项设备编写一个杂项设备 简介 Linux三大设备驱动&#xff1a; 字符设备&#xff1a;IO的传输过程是以字符为单位的&#xff0c;没有缓冲。比如I2C&#xff0c;SPI都是字符设备。块设备&#xff1a;IO的传输过程是以块为单位的。跟存储相关的…