目录
2.1.2 创建DocumentSummaryInformation和SummaryInformation
1.认识NPOI
1.1 什么是NPOI
NPOI,顾名思义,就是POI的.NET版本。用于读取和写入Microsoft Office二进制和OOXML文件格式。
NPOI,顾名思义,就是POI的.NET版本。
那POI又是什么呢?
POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office 97-2003的文件,
支持的文件格式包括xls, doc, ppt等。在本文发布时,POI的最新版本是3.5 beta 6。
NPOI 1.x是基于POI 3.x版本开发的,与poi 3.2对应的版本是NPOI 1.2,
目前最新发布的版本是1.2.1,在该版本中仅支持读写Excel文件和Drawing格式,
其他文件格式将在以后的版本中得到支持。
1.2 版权说明
NPOI采用的是Apache 2.0许可证(poi也是采用这个许可证),
这意味着它可以被用于任何商业或非商业项目,你不用担心因为使用它而必须开放你自己的源代码,
所以它对于很多从事业务系统开发的公司来说绝对是很不错的选择。
当然作为一个开源许可证,肯定也是有一些义务的,例如如果你在系统中使用NPOI,
你必须保留NPOI中的所有声明信息。对于源代码的任何修改,必须做出明确的标识。
完整的apache 2.0许可证请见http://www.phpx.com/man/Apache-2/license.html
资料扩展:http://www.cnblogs.com/atao/
1.3 NPOI 1.2中各Assembly的作用
NPOI目前有好几个assembly,每个的作用各有不同,开发人员可以按需加载相应的assembly。在这里大概罗列一下:
NPOI.Util 基础辅助库
NPOI.POIFS OLE2格式读写库
NPOI.DDF Microsoft Drawing格式读写库
NPOI.SS Excel公式计算库
NPOI.HPSF OLE2的Summary Information和Document Summary Information属性读写库
NPOI.HSSF Excel BIFF格式读写库
2. 常规操作设置
2.1 创建基本内容
2.1.1 创建Workbook和Sheet
创建Workbook说白了就是创建一个Excel文件,当然在NPOI中更准确的表示是在内存中创建一个Workbook对象流。
NPOI.HSSF是专门负责Excel BIFF格式的命名空间,
供开发者使用的对象主要位于NPOI.HSSF.UserModel和NPOI.HSSF.Util命名空间下,
下面我们要讲到的Workbook的创建用的就是NPOI.HSSF.UserModel.HSSFWorkbook类,这个类负责创建.xls文档。
在开始创建Workbook之前,先要在项目中引用一些必要的NPOI assembly,如下所示:
NPOI.dll
NPOI.POIFS.dll
NPOI.HSSF.dll
NPOI.Util.dll
要创建一个新的xls文件其实很简单,只要我们初始化一个新的`HSSFWorkbook`实例就行了,如下所示:
using NPOI.HSSF.UserModel;
using NPOI.XSSF.UserModel;
using System.IO;
using NPOI.SS.UserModel;
using NPOI.SS.Util;
using NPOI.HSSF.Util;
.....
IWorkbook workBook;
string ext = Path.GetExtension(fileName);
if (ext.Equals(".xls", StringComparison.CurrentCultureIgnoreCase))
{
//表示为Excel2007以前的版本
workBook = new HSSFWorkbook();
}
else if (ext.Equals(".xlsx", StringComparison.CurrentCultureIgnoreCase))
{
//表示为Excel2007以后的版本
workBook = new XSSFWorkbook();
}
else
{
throw new ArgumentException("只能导出为Excel文件");
}
是不是很方便啊,没有任何参数或设置,但这么创建有一些限制,
这样创建出来的Workbook在Excel中打开是会报错的,
因为Excel规定一个Workbook必须至少带1个Sheet,
这也是为什么在Excel界面中,新建一个Workbook默认都会新建3个Sheet。
所以必须加入下面的创建Sheet的代码才能保证生成的文件正常:
HSSFSheet sheet = hssfworkbook.CreateSheet("newsheet");
// 如果要创建标准的Excel文件,即拥有3个Sheet,可以用下面的代码:
hssfworkbook.CreateSheet("Sheet1");
hssfworkbook.CreateSheet("Sheet2");
hssfworkbook.CreateSheet("Sheet3");
// 最后就是把这个HSSFWorkbook实例写入文件了,代码也很简单,如下所示:
FileStream file = new FileStream(@"test.xls", FileMode.Create);
hssfworkbook.Write(file);
file.Close();
这里假设文件名是test.xls,,在创建完FileStream之后,直接调用HSSFWorkbook类的Write方法就可以了。
最后可以打开test.xls文件确认一下,有3个空的Sheet。
相关范例请见NPOI 1.2正式版中的CreateEmptyExcelFile项目。
2.1.2 创建DocumentSummaryInformation和SummaryInformation
DocummentSummaryInformation和SummaryInformation并不是Office文件的专利,
只要是OLE2格式,都可以拥有这两个头信息,主要目的就是为了在没有完整读取文件数据的情况下获得文件的摘要信息,
同时也可用作桌面搜素的依据。
要了解DocummentSummaryInformation的全部属性请见http://msdn.microsoft.com/en-us/library/aa380374(VS.85).aspx;
要了解SummaryInformation的全部属性请见http://msdn.microsoft.com/en-us/library/aa369794(VS.85).aspx。
using NPOI.HSSF.UserModel;
using NPOI.HPSF;
using NPOI.POIFS.FileSystem;
// 其中与DocummentSummaryInformation和SummaryInformation密切相关的是HPSF命名空间。
// 首先创建Workbook
HSSFWorkbook hssfworkbook = new HSSFWorkbook();
// 然后创建DocumentSummaryInformation
DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
dsi.Company ="NPOI Team";
// 再创建SummaryInformation
SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
si.Subject ="NPOI SDK Example";
// 因为是范例,这里仅各设置了一个属性,其他都没有设置。
// 现在我们把创建好的对象赋给Workbook,这样才能保证这些信息被写入文件。
hssfworkbook.DocumentSummaryInformation= dsi;
hssfworkbook.SummaryInformation= si;
2.1.3 创建单元格
用过Excel的人都知道,单元格是Excel最有意义的东西,我们做任何操作恐怕都要和单元格打交道。
在Excel中我们要添加一个单元格只需要点击任何一个单元格,然后输入内容就是了,
但是Excel底层其实没有这么简单,不同的单元格是有不同的类型的,
比如说数值单元格是用NumberRecord表示,文本单元格是用LabelSSTRecord表示,
空单元格是用BlankRecord表示。这也就意味着,在设置单元格时,
你必须告诉NPOI你需要创建哪种类型的单元格。
要创建单元格首先要创建单元格所在的行,比如,下面的代码创建了第0行:
HSSFSheet sheet1 = hssfworkbook.CreateSheet("Sheet1");
HSSFRow row1=sheet1.CreateRow(0);
// 行建好了,就可以建单元格了,比如创建A1位置的单元格:
row1.CreateCell(0).SetCellValue(1);
这里要说明一下,SetCellValue有好几种重载,
你可以设置单元格为bool、double、DateTime、string和HSSFRichTextString类型。
其中对于string类型的重载调用的就是HSSFRichTextString类型的重载,
所以是一样的,HSSFRichTextString可用于有字体或者Unicode的文本。
如果你觉得每一行要声明一个HSSFRow很麻烦,可以用下面的方式:
sheet1.CreateRow(0).CreateCell(0).SetCellValue("This is a Sample");
// 这么用有个前提,那就是第0行还没创建过,否则得这么用:
sheet1.GetRow(0).CreateCell(0).SetCellValue("This is a Sample");
如果你要获得某一个已经创建的单元格对象,可以用下面的代码:
sheet1.GetRow(row_index).GetCell(column_index);
注意:这里的行在Excel里是从1开始的,但是NPOI内部是从0开始的;
列在Excel里面是用字母表示的,而NPOI中也是用从0开始的数字表示的,所以要注意转换。
2.1.4 创建批注
在过去,我们恐怕没有办法实现这一功能,
因为无论是cvs法、html法、oledb法都没有提供这样的接口,当然Office PIA法可以做到,
但是性能实在太差,而且稳定性不好,经常莫名其妙crash(这是某某兄弟给我的反馈,我引用了下,呵呵)。
在以后的教程中,你将看到更多在过去无法通过传统方法实现的东西,好戏才刚刚开始。
批注主要有三个属性需要设置,一个是批注的位置和大小、一个是批注的文本、还有一个是批注的作者。
批注的位置和大小,在Excel中是与单元格密切相关的,NPOI中通过HSSFClientAnchor的实例来表示,
它的构造函数比较复杂,有8个参数,它们分别是(后面插入图片的时候也将用到该参数)
参数 | 说明 |
---|---|
dx1 | 第1个单元格中x轴的偏移量 |
dy1 | 第1个单元格中y轴的偏移量 |
dx2 | 第2个单元格中x轴的偏移量 |
dy2 | 第2个单元格中y轴的偏移量 |
col1 | 第1个单元格的列号 |
row1 | 第1个单元格的行号 |
col2 | 第2个单元格的列号 |
row2 | 第2个单元格的行号 |
// 如果我们打算让注释显示在B3和E5之间,就应该这么写:
HSSFPatriarch patr = sheet.CreateDrawingPatriarch();
HSSFComment comment1 = patr.CreateComment(new HSSFClientAnchor(0, 0, 0, 0, 1, 2 , 4, 4));
//下面我们设置这个批注的内容和作者,这个比较简单:
comment1.String=new HSSFRichTextString("Hello World");
comment1.Author="NPOI Team";
//最后一步就是把批注赋给某个单元格:
HSSFCell cell= sheet.CreateRow(1).CreateCell(1);
cell.CellComment= comment1;
对于批注,你有两种选择,一种是隐藏(默认),一种是显示(即表单一打开就显示该批注),
可以通过comment1.Visible属性来控制。
2.1.5 创建页眉和页脚
很多人并不知道Excel的页眉和页脚功能,因为在界面上是显示不了页眉和页脚的,
必须在打印页面中才能看到,这也直接导致了其设置界面也显得更隐秘,
你必须进入页面设置 –>页眉和页脚才能设置。以下是Office 2007中的设置界面。
当你按“自定义页眉”或“自定义页脚”时,你会看到以下界面,Excel把页眉、页脚分成了左中右三部分,
这一点绝非单纯体现在界面上,在底层的存储中也是如此。
如果你设置的是“左”的内容,底层的存储字符串就会在开头加上&L,如果是“右”的内容则会加上&R,
所以HeaderRecord中的字符串看上去是这样的:"&C&LFooter A&R”,
这个字符串的意思是仅设置了“左”的内容,内容是Footer A。
看了这些我想你应该对页眉和页脚有所了解了,回过头来说NPOI,
NPOI中主要是靠HSSFSheet.Header和HSSFSheet.Footer来设置的,
这两个属性分别是HSSFHeader和HSSFFooter类型的。
参考代码如下:
HSSFSheet s1= hssfworkbook.CreateSheet("Sheet1");
s1.CreateRow(0).CreateCell(1).SetCellValue(123);
//set headertext
s1.Header.Center="This is a test sheet";
//set footertext
s1.Footer.Left="Copyright NPOI Team";
s1.Footer.Right="created by NPOI Team";
2.2 单元格操作
2.2.1 设置格式
在Excel中我们经常要设置格式,比如说日期格式(yyyymmdd)、小数点格式(1.20)、货币格式($2000)、
百分比格式(99.99%)等等,这些东西在过去我们恐怕只能在服务器端生成好,不但增加了服务器端的代码量,
还造成了不必要的字符串替换操作&#