C#项目中操作Excel文件——使用NPOI库

简介: C#项目中操作Excel文件——使用NPOI库

实际C#项目中经常会涉及到需要对本地Excel文件进行操作,特别是一些包含数据记录、分析、汇总功能模块的项目。常用的操作Excel文件的方法主要有三个:




1. OleDb:


这种方式是把整个Excel文件当做一个数据源来进行数据的读取操作。


优点:实现方式简单,读取速度快;


缺点:读取Excel数据的过程不太灵活,对内存的占用比较高,当数据量变的很大时,容易由于内存空间不足导致内存溢出异常。(不过貌似对于今天电脑的硬件配置来说,内存问题不大)




2. Com组件


这种方式是通过Com组件 Microsoft.Office.Interop.Excel.dll实现Excel文件的操作。


优点:读取Excel数据非常灵活,可以实现Excel具有的各种数据处理功能;


缺点:对数据的访问时基于单元格方式实现的,所以读写数据较慢,特别是当数据量较大时,访问效率问题更为突出。另一点是要求本机安装了Microsoft Office组件。




3. NPOI


这种方式是通过NPOI库实现Excel文件操作,可以在没有安装微软Office的情况下使用。


优点:读取Excel数据速度较快,操作方式灵活;


缺点:试了再说!


NPOI支持的文件格式处理xls、xlsx外,还包括doc、ppt、vsd等,功能强大,人称Excel一哥。本文就准备单独谈一谈NPOI对Excel的基本操作。


NPOI是什么?



NPOI的log图标如下:


image.png


NPOI中N指代的是.Net,POI是一个完全开源的Java写成的库,能够在没有安装微软Office或者相应环境的情况下读写Excel、Word等微软OLE2组件文档,几乎支持所有的Office97~Office2007的文件格式。所以NPOI就是POI项目的.Net版本。目前NPOI的最新版本是今年5月份发布的V2.2.1,包含了.Net Framework2和.Net Framework4两个版本。




各个版本.Net Framework对应信息如下:


image.png


可以在C盘——C:\Windows\Microsoft.NET\Framework 下查看本机已经安装的.Net Framework版本,在我的机器上安装了以下版本:


image.png

NPOI库下载、解压

NPOI官网下载地址:点击打开链接,打开之后,点击红色框里的“NPOI 2.2.1 package”即可下载:

image.png

下载完成的压缩包大小只有3.5MB,解压后可以看到主要文件其实就是5个Dll文件(.Net 2.0和.Net 4.0):


image.png


使用的时候只要在自己的C#项目中添加这几个动态库文件的引用就可以了。


在C#工程中添加NPOI动态库引用


新建Visual Studio C# 控制台应用程序(或Windows窗体应用程序、WPF应用程序等均可),在解决方案管理器里项目下的“引用”上右击“添加引用”:


image.png

在弹出的“引用管理器”对话框中单击“浏览(B)”,选择NPOI所在的文件夹,根据机器上.Net Framework版本,选择Net20或Net40下的动态库。


image.png

添加完成之后展开项目下的“引用”项,可以看到刚才所添加的动态库。


经过简单的“添加引用”之后就可以在自己的代码中使用NPOI提供的接口实现各种Excel操作了。






Excel工作簿、工作表、xls、xlsx概念



在用NPOI编码之前,简单明确一下Excel中工作簿、工作表、xls、xlsx的概念,行、列、单元格等很明了的概念就不啰嗦了。




1. 每一个Excel文件都可以看做是一个工作簿,当打开一个Excel文件时,就等于打开了一个Excel工作簿。




2. 当打开了excel工作簿后在窗口底部看到的“Sheet”标签标示的是工作表,有几个标签就表示有几个工作表。


   简单做一个类比,一个Excel文件即一个工作簿可以看做一本书,一个工作表即一个Sheet页面是书内的一页,可以     有很多页。Excel2003最多可以添加255(有强迫症的程序猿最爱的数字之一)个,Excel2007随意加。




3. xls是Office 2003以及之前版本Excel的扩展名,xlsx是Office 2007及之后版本Excel所用的扩展名。xlsx用新的基于     XML的压缩文件格式取代了之前的默认文件格式,在传统的文件名后面添加了字面x(即.docx取代.doc、.xlsx取         代.xls,等等),使其占用的空间更小。xlsx向下兼容xls。



新建一个Excel工作表



除添加Dll文件的引用外,还需要添加名称空间:

[cpp]  view plain  copy
 print ?
using NPOI.SS.UserModel;  
using NPOI.HSSF.UserModel;  
using NPOI.XSSF.UserModel;



HSSF使用于2007之前的xls版本,XSSF适用于2007及其之后的xlsx版本。


以下程序新建一个Excel 2003 xls和一个2007 xlsx文件,跟用Office建立的标准Excel格式一样,每一个Excel文件初始包含了3个工作表。


[csharp]  view plain  copy
 print ?
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
using NPOI.SS.UserModel;  
using NPOI.HSSF.UserModel;  
using NPOI.XSSF.UserModel;  
using System.IO;  
namespace Excel_NPOI  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            HSSFWorkbook workbook2003 = new HSSFWorkbook(); //新建xls工作簿  
            workbook2003.CreateSheet("Sheet1");  //新建3个Sheet工作表  
            workbook2003.CreateSheet("Sheet2");  
            workbook2003.CreateSheet("Sheet3");  
            FileStream file2003 = new FileStream(@"E:\Excel2003.xls", FileMode.Create);  
            workbook2003.Write(file2003);  
            file2003.Close();  //关闭文件流  
            workbook2003.Close();  
            XSSFWorkbook workbook2007 = new XSSFWorkbook();  //新建xlsx工作簿  
            workbook2007.CreateSheet("Sheet1");  
            workbook2007.CreateSheet("Sheet2");  
            workbook2007.CreateSheet("Sheet3");  
            FileStream file2007 = new FileStream(@"E:\Excel2007.xlsx", FileMode.Create);  
            workbook2007.Write(file2007);  
            file2007.Close();  
            workbook2007.Close();  
        }  
    }  
}


运行之后会在E盘根目录下生成Excel2003.xls和Excel2007.xlsx两个文件。




写入Excel文件数据




以xls文件为例,介绍把数据写入Excel文件的方法。


写数据要遵循一定的顺序,可以概括为:读取(或新建一个工作簿)->获取工作表->对工作表添加行->对每一行添加单元格->对单元格赋值;


[csharp]  view plain  copy
 print ?
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
using NPOI.SS.UserModel;  
using NPOI.HSSF.UserModel;  
using NPOI.XSSF.UserModel;  
using System.IO;  
namespace Excel_NPOI  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            HSSFWorkbook workbook2003 = new HSSFWorkbook(); //新建工作簿  
            workbook2003.CreateSheet("Sheet1");  //新建1个Sheet工作表              
            HSSFSheet SheetOne = (HSSFSheet)workbook2003.GetSheet("Sheet1"); //获取名称为Sheet1的工作表  
            //对工作表先添加行,下标从0开始  
            for (int i = 0; i < 10; i++)  
            {  
                SheetOne.CreateRow(i);   //创建10行  
            }  
            //对每一行创建10个单元格  
            HSSFRow SheetRow = (HSSFRow)SheetOne.GetRow(0);  //获取Sheet1工作表的首行  
            HSSFCell[] SheetCell = new HSSFCell[10];  
            for (int i = 0; i < 10; i++)  
            {  
                SheetCell[i] = (HSSFCell)SheetRow.CreateCell(i);  //为第一行创建10个单元格  
            }  
            //创建之后就可以赋值了  
            SheetCell[0].SetCellValue(true); //赋值为bool型           
            SheetCell[1].SetCellValue(0.000001); //赋值为浮点型  
            SheetCell[2].SetCellValue("Excel2003"); //赋值为字符串  
            SheetCell[3].SetCellValue("123456789987654321");//赋值为长字符串  
            for (int i = 4; i < 10; i++)  
            {  
                SheetCell[i].SetCellValue(i);    //循环赋值为整形  
            }  
            FileStream file2003 = new FileStream(@"E:\Excel2003.xls", FileMode.Create);  
            workbook2003.Write(file2003);  
            file2003.Close();  
            workbook2003.Close();              
        }  
    }  
}


运行之后在生成的Exce2003.xls中的内容为:


image.png

读取Excel文件数据


HSSFWorkbook类和XSSFWorkbook类都继承自IWorkbook类,所以在不知道所要读取的Excel文件时xls还是xlsx时,可以使用IWorkbook来声明一个通用的工作簿变量,随后根据传入的文件名判断是xls还是xlsx。


[csharp]  view plain  copy
 print ?
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
using NPOI.SS.UserModel;  
using NPOI.HSSF.UserModel;  
using NPOI.XSSF.UserModel;  
using System.IO;  
namespace Excel_NPOI  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            IWorkbook workbook = null;  //新建IWorkbook对象  
            string fileName = "E:\\Excel2003.xls";  
            FileStream fileStream = new FileStream(@"E:\Excel2003.xls", FileMode.Open, FileAccess.Read);  
            if (fileName.IndexOf(".xlsx") > 0) // 2007版本  
            {  
                workbook = new XSSFWorkbook(fileStream);  //xlsx数据读入workbook  
            }  
            else if (fileName.IndexOf(".xls") > 0) // 2003版本  
            {  
                workbook = new HSSFWorkbook(fileStream);  //xls数据读入workbook  
            }  
            ISheet sheet = workbook.GetSheetAt(0);  //获取第一个工作表  
            IRow row;// = sheet.GetRow(0);            //新建当前工作表行数据  
            for (int i = 0; i < sheet.LastRowNum; i++)  //对工作表每一行  
            {  
                row = sheet.GetRow(i);   //row读入第i行数据  
                if (row != null)  
                {  
                    for (int j = 0; j < row.LastCellNum; j++)  //对工作表每一列  
                    {  
                        string cellValue = row.GetCell(j).ToString(); //获取i行j列数据  
                        Console.WriteLine(cellValue);  
                    }  
                }  
            }  
            Console.ReadLine();  
            fileStream.Close();  
            workbook.Close();  
        }  
    }  
}



这段代码实现读取一个Excel文件内第一个工作表中的所有单元格内容,并打印输出。


取在上段代码中生成的xml文件作为输入,运行结果为:


image.png


相关文章
|
29天前
|
Python
使用OpenPyXL库实现Excel单元格其他对齐方式设置
本文介绍了如何使用Python的`openpyxl`库设置Excel单元格中的文本对齐方式,包括文本旋转、换行、自动调整大小和缩进等,通过具体示例代码展示了每种对齐方式的应用方法,适合需要频繁操作Excel文件的用户学习参考。
158 85
使用OpenPyXL库实现Excel单元格其他对齐方式设置
|
8天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
63 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
1月前
|
Python
按条件将Excel文件拆分到不同的工作表
使用Python的pandas库,可以轻松将Excel文件按条件拆分到不同的工作表中。本文通过一个示例代码展示了如何生成一个包含总成绩表和三个班级表的Excel文件。代码首先创建了一个包含学生姓名、班级和各科成绩的数据框,然后按班级分组,将每个班级的数据分别写入不同的工作表。最后,生成的Excel文件将包含四个工作表,分别为总成绩表和三个班级的成绩表。
34 6
按条件将Excel文件拆分到不同的工作表
|
1月前
|
Python
批量将不同的工作簿合并到同一个Excel文件
本文介绍如何使用Python的`pandas`库批量合并不同工作簿至同一Excel文件。通过模拟生成三个班级的成绩数据,分别保存为Excel文件,再将这些文件合并成一个包含所有班级成绩的总成绩单。步骤包括安装必要库、生成数据、保存与合并工作簿。
46 6
|
1月前
|
Python
按条件将Excel文件拆分到不同的工作表
使用Python的pandas库,可以轻松将Excel文件按条件拆分为多个工作表。本文通过一个具体示例,展示了如何根据学生班级将成绩数据拆分到不同的工作表中,并生成一个包含总成绩表和各班级成绩表的Excel文件。代码简洁明了,适合初学者学习和应用。
41 6
|
2月前
|
前端开发
实现Excel文件和其他文件导出为压缩包,并导入
实现Excel文件和其他文件导出为压缩包,并导入
37 1
|
2月前
|
数据格式 UED
记录一次NPOI库导出Excel遇到的小问题解决方案
【11月更文挑战第16天】本文记录了使用 NPOI 库导出 Excel 过程中遇到的三个主要问题及其解决方案:单元格数据格式错误、日期格式不正确以及合并单元格边框缺失。通过自定义单元格样式、设置数据格式和手动添加边框,有效解决了这些问题,提升了导出文件的质量和用户体验。
231 3
|
2月前
|
Java BI API
Java Excel报表生成:JXLS库的高效应用
在Java应用开发中,经常需要将数据导出到Excel文件中,以便于数据的分析和共享。JXLS库是一个强大的工具,它基于Apache POI,提供了一种简单而高效的方式来生成Excel报表。本文将详细介绍JXLS库的使用方法和技巧,帮助你快速掌握Java中的Excel导出功能。
77 6
|
2月前
|
开发框架 网络协议 .NET
C#/.NET/.NET Core优秀项目和框架2024年10月简报
C#/.NET/.NET Core优秀项目和框架2024年10月简报
|
2月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
44 3