-
NOPI教程之基于.xls模板生成Excel文件
作者:Tony Qu
NPOI官方网站:http://npoi.codeplex.com/
NPOI QQ交流群: 78142590
尽管NPOI能够从头开始生成Excel文件,但在实际生产环境中有很多现成的表格,我们不可能没事就去从头开始生成一个Excel,更多时候我们更愿意选择比较偷懒的方法——那就是用模板文件。NPOI一大特色之一就是能够轻松读取Office Excel 97-2003的格式,即使里面有NPOI不支持的VBA宏、图表以及Pivot表之类的高级记录,NPOI也能够保证不丢失数据(说实话,要完全能够识别所有的Excel内部记录几乎是不可能的,更何况如今又多出了Office Excel 2007 binary file,即.xlsb)。
现在我们转入正题,出于演示目的,我做了一个简单的销售量表,里面应用了文字颜色、背景色、文本居中、公式、千分位分隔符、边框等效果,当然实际的生产环境里可能还有更加复杂的Excel模板。如下图
我们的程序就是要填充12个月的销售量,Total能够自动根据填充的值计算出总量。
(这里要提一下,以往如果我们用HTML方式输出xls,我们必须在服务器端做Total计算,并且这个值在下载后永远都是静态的,没有公式,即使用户要修改里面的数据,总值也不会改变。这也是为什么NPOI一直提倡生成真正的Excel文件。)
代码其实很简单:
//read the template via FileStream, it is suggested to use FileAccess.Read to prevent file lock.
//book1.xls is an Excel-2007-generated file, so some new unknown BIFF records are added.
FileStream file = new FileStream(@"template/book1.xls", FileMode.Open,FileAccess.Read);
HSSFWorkbook hssfworkbook = new HSSFWorkbook(file);
HSSFSheet sheet1 = hssfworkbook.GetSheet("Sheet1");
sheet1.GetRow(1).GetCell(1).SetCellValue(200200);
sheet1.GetRow(2).GetCell(1).SetCellValue(300);
sheet1.GetRow(3).GetCell(1).SetCellValue(500050);
sheet1.GetRow(4).GetCell(1).SetCellValue(8000);
sheet1.GetRow(5).GetCell(1).SetCellValue(110);
sheet1.GetRow(6).GetCell(1).SetCellValue(100);
sheet1.GetRow(7).GetCell(1).SetCellValue(200);
sheet1.GetRow(8).GetCell(1).SetCellValue(210);
sheet1.GetRow(9).GetCell(1).SetCellValue(2300);
sheet1.GetRow(10).GetCell(1).SetCellValue(240);
sheet1.GetRow(11).GetCell(1).SetCellValue(180123);
sheet1.GetRow(12).GetCell(1).SetCellValue(150);
//Force excel to recalculate all the formula while open
sheet1.ForceFormulaRecalculation = true;
FileStream file = new FileStream(@"test.xls", FileMode.Create);
hssfworkbook.Write(file);
file.Close();
首先打开模板文件时要使用FileAccess.Read,这样可以保证文件不被占用。
这里的ForceFormulaRecalculation是强制要求Excel在打开时重新计算的属性,在拥有公式的xls文件中十分有用,大家使用时可别忘了设。
是不是比你想象的简单?你甚至不用去了解它是在何时读取文件内容的,对于NPOI的使用者来说基本上和读取普通文件没有什么两样。
最终生成的效果如下所示:
发觉没,就连千分位分隔符也都保留着,一切就像人工填写的一样。
本范例完整代码请见NPOI.Examples中的GenerateXlsFromXlsTemplate项目。
NPOI官方网站:http://npoi.codeplex.com/
NPOI QQ交流群: 78142590
尽管NPOI能够从头开始生成Excel文件,但在实际生产环境中有很多现成的表格,我们不可能没事就去从头开始生成一个Excel,更多时候我们更愿意选择比较偷懒的方法——那就是用模板文件。NPOI一大特色之一就是能够轻松读取Office Excel 97-2003的格式,即使里面有NPOI不支持的VBA宏、图表以及Pivot表之类的高级记录,NPOI也能够保证不丢失数据(说实话,要完全能够识别所有的Excel内部记录几乎是不可能的,更何况如今又多出了Office Excel 2007 binary file,即.xlsb)。
现在我们转入正题,出于演示目的,我做了一个简单的销售量表,里面应用了文字颜色、背景色、文本居中、公式、千分位分隔符、边框等效果,当然实际的生产环境里可能还有更加复杂的Excel模板。如下图
我们的程序就是要填充12个月的销售量,Total能够自动根据填充的值计算出总量。
(这里要提一下,以往如果我们用HTML方式输出xls,我们必须在服务器端做Total计算,并且这个值在下载后永远都是静态的,没有公式,即使用户要修改里面的数据,总值也不会改变。这也是为什么NPOI一直提倡生成真正的Excel文件。)
代码其实很简单:
//read the template via FileStream, it is suggested to use FileAccess.Read to prevent file lock.
//book1.xls is an Excel-2007-generated file, so some new unknown BIFF records are added.
FileStream file = new FileStream(@"template/book1.xls", FileMode.Open,FileAccess.Read);
HSSFWorkbook hssfworkbook = new HSSFWorkbook(file);
HSSFSheet sheet1 = hssfworkbook.GetSheet("Sheet1");
sheet1.GetRow(1).GetCell(1).SetCellValue(200200);
sheet1.GetRow(2).GetCell(1).SetCellValue(300);
sheet1.GetRow(3).GetCell(1).SetCellValue(500050);
sheet1.GetRow(4).GetCell(1).SetCellValue(8000);
sheet1.GetRow(5).GetCell(1).SetCellValue(110);
sheet1.GetRow(6).GetCell(1).SetCellValue(100);
sheet1.GetRow(7).GetCell(1).SetCellValue(200);
sheet1.GetRow(8).GetCell(1).SetCellValue(210);
sheet1.GetRow(9).GetCell(1).SetCellValue(2300);
sheet1.GetRow(10).GetCell(1).SetCellValue(240);
sheet1.GetRow(11).GetCell(1).SetCellValue(180123);
sheet1.GetRow(12).GetCell(1).SetCellValue(150);
//Force excel to recalculate all the formula while open
sheet1.ForceFormulaRecalculation = true;
FileStream file = new FileStream(@"test.xls", FileMode.Create);
hssfworkbook.Write(file);
file.Close();
首先打开模板文件时要使用FileAccess.Read,这样可以保证文件不被占用。
这里的ForceFormulaRecalculation是强制要求Excel在打开时重新计算的属性,在拥有公式的xls文件中十分有用,大家使用时可别忘了设。
是不是比你想象的简单?你甚至不用去了解它是在何时读取文件内容的,对于NPOI的使用者来说基本上和读取普通文件没有什么两样。
最终生成的效果如下所示:
发觉没,就连千分位分隔符也都保留着,一切就像人工填写的一样。
本范例完整代码请见NPOI.Examples中的GenerateXlsFromXlsTemplate项目。
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式