ASP.NET服务端不装Office 操作Excel NPOI 1-2

原创 2011年10月12日 09:15:37

作者:Tony Qu

NPOI QQ交流群: 

群1:78142590 (满)

群2:124527967

群3: 116053476(新)

更新

2009.3.24  把npoi 1.2 alpha的链接换成NPOI 1.2 beta

2009.11.18  把npoi 1.2 beta的链接换成NPOI 1.2.1; 增加NPOI教程链接

2009.12.1 增加QQ群 

===================================================

本文将通过问答的方式帮助你了解NPOI。

 

什么是NPOI?

NPOI,顾名思义,就是POI的.NET版本。那POI又是什么呢?POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office 97-2003的文件,支持的文件格式包括xls, doc, ppt等。目前POI的稳定版本中仅支持Excel文件格式xls,其他的都属于不稳定版本(放在poi的scrachpad目录中)。NPOI是构建在POI 3.x版本之上的,本月发布的NPOI 1.2是对应于POI 3.2 final的,所以它支持Excel文件读写,但由于人手和精力原因,还没有实现读写Word, PowerPoint, Visio的文件格式。

 

NPOI的官方网站是啥?

npoi.codeplex.com

 

为什么用NPOI?

因为它能够帮助你生成真正的Office文件格式,比如说Excel文件格式。我曾经看到好几个园友发过有关如何生成Excel报表的帖子,大家确实花了很多心思,具体的帖子如下:

生成Excel高级报表(用的是Office PIA库)

http://www.cnblogs.com/xiaobier/archive/2008/10/13/1310399.html

Datagrid数据导出到excel文件的三种方法

http://www.cnblogs.com/xieduo/articles/606202.html

其中提到了的2种方法分别是:cvs法、html法

.net 操作 EXCEL

http://www.cnblogs.com/jhobo/archive/2009/02/17/1392423.html

其中提到了Office PIA法、OLEDB法、OPENXML法

 

特别是其中的cvs法和html法值得提一下,这得感谢Microsoft Office对于格式的强大兼容性,貌似国产某某Office软件就无法正常显示基于html的xls文件。

好了,回到我们的问题上,为什么要用NPOI呢?

第一点,你不需要在服务器上安装微软的Office,可以避免版权问题。

第二点,使用起来比Office PIA的API更加方便,更人性化。

第三点,你不用去花大力气维护NPOI,NPOI Team会不断更新、改善NPOI,绝对省成本。

第四点,很多事情是html和cvs法做不到的,比如说公式计算[Cell C1]=A1+B1*A2、单元格高级样式(如文本旋转、对齐、宽度)等,其中公式计算可以适当减轻服务器端的计算压力

第五点,你很难保证你的客户机器上都安装了Office 2007或Office Compatiblity Pack for Office 2003,出于向前兼容的考虑,还是生成Office 97-2003格式比较可靠

 

当然有人要说了,那我用myXls等同类产品可不可以?当然可以,纯属个人喜好,这就好比你愿意用NHibernate还是NBear,完全可以自由选择。

 

NPOI由哪些东西组成?

NPOI目前主要由以下部分组成

NPOI.POIFS OLE2 Document File System Library
NPOI.DDF Microsoft Office Drawing format Library
NPOI.HPSF OLE2 Propertyset library (包括SummaryInformation和DocumentSummaryInformation)
NPOI.HSSF Microsoft Excel BIFF library
NPOI.SS Formula Evaluation library
NPOI.Util 基础类库,提供了很多实用功能,可用于其他读写文件格式项目的开发

 

NPOI目前的版本如何?包括哪些功能?

目前NPOI的最新版是NPOI 1.2.1,其中包括了以下功能:

a. 读写OLE2文档

b. 读写DocummentSummaryInformation和SummaryInformation

c. 基于LittleEndian的字节读写

d. 读写Excel BIFF格式

e. 识别并读写Excel BIFF中的常见Record,如RowRecord, StyleRecord, ExtendedFormatRecord

f. 支持设置单元格的高、宽、样式等

g. 支持调用部分Excel内建函数,比如说sum, countif以及计算符号

h. 支持在生成的Xls内嵌入打印设置,比如说横向/纵向打印、缩放、使用的纸张等

i. ……  (功能太多,无法一一例举,大家自己研究吧)

下载地址:http://npoi.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=19351

 

在开发中哪些地方可以使用NPOI

a. 生成Excel报表

b. Excel中的文本提取(主要用于搜索引擎)

c. 批量生成Excel文件

d. 基于Excel文件模板生成新的Excel

e. 研究Excel BIFF文件格式及OLE2文件格式

 

NPOI的最终目标是什么?

a. 能够读写几乎所有的Office 97-2003文件格式,至少能够支持Word, PowerPoint, Excel, Visio的格式,其他的会根据实际需求而定。

b. 作为教学Office文件格式的“活”教材,也可作为研究生阶段研究数据结构的教材。

即使是目前的1.2版本也很不完善,支持的Excel功能还很有限,没有搞过NPOI的研发,包括我在内的很多人很难想象微软这样一个Excel软件的开发量,其中除了我们常用的基本功能以外,还有很多内置函数的实现、对行进行分组、行的锁定、表单的保护等。说实话有些功能我也是第一次听说,是在开发中一边看Excel界面一边实现的(呵呵,是不是很土)。由于Office 2007为了兼容Office 97-2003,在其基础上增加了很多新的Record,所以要生成真正意义上的全新的Excel BIFF很难(话说微软的开发速度贼快)。

在NPOI以后的版本中还会支持Pivot表和图表(Chart),其实你在poi的svn中已经可以看到最新的pivot和chart的代码了,只是还在开发中,没有发布正式版本,估计今年中旬会发一个新的版本。

 

我也想研究Office文件格式,有没有相关的文档和工具可供参考?

首先是文件格式的说明文档,你可以去微软的官方网站下载:http://www.microsoft.com/interop/docs/officebinaryformats.mspx

接着是,我和Huseyin共同开发了POIFS Browser,目前的版本是1.2,已经能够识别Excel BIFF了。

你可以去http://npoi.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=23409下载。

 

我可以参加NPOI开发组吗?

当然可以,我非常欢迎大家加入NPOI Team,因为目前狂缺人手,很多事情要做,比如说实现读写Word格式的库,即HWPF;还需要有人帮忙一起写文档、写范例、写教程。目前团队中只有2个人,我和Huseyin(土耳其人),最近Huseyin也很忙,没时间维护NPOI,所以我很需要你的加入。大家有兴趣可以到http://npoi.codeplex.com/Thread/View.aspx?ThreadId=36157回帖,或者直接发邮件给我(具体邮件地址见我blog的左边栏)。

 

NPOI有教程吗?

有,该教程是为NPOI 1.2写的,详细目录请见http://www.cnblogs.com/tonyqus/archive/2009/04/12/1434209.html

 

NPOI Team下一步准备干嘛?

上一个问题中提到事情真的很多,下面罗列一下:

a. 使Excel读写库(HSSF)更加稳定

b. 开发HSSF对Pivot Table和Chart的支持

c. 开发Word读写库(HWPF)、PowerPoint读写库(HSLF)

d. 把HSSF的注释补全,把java的注释转成.NET的,便于用NDoc生成文档和智能感知

e. 写NPOI 1.2的范例(目前只有10个左右,目标是>50个,类似于微软的SDK,这样方便大家学习和理解)

f.  写NPOI 1.2的教程

作者:Tony Qu

NPOI官方网站:http://npoi.codeplex.com/

  

创建Workbook说白了就是创建一个Excel文件,当然在NPOI中更准确的表示是在内存中创建一个Workbook对象流。

本节作为第2章的开篇章节,将做较为详细的讲解,以帮助NPOI的学习者更好的理解NPOI的组成和使用。

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;
...
HSSFWorkbook hssfworkbook = new HSSFWorkbook();

是不是很方便啊,没有任何参数或设置,但这么创建有一些限制,这样创建出来的Workbook在Excel中打开是会报错的,因为Excel规定一个Workbook必须至少带1个Sheet,这也是为什么在Excel界面中,新建一个Workbook默认都会新建3个Sheet。所以必须加入下面的创建Sheet的代码才能保证生成的文件正常:

HSSFSheet sheet = hssfworkbook.CreateSheet("new sheet");

如果要创建标准的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项目。

作者:Tony Qu

NPOI官方网站:http://npoi.codeplex.com/

昨天收到了不少回复,有msn上的,也有blog上的,我代表NPOI Team向所有支持和关注NPOI的兄弟表示感谢,让我们共同完善NPOI

 

前一节中我们讲解了如何创建一个新的Workbook,但在此过程中大家也许会发现一个细节,这些文件没有包括DocummentSummaryInformation和SummaryInformation头。如果你还不是很清楚我在说什么,可以看POIFS Browser打开test.xls文件后的截图:

image

你会发现只有Workbook目录,其他什么都没有,但事实上一个正常的xls文件,比如说Excel生成的xls文件是类似下面的结构:

image

是不是多出来DocumentSummaryInformation和SummaryInformation两个头?很多人可能对DocumentSummaryInformation和SummaryInformation很陌生,可能第一次听说这玩意,没事,这很正常,因为普通用户很少会去使用这些东西,但它们其实比想象中有用。

image

请看上图中的信息,如作者、标题、标记、备注、主题等信息,其实这些信息都是存储在DocummentSummaryInformation和SummaryInformation里面的,这么一说我想大家应该明白了吧,这些信息是为了快速提取文件信息准备。在Windows XP中,也有对应的查看和修改界面,只是没有Vista这么方便,如下所示:

propertysetwindow1-thumb

这恐怕也是很多人对于这些信息漠不关心的原因吧,因为没有人愿意通过 右击文件->属性 这样复杂的操作去查看一些摘要信息。

 

提示

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.1节一样,我们把Workbook通过FileStream写入文件。

 

相关范例请见 NPOI 1.2正式版中的CreatePOIFSFileWithProperties


作者:Tony Qu

NPOI官方网站:http://npoi.codeplex.com/

 

用过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");

 

注意:这里的行在Excel里是从1开始的,但是NPOI内部是从0开始的;列在Excel里面是用字母表示的,而NPOI中也是用从0开始的数字表示的,所以要注意转换。

 

如果你要获得某一个已经创建的单元格对象,可以用下面的代码:

sheet1.GetRow(row_index).GetCell(column_index);

 

本节仅讲解最基本的单元格创建,有关单元格格式设置、样式等高级话题请见:2.2节单元格相关操作。

相关范例请见 NPOI 1.2正式版中的SetCellValuesInXls项目。

作者:Tony Qu

NPOI官方网站:http://npoi.codeplex.com/

 

很多人不怎么用Excel中的批注,所以我特地截了张图,让大家知道本节我们要创建的到底是什么东西。

image

在过去,我们恐怕没有办法实现这一功能,因为无论是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属性来控制。

image

看了上面这张图大家就应该明白了,这里有2个批注,下面那个是显示的,上面那个是隐藏的。

相关范例请见 NPOI 1.2正式版中的SetCellCommentInXls。


不安装OFFICE实现服务器读取EXCEL(ASP.NET)

前段时间用asp.net做了一简单的游戏管理后台,其中涉及到了上传Excel导入数据的功能,本来在本地开发实现都好好的,可已上传的服务器上就悲剧了。服务器是阿里云 Windows Server 200...

ASP.NET服务端不装Office 操作Excel NPOI 3

作者:Tony Qu NPOI官方网站:http://npoi.codeplex.com/   在Excel中我们经常要设置格式,比如说日期格式(yyyymmdd)、小数点格式(1.20)、货币...

服务端不装Office ASP.NET 导出Excel控件 MyXls(项目在用)

如果从快速生成Excel报表,不调用Excel组件角度讲,MyXls可能是一种最好的选择之一,当然使用Open Xml方式也是不错的选择。MyXls是一个用C#语言开发的生成Excel报表的优秀开源项...

ASP.NET导出Excel(利用NPOI和EPPlus库,无需安装Office)

网上提供了很多Asp.net中操作Excel的方法,其中大部分是调用微软的Office组件,下面提供三个无须安装Office即可从Asp.net输出Excel的方法。 1 简单方法 //下面代...

asp.net(C#)之NPOI"操作Excel

1.首先到网上下载"NPOI.DLL",引用。 2.新建一个操作类“ExcelHelper.cs”: using System.Collections.Generic; using System....

NPOI Asp.net操作Excel

原文:NPOI(1):Asp.net操作Excel先去官网:http://npoi.codeplex.com/下载需要引入dll(可以选择.net2.0或者.net4.0的dll),然后在网站中添加引...

ASP.NET服务端操作ActiveX 实战宝典

大家都只ActiveX在web中可以通过object标签来声明,并通过javascript等脚本代码来进行操作,但有些时候我们希望在服务端在操作ActiveX,特别是包含一些复杂的业务逻辑的或要对大数...
  • F7ANTY
  • F7ANTY
  • 2012年02月23日 20:34
  • 1004

asp.net中操作excel等不存在类型或命名空间名称Office

下午的一个Program中想导入一个EXCEL表,但是先后显示了 1.命名空间Microsoft中不存在类型或命名空间名称Office(是缺少程序集引用吗?) 2. 命名空间Microsoft...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASP.NET服务端不装Office 操作Excel NPOI 1-2
举报原因:
原因补充:

(最多只允许输入30个字)