概述
NPOI,顾名思义,就是POI 的.NET 版本。POI 是一套用Java 写成的库,能够帮助开发者在没有安装微软Office 的情况下读写Office 文件。NPOI是一套开源的项目,常用的命名空间,包含以下内容:
- NPOI.Util: 基础辅助库
- NPOI.POIFS: OLE2 格式读写库
- NPOI.DDF: Microsoft Drawing格式读写库
- NPOI.SS: Excel 公式计算库
- NPOI.HPSF: OLE2 的Summary Information 和Document Summary Information 属性读写库
- NPOI.HSSF : Excel BIFF 格式读写库
note:
如果生成的Excel文件后缀是xlsx的话,就不能使用HSSFWorkbook与HSSFSheet
类,而必须使用XSSFWorkbook与XSSFSheet
类。
Excel文件操作
NPOI.HSSF
是专门负责Excel BIFF 格式的命名空间,供开发者使用的对象主要位于NPOI.HSSF.UserModel
和NPOI.HSSF.Util
命名空间下。NPOI.HSSF.UserModel.HSSFWorkbook
类,这个类负责创建Excel文档。Excel 规定一个Workbook 必须至少带1 个Sheet。
// 引用动态库并使用命名空间
using NPOI.HSSF.UserModel;
// 实例化HSSFWorkbook对象
HSSFWorkbook hssfWb = new HSSFWorkbook();
// 创建Sheet
hssfWb.CreateSheet("sheet1");
// 或者采用下面的方法,注意此处需要使用类型强制转换。
HSSFSheet sheet1 = (HSSFSheet)hssfWb.CreateSheet("sheet1");
// 新建文件流
FileStream file = new FileStream("d:\\test.xls", FileMode.Create);
// 将HSSFWorkbook实例化的对象写入文件流
hssfWb.Write(file);
// 关闭文件流
file.Close();
基于模板生成Excel文件
NPOI 一大特色之一就是能够轻松读取Office Excel 的格式,即使里面有NPOI 不支持的VBA 宏、图表以及Pivot 表之类的高级记录,NPOI 也能够保证不丢失数据。
// 读取模板文件
HSSFWorkbook wb = new HSSFWorkbook(new FileStream("d:\\template.xls",FileMode.Open,FileAccess.Read));
// 读取模板文件的表
HSSFSheet sheet = (HSSFSheet)wb.GetSheet("yy");
// ForceFormulaRecalculation 是强制要求Excel 在打开时重新计算的属性,在拥有公式的xls文件中十分有用。
sheet.ForceFormulaRecalculation = true;
// 新建XLS文件
FileStream file = new FileStream("d:\\test.xls", FileMode.Create);
// 将更改后的内容写入到新建的文件中
wb.Write(file);
file.Close();
说明:有数据透视表,以及图表的Excel同样适用。
单元格操作
单元格是Excel 最有意义的东西,做任何操作恐怕都要和单元格打交道。在Excel 中要添加一个单元格只需要点击任何一个单元格,然后输入内容就是了,但是Excel 底层其实没有这么简单,不同的单元格是有不同的类型的。
比如说数值单元格是用NumberRecord
表示,文本单元格是用LabelSSTRecord
表示,空单元格是用BlankRecord
表示。这也就意味着,在设置单元格时,必须告诉NPOI 你需要创建哪种类型的单元格。要创建单元格首先要创建单元格所在的行,行建好了就可以建列,通过行和列确定唯一的单元格。
注意:这里的行在Excel 里是从1 开始的,但是NPOI 内部是从0 开始的;列在Excel里面是用字母表示的,而NPOI 中也是用从0 开始的数字表示的,所以要注意转换。
// 创建sheet实例
HSSFSheet sheet1 = (HSSFSheet)hssfWb.CreateSheet("sheet1");
// 新建单元格并赋值
sheet1.CreateRow(0).CreateCell(0).SetCellValue("yaoyuan");
// 获取已经创建好的单元格
sheet1.GetRow(row_index).GetCell(column_index);
单元格格式
在Excel 中我们经常要设置格式,比如说日期格式(yyyymmdd)、小数点格式(1.20)、货币格式($2000)、百分比格式(99.99%)等等。使用NPOI 时要注意,所有的格式都是通过CellStyle.DataFormat 赋给单元格的,而不是直接赋给单元格。
// 实例化 HSSFCellStyle对象
HSSFCellStyle cellStyle = (HSSFCellStyle)hssfWb.CreateCellStyle(); //利用HSSFWorkbook类的CreateCellStyle方法。
// 实例化 HSSFDataFormat对象
// 由于这里的“yyyy 年m 月d 日”属于自定义格式(区别于Excel 内嵌的格式),所以必须用hssfworkbook.CreateDataFormat()创建一个HSSFDataFormat 实例,然后使用format.GetFormat 来获取相应的格式
HSSFDataFormat dataFormat = (HSSFDataFormat)hssfWb.CreateDataFormat();
// 修改HSSFCellStyle对象实例的DataFormat属性
cellStyle.DataFormat = dataFormat.GetFormat("yyyy年m月d日");
// 如果是excel内置的格式,可直接定义
cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00");
// 修改单元格的CellStyle属性。
cell.CellStyle = cellStyle;