NPOI 2.0 使用教程详解

简介: NPOI 2.0 使用教程详解

NPOI很早就出名了,但是一直以为第三方的不可能有微软的效率高,所以一直都用COM来处理EXCEL。


直到某天处理一个大量数据的EXCEL,发现NPOI生成的数据几乎是1秒内就完成了,比传统方法快了几百倍。


惊喜万分,开始学习NPOI的使用,也希望留下一些东西供别人学习。



一:创建新EXCEL文件,用NPOI创建一个新的EXCEL文件。



下载地址就不再赘述了。


如果只是简单的处理的话,只需要引用下载压缩包里的


NPOI.dll 和 ICSharpCode.SharpZipLib.dll


两个文件而已。




好了,开始。


第一步,引用空间

[csharp]  view plain  copy  

using NPOI.HSSF.UserModel;  
using NPOI.SS.UserModel; 


第二步,创建工作簿(workbook)和sheet

[csharp]  view plain  copy

HSSFWorkbook wk = new HSSFWorkbook();  
//创建一个Sheet  
ISheet sheet = wk.CreateSheet("例子");  

第三步,创建行和单元格

[csharp]  view plain  copy 

//在第一行创建行  
IRow row = sheet.CreateRow(0);  
//在第一行的第一列创建单元格  
ICell cell = row.CreateCell(0);  

在NPOI里,IRow和ICell是表格结构里的基本元素,必须先通过Create函数创建后才能使用,不然会报错。


知识点:

  • 因为在excel里,在某个位置有没有单元格,和单元格里有没有值,这两个是分开保存的。“是否有单元格”也是需要保存的信息之一,也同样占用文件大小。单元格是一个无形的容器,必须首先有容器,才能往里头存放值。
  • 曾经见过一个错误的例子,导出的excel只有一行数据,但是文件大小超过十几MB。就是因为在导出的时候,程序员没有弄清楚单元格和值的区别,以为空单元格不占大小,把65535行的所有格子都创建了,大量的空白行导致文件很大。
  • 实际编程中请注意这一点,需要使用的行才创建,需要使用的单元格才创建。



接下来我们可以使用这个函数对单元格赋值。


[csharp]  view plain  copy 

cell.SetCellValue("测试");  

值得注意的是,SetCellValue的重载中支持

  • bool
  • DateTime
  • double
  • string
  • IRichTextString


这几种格式的参数,但是不像Excel COM一样支持object。所以赋值的时候必须先做好类型转换。


最后,将做好的这个EXCEL保存到硬盘上。


[csharp]  view plain  copy  

//打开一个xls文件,如果没有则自行创建,如果存在myxls.xls文件则在创建时不要打开该文件  
using (FileStream fs = File.OpenWrite("d:\\excel.xls"))  
{  
    wk.Write(fs);//向打开的这个xls文件中写入并保存。  
}  

这样就完成了最基本的创建,写入,保存。


二:编辑既存的EXCEL文件



在这一篇里,我们读入上一篇教程中生成的EXCEL,然后以其做为模版,修改之后保存为另一份EXCEL




第一步

[csharp]  view plain  copy

//上一篇教程中生成的文件  
string tempPath = "d:\\excel.xls";  
HSSFWorkbook wk = null;  
using (FileStream fs = File.Open(tempPath, FileMode.Open,  
FileAccess.Read, FileShare.ReadWrite))  
{  
    //把xls文件读入workbook变量里,之后就可以关闭了  
    wk = new HSSFWorkbook(fs);     
    fs.Close();  
}  


第二步


在读入之后,操作HSSFWorkbook这个类就和第一篇教程里一样了。


必须要遵循的一个规则是,如果你要编辑的行和单元格,原本没有值,或者从未创建过的,就必须先创建。


如:


我要使用第二行第一列的单元格,在上一篇教程中并未对这个位置进行创建,那么必须先创建。

[csharp]  view plain  copy 

//在第二行创建行    
IRow row = sheet.CreateRow(1);    
//在第二行的第一列创建单元格    
ICell cell = row.CreateCell(0);  

之后这个cell才能被使用。

  • 那么如果我不创建,直接使用会怎么样呢?
  • 答:sheet.GetRow(1)取回来的值为null,在null上再使用GetCell(0)就会报空对象的错误。


在上一篇教程中,我们已经对该文件的第一行第一列的这个位置创建过单元格,并且赋值,所以可以直接使用,采用下面的方式。


[csharp]  view plain  copy

//获取第一行  
IRow row = sheet.GetRow(0);    
//在第一行获取第一列单元格    
ICell cell = row.GetCell(0);  


上面两种写法也可以简写成如下的方式

[csharp]  view plain  copy

//创建第二行,第一列  
ICell cell = sheet.CreateRow(1).CreateCell(0);   
//获取第一行,第一列  
ICell cell = sheet.GetRow(0).GetCell(0);

然后使用cell.SetCellValue()函数对其赋值即完成编辑。


当然,赋值语句也可以和上述语句并作一行书写。例如

 [csharp]  view plain  copy 

sheet.GetRow(0).GetCell(0).SetCellValue("编辑的值");


第三步

编辑完之后需要保存

[csharp]  view plain  copy  

using (FileStream fileStream = File.Open("d:\\excel.xls",  
FileMode.OpenOrCreate, FileAccess.ReadWrite))  
{  
    wk.Write(fileStream);  
    fileStream.Close();  
}  


这样就完成了读入已有文件,编辑,保存。


三:EXCEL 基本格式设置之ICellStyle




前两篇,我们已经学习了如何用NPOI来创建和编辑Excel,并且已经熟悉了HSSFWorkbook,ISheet,IRow和ICell。


接下来我们把它变得漂亮一点。




ICellStyle——单元格样式


当我们拥有了一个HSSFWorkbook实例之后。我们可以通过下面的方式来创建一个样式变量。


[csharp]  view plain  copy 

HSSFWorkbook wk = new HSSFWorkbook();//你用来操作的HSSFWorkbook的实例  
ICellStyle cellStyle = wk.CreateCellStyle();  

这样我们就创建好了一个样式变量。

 

  • 注意:
  • 创建样式是基于HSSFWorkbook而不是ISheet


这个ICellStyle里有些什么属性可以设置呢?

86.14.png

没错,所有你能想到的对于单元格的格式样式的设置都在里面。种类非常多,命名也比较直白,比如:对齐方式,上下左右边框线的颜色和样式,字体等等。

写个例子给大家看看。

[csharp]  view plain  copy

ICellStyle cellStyle = wk.CreateCellStyle();  
//设置单元格上下左右边框线  
cellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;  
cellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;  
cellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;  
cellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;  
//文字水平和垂直对齐方式  
cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;  
cellStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;  
//是否换行  
//cellStyle.WrapText = true;  
//缩小字体填充  
cellStyle.ShrinkToFit = true;  


大部分的设置都有相应的枚举类型可以选择,比如这个边框样式Thin,实际上就是我们最常见的单线最细的那种边框,你也可以根据需要设置成虚线,点线,双线等等。



注意:

“是否换行”和“缩小字体填充”本身是互斥的两个设置,如果同时设为True,则只有“是否换行”会生效。



设置好了格式变量,就可以把它应用到单元格上去。通过对ICell的CellStyle赋值实现。

[csharp]  view plain  copy  

ICell Cell = sheet.CreateRow(0).CreateCell(0);  
Cell.CellStyle = cellStyle;  
Cell.SetCellValue("测试格式效果");  


设置格式就是这么简单。




你可能会问了,如果我需要设置一大片的单元格都是这个格式,该不会要一个一个的设置吧?


很悲催的告诉你,没错,目前暂未发现有直接批量设置格式的方法。不过考虑到本身你也需要一个一个去创建Cell,所以顺便赋值上去也不是什么很麻烦的事情。



提到ICellStyle就不能不提到一个需要注意的地方:

通过某些现象我们曾经观察到,ICellStyle的创建是有数量限制的,换句话说,一个Excel文件里负责保存样式的空间是有限的,样式也占用一定的文件大小。

那么我们就应该注意样式的重复利用,相同的样式尽量不要创建两份,直接赋值同一个就可以了,在编写代码的时候注意样式变量的作用域。


对于只有少部分不相同的样式,我们可以使用CloneStyleFrom()方法来克隆前一个样式,而只修改需要修改的部分,减少重复代码。


[csharp]  view plain  copy 

ICellStyle newCellStyle = wk.CreateCellStyle();  
newCellStyle.CloneStyleFrom(cellStyle);  
newCellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left; 

关于ICellStyle已经讲完,希望大家喜欢。



不需要释放,不需要安装EXCEL。速度极快,实在很方便。



来源:http://blog.csdn.net/guo_lover/article/details/52399570



教程参考:http://blog.csdn.net/pan_junbiao/article/details/39717443


相关文章
|
IDE 网络协议 安全
阿里Java编程规约【九】 注释规约
1.【强制】类、类属性、类方法的注释必须使用 Javadoc 规范,使用 /** 内容 */ 格式,不得使用 // xxx 方式。 说明:在 IDE 编辑窗口中,Javadoc 方式会提示相关注释,生成 Javadoc 可以正确输出相应注释;在 IDE 中,工程调用方法时,不进入方法即可悬浮提示方法、参数、返回值的意义,提高阅读效率。
2403 0
|
4月前
|
存储 人工智能 Linux
龙虾AI永久记忆方案:阿里云/本地部署+OpenClaw三层存储+自动化记忆维护+百炼API配置流程
很多用户在使用OpenClaw(原Clawdbot)时都会遇到一个共性问题:明明刚教会一套完整流程,切换新会话后AI就完全失忆,仿佛从未学习过。这并非模型缺陷,而是你没有正确使用它的三层独立记忆体系。OpenClaw不会自动保存对话内容,所有长期能力必须主动写入存储层,否则AI永远只能记住当前会话。本文深度拆解OpenClaw记忆机制,提供可直接复制的MEMORY.md模板、HEARTBEAT自动化配置、上下文管理实战技巧,并完整覆盖2026年阿里云服务器、MacOS/Linux/Windows11本地部署流程,搭配阿里云百炼Coding Plan免费API,让你的AI助手真正实现跨会话永久记
2058 1
|
安全 Unix Linux
VMware Workstation 17.6.3 发布下载,现在完全免费无论个人还是商业用途
VMware Workstation 17.6.3 发布下载,现在完全免费无论个人还是商业用途
156470 65
|
消息中间件 开发框架 监控
NET任务调度框架Hangfire使用指南
Hangfire 是一个用于 .NET 应用程序的开源任务调度框架,支持长时间运行任务、定时任务等。通过简单的安装配置,即可将任务从主线程分离,提升应用性能。支持多种数据库,提供丰富的任务类型如立即执行、延迟执行和周期性任务,并有可视化管理界面 Hangfire Dashboard。还支持安全性配置及扩展插件,如 Hangfire.HttpJob,适合各种复杂场景下的任务调度需求。
1746 1
NET任务调度框架Hangfire使用指南
|
SQL C# 数据库
EPPlus库的安装和使用 C# 中 Excel的导入和导出
本文介绍了如何使用EPPlus库在C#中实现Excel的导入和导出功能。首先,通过NuGet包管理器安装EPPlus库,然后提供了将DataGridView数据导出到Excel的步骤和代码示例,包括将DataGridView转换为DataTable和使用EPPlus将DataTable导出为Excel文件。接着,介绍了如何将Excel数据导入到数据库中,包括读取Excel文件、解析数据、执行SQL插入操作。
EPPlus库的安装和使用 C# 中 Excel的导入和导出
C#NPOI操作Excel详解
C#NPOI操作Excel详解
2166 0
|
Dubbo Java 测试技术
提升API文档品质:Swagger annotations (注解)使用教程
Swagger 提供的注解集是其框架中定义 API 规范和文档的重要工具。这些注解在代码里标注重要部分,为 Swagger 的解析工作铺路,进而生成详尽的 API 文档。开发者编写的注释能够被转换成直观的文档,并展现API端点、参数和响应等信息。这不仅提升了开发人员对 API 运作的理解与沟通,也使得测试和集成过程更加顺畅。
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
1443 1
|
JavaScript
在Vue项目中vue-quill-editor的安装与使用【详细图解+过程+包含图片的缩放拖拽】
文章详细介绍了在Vue项目中安装和使用`vue-quill-editor`的步骤,包括如何通过npm安装、局部挂载、在Vue页面中引入和配置使用。同时,还提供了如何实现图片的缩放和拖拽功能的进阶教程,涉及到安装额外的插件`quill-image-drop-module`和`quill-image-resize-module`,以及对Webpack配置的调整。最后,文章还提供了实际效果展示和一些后续可能的拓展功能,如上传视频和将图片上传到服务器等。
在Vue项目中vue-quill-editor的安装与使用【详细图解+过程+包含图片的缩放拖拽】
|
安全 开发者
LabVIEW程序退出后线程仍在运行问题
LabVIEW程序退出后线程仍在运行问题
496 2