NPOI教程1

NPOI 2.0目前还处于beta版,本文中所涉及的介绍以最新的beta版为准,以后如果有改动也是有可能的。

 

NPOI 2.0有几个DLL构成,他们分别是NPOI.DLL,NPOI.OOXML.DLL, NPOI.OpenXml4Net.dll, NPOI.OpenXmlFormats.dll,其中后三个是2.0新加的库。

NPOI.DLL中包含的模块

NPOI.Util   基础辅助库 
NPOI.POIFS   OLE2格式读写库,主要负责处理DocumentInformation 
NPOI.DDF   Microsoft Drawing格式读写库 
NPOI.SS   Excel 2003和Excel 2007操作库共用的接口库以及公用模块实现,如公式计算库  
NPOI.HPSF   OLE2的Summary Information和Document Summary Information属性读写库 
NPOI.HSSF   Excel BIFF格式读写库,这是用户用的最多的命名空间

 

NPOI.OOXML中包含的模块

NPOI.XSSF Excel 2007操作库,大部分对象都实现了NPOI.SS的接口 
NPOI.XWPF Word 2007操作库

 

NPOI.OpenXml4Net.DLL中包含的模块

只有一个,即NPOI.OpenXml4Net,它是从POI的子项目OpenXml4j移植过来的,其功能类似于NPOI.POIFS,只是它操作的是OOXML格式。

 

NPOI.OpenXmlFormats.DLL中包含的模块

也只有一个,即OpenXmlFormats,它定义了所有OOXML对象和C#对象的映射关系,并提供给XmlSerializer进行序列化和反序列化。

分类: 未分类 标签:

NPOI 1.2 教程 – 1 认识NPOI

2013年1月22日 tonyqus 没有评论

本章将介绍NPOI的一些基本信息,包括以下几个部分

  • 什么是NPOI
  • 版权说明
  • 相关资源
  • 团队介绍
  • 未来展望
  • 各Assembly的作用

1.1 什么是NPOI

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

 

1.3 相关资源

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

POIFS Browser 1.2

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

 

1.4 团队介绍

Tony Qu来自于中国上海,是这个项目的发起人和开发人员,时区是GMT+8,2008年9月开始了NPOI的开发,负责NPOI所有底层库的开发、测试和bug修复。

个人blog地址为http://tonyqus.sinaapp.com/

 

Hüseyin Tüfekçilerli来自于土耳其的伊斯坦布尔,也是这个项目的开发人员,时区是GMT+2,2008年11月参与了NPOI的开发,主要负责POIFS Browser 1.0的开发工作。

个人blog地址为http://huseyint.com/

 

aTao.Xiang,来自中国,2009年8月开始参与该项目,主要参与了NPOI 1.2中文版的撰写工作和推广工作

个人blog地址为http://www.cnblogs.com/atao/

 

1.5 回顾与展望

目前POI版本中的HWPF(用于Word的读写库)还不是很稳定,并非正式发布版本,且负责HWPF的关键开发人员已经离开,所以NPOI可能考虑自己重新开发HWPF。另外,目前微软正在开发Open XML Format SDK,NPOI可能会放弃对ooxml的支持,当然这取决于用户的需求和Open XML Format SDK的稳定性和速度。从目前而言,NPOI有几大优势

第一,完全基于.NET 2.0,而非.NET 3.0/3.5。

第二,读写速度快(有个国外的兄弟回复说,他原来用ExcelPackage生成用了4-5个小时,现在只需要4-5分钟)

第三,稳定性好(相对于用Office OIA而言,毕竟那东西是基于Automation做的,在Server上跑个Automation的东西,想想都觉得可怕),跑过了将近1000个测试用例(来自于POI的testcase目录)

第四,API简单易用,当然这得感谢POI的设计师们

第五,完美支持Excel 2003格式(据说myxls无法正确读取xls模板,但NPOI可以),以后也许是所有Office 2003格式

希望NPOI把这些优势继续发扬下去,这样NPOI才会更有竞争力。

 

1.6 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格式读写库

分类: NPOI 标签: 版权简介资源

NPOI 实践: .NET导入Excel文件的另一种选择

2013年1月19日 tonyqus 4 条评论

作者:Tony Qu

 

NPOI之所以强大,并不是因为它支持导出Excel,而是因为它支持导入Excel,并能“理解”OLE2文档结构,这也是其他一些Excel读写库比较弱的方面。通常,读入并理解结构远比导出来得复杂,因为导入你必须假设一切情况都是可能的,而生成你只要保证满足你自己需求就可以了,如果把导入需求和生成需求比做两个集合,那么生成需求通常都是导入需求的子集,这一规律不仅体现在Excel读写库中,也体现在pdf读写库中,目前市面上大部分的pdf库仅支持生成,不支持导入。

如果你不相信NPOI能够很好的理解OLE2文档格式,那就去下载POIFS Brower。具体可以参考这篇文章的介绍:Office文件格式解惑。当然单单理解OLE2是不够的,因为Excel文件格式是BIFF,但BIFF是以OLE2为基础的,做个很形象的比喻就是:OLE2相当于磁盘的FAT格式,BIFF相当于文件和文件夹。NPOI负责理解BIFF格式的代码基本都在HSSF命名空间里面。

好了,刚才废话了一会儿,主要是给大家打打基础,现在进入正题。

 

本文将以DataTable为容器读入某xls的第一个工作表的数据(最近群里面很多人问这个问题)。

在开始之前,我们先来补些基础知识。每一个xls都对应一个唯一的HSSFWorkbook,每一个HSSFWorkbook会有若干个HSSFSheet,而每一个HSSFSheet包含若干HSSFRow(Excel 2003中不得超过65535行),每一个HSSFRow又包含若干个HSSFCell(Excel 2003中不得超过256列)。

为了遍历所有的单元格,我们就得获得某一个HSSFSheet的所有HSSFRow,通常可以用HSSFSheet.GetRowEnumerator()。如果要获得某一特定行,可以直接用HSSFSheet.GetRow(rowIndex)。另外要遍历我们就必须知道边界,有一些属性我们是可以用的,比如HSSFSheet.FirstRowNum(工作表中第一个有数据行的行号)、HSSFSheet.LastRowNum(工作表中最后一个有数据行的行号)、HSSFRow.FirstCellNum(一行中第一个有数据列的列号)、HSSFRow.LastCellNum(一行中最后一个有数据列的列号)。

基础知识基本上补得差不多了,现在开工!

 

首先我们要准备一个用于打开文件流的函数InitializeWorkbook,由于文件读完后就没用了,所以这里直接用using(养成好习惯,呵呵)。

1
2
3
4
5
6
7
8
9
10
11
HSSFWorkbook hssfworkbook;
 
void InitializeWorkbook( string path)
{
     //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.
     using (FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read))
     {
         hssfworkbook = new HSSFWorkbook(file);
     }
}

接下来我们要开始写最重要的函数ConvertToDataTable,即把HSSF的数据放到一个DataTable中。

1
2
3
4
5
6
7
8
9
10
11
12
13
HSSFSheet sheet = hssfworkbook.GetSheetAt(0);
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
while (rows.MoveNext())
{
     HSSFRow row = (HSSFRow)rows.Current;
     //TODO::Create DataTable row
 
     for ( int i = 0; i < row.LastCellNum; i++)
     {
         HSSFCell cell = row.GetCell(i);
         //TODO::set cell value to the cell of DataTables
     }
}

上面的结构大家都应该能看懂吧,无非就是先遍历行,再遍历行中的每一列。这里引出了一个难点,由于Excel的单元格有好几种类型,类型不同显示的东西就不同,具体的类型有 布尔型、数值型、文本型、公式型、空白、错误。

1
2
3
4
5
6
7
8
9
10
public enum HSSFCellType
{
     Unknown = -1,
     NUMERIC = 0,
     STRING = 1,
     FORMULA = 2,
     BLANK = 3,
     BOOLEAN = 4,
     ERROR = 5
}

这里的HSSFCellType描述了所有的类型,但细心的朋友可能已经发现了,这里没有日期型,这是为什么呢?这是因为Excel底层并没有一定日期型,而是通过数值型来替代,至于如何区分日期和数字,都是由文本显示的样式决定的,在NPOI中则是由HSSFDataFormat来处理。为了能够方便的获得所需要的类型所对应的文本,我们可以使用HSSFCell.ToString()来处理。

于是刚才的代码则变成了这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
HSSFSheet sheet = hssfworkbook.GetSheetAt(0);
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
DataTable dt = new DataTable();
for ( int j = 0; j < 5; j++)
{
     dt.Columns.Add(Convert.ToChar((( int ) 'A' )+j).ToString());
}
while (rows.MoveNext())
{
     HSSFRow row = (HSSFRow)rows.Current;
     DataRow dr = dt.NewRow();
     for ( int i = 0; i < row.LastCellNum; i++)
     {
         HSSFCell cell = row.GetCell(i);
         if (cell == null )
         {
             dr[i] = null ;
         }
         else
         {
             dr[i] = cell.ToString();
         }
     }
     dt.Rows.Add(dr);
}

是不是很简单,呵呵!

当然,如果你要对某个特定的单元格类型做特殊处理,可以通过判HSSFCell.CellType来解决,比如下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
switch (cell.CellType)
{
     case HSSFCellType.BLANK:
         dr[i] = "[null]" ;
         break ;
     case HSSFCellType.BOOLEAN:
         dr[i] = cell.BooleanCellValue;
         break ;
     case HSSFCellType.NUMERIC:
         dr[i] = cell.ToString();    //This is a trick to get the correct value of the cell. NumericCellValue will return a numeric value no matter the cell value is a date or a number.
         break ;
     case HSSFCellType.STRING:
         dr[i] = cell.StringCellValue;
         break ;
     case HSSFCellType.ERROR:
         dr[i] = cell.ErrorCellValue;
         break ;
     case HSSFCellType.FORMULA:
     default :
         dr[i] = "=" +cell.CellFormula;
         break ;
}

这里只是举个简单的例子。

 

完整代码下载:http://files.cnblogs.com/tonyqus/ImportXlsToDataTable.zip

注意,此代码中不包括NPOI的assembly,否则文件会很大,所以建议去npoi.codeplex.com下载。

分类: NPOI 标签: Excelexcel2003importNPOIxls导入

NPOI 1.2 教程–3.1 基于.xls模板生成Excel文件

2013年1月19日 tonyqus 1 条评论

作者:Tony Qu

 

尽管NPOI能够从头开始生成Excel文件,但在实际生产环境中有很多现成的表格,我们不可能没事就去从头开始生成一个Excel,更多时候我们更愿意选择比较偷懒的方法——那就是用模板文件。NPOI一大特色之一就是能够轻松读取Office Excel 97-2003的格式,即使里面有NPOI不支持的VBA宏、图表以及Pivot表之类的高级记录,NPOI也能够保证不丢失数据(说实话,要完全能够识别所有的Excel内部记录几乎是不可能的,更何况如今又多出了Office Excel 2007 binary file,即.xlsb)。

现在我们转入正题,出于演示目的,我做了一个简单的销售量表,里面应用了文字颜色、背景色、文本居中、公式、千分位分隔符、边框等效果,当然实际的生产环境里可能还有更加复杂的Excel模板。如下图

image

我们的程序就是要填充12个月的销售量,Total能够自动根据填充的值计算出总量。

(这里要提一下,以往如果我们用HTML方式输出xls,我们必须在服务器端做Total计算,并且这个值在下载后永远都是静态的,没有公式,即使用户要修改里面的数据,总值也不会改变。这也是为什么NPOI一直提倡生成真正的Excel文件。)

代码其实很简单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//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的使用者来说基本上和读取普通文件没有什么两样。

最终生成的效果如下所示:

image

发现了没,就连千分位分隔符也都保留着,一切就像人工填写的一样。

 

本范例完整代码请见NPOI.Examples中的GenerateXlsFromXlsTemplate项目。

分类: NPOI 标签: Excel 2003Excel 97MicrosoftNPOIpoixls

NPOI 1.2 教程–2.6.3 组合行、列

2013年1月19日 tonyqus 没有评论

作者:Tony Qu

 

Excel 2007中有一个面板是专门用于设置组合功能的,叫做“分级显示”面板,如下所示:

image

可能我们在过去生成Excel文件的时候根本不会用这个功能,也没办法用,因为cvs法和html法没办法控制这些东西。这里简单的介绍一下什么叫做组合:

组合分为行组合和列组合,所谓行组合,就是让n行组合成一个集合,能够进行展开和合拢操作,在Excel中显示如下:

image

图中左侧就是用于控制行组合折叠的图标,图中上部就是用于控制列组合的,是不是有点像TreeView中的折叠节点?很多时候由于数据太多,为了让用户对于大量数据一目了然,我们可以使用行列组合来解决显示大纲,这和Visual Studio 里面的region的概念是类似的。

细心的朋友可能已经注意到了,我们其实可以对一行做多次组合操作,这就是分级显示的概念,图中就把行2-3分为2个组合,第2行到第4行为一个组合,第2行到第5行一个组合,所以是分两级。

在NPOI中,要实现分组其实并不难,你只需要调用HSSFSheet.GroupRow和HSSFSheet.GroupColumn这两个方法就可以了。

 

首先我们来看HSSFSheet.GroupRow,GroupRow有2个参数,分别是fromRow和toRow,表示起始行号和结束行号,这些行号都是从0开始算起的。

1
2
3
HSSFWorkbook hssfworkbook = new HSSFWorkbook();
HSSFSheet s = hssfworkbook.CreateSheet( "Sheet1" );
s.GroupRow(1, 3);

上面的代码把第2行到第4行做了组合。

要组合列,其实代码很相似,如下所示:

1
s.GroupColumn(1,3)

上面的代码把B至D列做了组合。

正如上图中Excel的“分级显示”面板所示,有“组合”,也一定有“取消组合”,NPOI中你可以用HSSFSheet.UngroupRow和HSSFSheet.UngroupColumn,参数和GroupXXX是一样的,如果要取消第2到第4行的组合,就可以用下面的代码:

1
s.UngroupColumn(1,3)

 

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

分类: NPOI 标签: Excel 2003Excel 97MicrosoftNPOIpoixls

NPOI 1.2 教程–2.6.5显示/隐藏Excel网格线

2013年1月19日 tonyqus 没有评论

作者:Tony Qu

 

有些时候,我们需要网格线,而有些时候我们不需要,这取决于实际的业务需求。前两天inmegin兄就问我,怎么把网格给去掉,因为他们要把Excel文档当Word使,也许是因为Excel排版方便吧。

Excel中的网格线设置是以表(Sheet)为单位进行管理的,这也就意味着你可以让一个表显示网格线,而另一个表不显示,这是不冲突的。

在Excel 2007中,我们通常用“工作表选项”面板来设置这个属性:

image

在面板中,你会发现有2个多选框,一个是查看,一个是打印,也就是说Excel是把查看和打印网格线作为两个设置来处理的,存储的Record也是不同的。

在NPOI中,如果要让网格线在查看时显示/隐藏,你可以HSSFSheet.DisplayGridlines属性,默认值为true(这也是为什么默认情况下我们能够看到网格线)。下面的代码就是让网格线在查看时不可见的:

1
2
3
HSSFWorkbook hssfworkbook = new HSSFWorkbook();
HSSFSheet s1 = hssfworkbook.CreateSheet( "Sheet1" );
s1.DisplayGridlines = false ;

如果要在打印时显示/隐藏网格线,你可以用HSSFSheet.IsGridlinesPrinted属性,默认值为false(这就是默认情况下打印看不到网格线的原因)。代码和上面差不多:

1
s1.IsGridsPrinted = true ;

上面的代码将在打印时显示网格线,打印的效果如下所示。

image

在此也提醒大家,如果这个Excel最终客户有打印意向,可别忘了把IsGridPrinted属性也设置上。

 

相关范例可以参考NPOI 1.2正式版中的DisplayGridlinesInXls项目。

分类: NPOI 标签: Excel 2003Excel 97MicrosoftNPOIpoixls

NPOI 1.2 教程 – 2.5 打印相关设置

2013年1月19日 tonyqus 没有评论

作者:Tony Qu

 

打印设置主要包括方向设置、缩放、纸张设置、页边距等。NPOI 1.2支持大部分打印属性,能够让你轻松满足客户的打印需要。

 

首先是方向设置,Excel支持两种页面方向,即纵向和横向。

image

在NPOI中如何设置呢?你可以通过HSSFSheet.PrintSetup.Landscape来设置,Landscape是布尔类型的,在英语中是横向的意思。如果Landscape等于true,则表示页面方向为横向;否则为纵向。

 

接着是缩放设置,

image

 

这里的缩放比例对应于HSSFSheet.PrintSetup.Scale,而页宽和页高分别对应于HSSFSheet.PrintSetup.FitWidth和HSSFSheet.PrintSetup.FitHeight。要注意的是,这里的PrintSetup.Scale应该被设置为0-100之间的值,而不是小数。

 

image

接下来就是纸张设置了,对应于HSSFSheet.PrintSetup.PaperSize,但这里的PaperSize并不是随便设置的,而是由一些固定的值决定的,具体的值与对应的纸张如下表所示:

纸张
1 US Letter 8 1/2 x 11 in
2 US Letter Small 8 1/2 x 11 in
3 US Tabloid 11 x 17 in
4 US Ledger 17 x 11 in
5 US Legal 8 1/2 x 14 in
6 US Statement 5 1/2 x 8 1/2 in
7 US Executive 7 1/4 x 10 1/2 in
8 A3 297 x 420 mm
9 A4 210 x 297 mm
10 A4 Small 210 x 297 mm
11 A5 148 x 210 mm
12 B4 (JIS) 250 x 354
13 B5 (JIS) 182 x 257 mm
14 Folio 8 1/2 x 13 in
15 Quarto 215 x 275 mm
16 10 x 14 in
17 11 x 17 in
18 US Note 8 1/2 x 11 in
19 US Envelope #9 3 7/8 x 8 7/8
20 US Envelope #10 4 1/8 x 9 1/2
21 US Envelope #11 4 1/2 x 10 3/8
22 US Envelope #12 4 \276 x 11
23 US Envelope #14 5 x 11 1/2
24 C size sheet
25 D size sheet
26 E size sheet
27 Envelope DL 110 x 220mm
28 Envelope C5 162 x 229 mm
29 Envelope C3 324 x 458 mm
30 Envelope C4 229 x 324 mm
31 Envelope C6 114 x 162 mm
32 Envelope C65 114 x 229 mm
33 Envelope B4 250 x 353 mm
34 Envelope B5 176 x 250 mm
35 Envelope B6 176 x 125 mm
36 Envelope 110 x 230 mm
37 US Envelope Monarch 3.875 x 7.5 in
38 6 3/4 US Envelope 3 5/8 x 6 1/2 in
39 US Std Fanfold 14 7/8 x 11 in
40 German Std Fanfold 8 1/2 x 12 in
41 German Legal Fanfold 8 1/2 x 13 in
42 B4 (ISO) 250 x 353 mm
43 Japanese Postcard 100 x 148 mm
44 9 x 11 in
45 10 x 11 in
46 15 x 11 in
47 Envelope Invite 220 x 220 mm
48 RESERVED–DO NOT USE
49 RESERVED–DO NOT USE
50 US Letter Extra 9 \275 x 12 in
51 US Legal Extra 9 \275 x 15 in
52 US Tabloid Extra 11.69 x 18 in
53 A4 Extra 9.27 x 12.69 in
54 Letter Transverse 8 \275 x 11 in
55 A4 Transverse 210 x 297 mm
56 Letter Extra Transverse 9\275 x 12 in
57 SuperA/SuperA/A4 227 x 356 mm
58 SuperB/SuperB/A3 305 x 487 mm
59 US Letter Plus 8.5 x 12.69 in
60 A4 Plus 210 x 330 mm
61 A5 Transverse 148 x 210 mm
62 B5 (JIS) Transverse 182 x 257 mm
63 A3 Extra 322 x 445 mm
64 A5 Extra 174 x 235 mm
65 B5 (ISO) Extra 201 x 276 mm
66 A2 420 x 594 mm
67 A3 Transverse 297 x 420 mm
68 A3 Extra Transverse 322 x 445 mm
69 Japanese Double Postcard 200 x 148 mm
70 A6 105 x 148 mm
71 Japanese Envelope Kaku #2
72 Japanese Envelope Kaku #3
73 Japanese Envelope Chou #3
74 Japanese Envelope Chou #4
75 Letter Rotated 11 x 8 1/2 11 in
76 A3 Rotated 420 x 297 mm
77 A4 Rotated 297 x 210 mm
78 A5 Rotated 210 x 148 mm
79 B4 (JIS) Rotated 364 x 257 mm
80 B5 (JIS) Rotated 257 x 182 mm
81 Japanese Postcard Rotated 148 x 100 mm
82 Double Japanese Postcard Rotated 148 x 200 mm
83 A6 Rotated 148 x 105 mm
84 Japanese Envelope Kaku #2 Rotated
85 Japanese Envelope Kaku #3 Rotated
86 Japanese Envelope Chou #3 Rotated
87 Japanese Envelope Chou #4 Rotated
88 B6 (JIS) 128 x 182 mm
89 B6 (JIS) Rotated 182 x 128 mm
90 12 x 11 in
91 Japanese Envelope You #4
92 Japanese Envelope You #4 Rotated
93 PRC 16K 146 x 215 mm
94 PRC 32K 97 x 151 mm
95 PRC 32K(Big) 97 x 151 mm
96 PRC Envelope #1 102 x 165 mm
97 PRC Envelope #2 102 x 176 mm
98 PRC Envelope #3 125 x 176 mm
99 PRC Envelope #4 110 x 208 mm
100 PRC Envelope #5 110 x 220 mm
101 PRC Envelope #6 120 x 230 mm
102 PRC Envelope #7 160 x 230 mm
103 PRC Envelope #8 120 x 309 mm
104 PRC Envelope #9 229 x 324 mm
105 PRC Envelope #10 324 x 458 mm
106 PRC 16K Rotated
107 PRC 32K Rotated
108 PRC 32K(Big) Rotated
109 PRC Envelope #1 Rotated 165 x 102 mm
110 PRC Envelope #2 Rotated 176 x 102 mm
111 PRC Envelope #3 Rotated 176 x 125 mm
112 PRC Envelope #4 Rotated 208 x 110 mm
113 PRC Envelope #5 Rotated 220 x 110 mm
114 PRC Envelope #6 Rotated 230 x 120 mm
115 PRC Envelope #7 Rotated 230 x 160 mm
116 PRC Envelope #8 Rotated 309 x 120 mm
117 PRC Envelope #9 Rotated 324 x 229 mm
118 PRC Envelope #10 Rotated 458 x 324 mm

(此表摘自《Excel Binary File Format (.xls) Structure Specification.pdf》)

HSSFSheet下面定义了一些xxxx_PAPERSIZE的常量,但都是非常常用的纸张大小,如果满足不了你的需要,可以根据上表自己给PaperSize属性赋值。所以,如果你要设置纸张大小可以用这样的代码:

HSSFSheet.PrintSetup.PaperSize=HSSFSheet.A4_PAPERSIZE;

HSSFSheet.PrintSetup.PaperSize=9; (A4 210*297mm)

 

image

再下来就是打印的起始页码,它对应于HSSFSheet.PrintSetup.PageStart和HSSFSheet.PrintSetup.UsePage,如果UsePage=false,那么就相当于“自动”,这时PageStart不起作用;如果UsePage=true,PageStart才会起作用。所以在设置PageStart之前,必须先把UsePage设置为true。

 

image

“打印”栏中的“网格线”设置对应于HSSFSheet.IsPrintGridlines,请注意,这里不是HSSFSheet.PrintSetup下面,所以别搞混了。这里之所以不隶属于PrintSetup是由底层存储该信息的record决定的,底层是把IsGridsPrinted放在GridsetRecord里面的,而不是PrintSetupRecord里面的,尽管界面上是放在一起的。另外还有一个HSSFSheet.IsGridsPrinted属性,这个属性对应于底层的gridset Record,但这个record是保留的,从微软的文档显示没有任何意义,所以这个属性请不要去设置。

“单色打印”则对应于HSSFSheet.PrintSetup.NoColors,这是布尔类型的,值为true时,表示单色打印。

“草稿品质”对应于HSSFSheet.PrintSetup.IsDraft,也是布尔类型的,值为true时,表示用草稿品质打印。

这里的打印顺序是由HSSFSheet.PrintSetup.LeftToRight决定的,它是布尔类型的,当为true时,则表示“先行后列”;如果是false,则表示“先列后行”。

 

在NPOI 1.2中,“行号列标”、“批注”和“错误单元格打印为”、“页边距”暂不支持,将在以后的版本中支持。

 

有关打印的范例可以参考 NPOI 1.2正式版 中的 SetPrintSettingsInXls 项目。

分类: NPOI 标签: Excel 2003Excel 97MicrosoftNPOIpoixls

NPOI 1.2 教程 – 2.2.1 设置单元格格式

2013年1月19日 tonyqus 没有评论

作者:Tony Qu

 

在Excel中我们经常要设置格式,比如说日期格式(yyyymmdd)、小数点格式(1.20)、货币格式($2000)、百分比格式(99.99%)等等,这些东西在过去我们恐怕只能在服务器端生成好,不但增加了服务器端的代码量,还造成了不必要的字符串替换操作,如今NPOI将让服务器从这种完全没有必要的操作中解放出来,一切都将由Excel在客户端处理。

使用NPOI时要注意,所有的格式都是通过CellStyle.DataFormat赋给单元格的,而不是直接赋给单元格。

案例一  日期格式

假设我们现在需要显示的日期的格式为2008年5月5日,可以用下面的代码生成:

1
2
3
4
5
6
7
8
HSSFSheet sheet = hssfworkbook.CreateSheet( "new sheet" );
HSSFCell cell = sheet.CreateRow(0).CreateCell(0);
cell.SetCellValue( new DateTime(2008,5,5));
//set date format
HSSFCellStyle cellStyle = hssfworkbook.CreateCellStyle();
HSSFDataFormat format = hssfworkbook.CreateDataFormat();
cellStyle.DataFormat = format.GetFormat( "yyyy年m月d日" );
cell.CellStyle=cellStyle;

由于这里的“yyyy年m月d日”属于自定义格式(区别于Excel内嵌的格式),所以必须用hssfworkbook.CreateDataFormat()创建一个HSSFDataFormat实例,然后使用format.GetFormat来获取相应的格式,只要是Excel支持的格式表示方式,这种方式都能够实现。

案例二 保留2位小数

假设我们有个单元格的值为1.2,怎么显示成1.20呢?在Excel中可以用“0.00”来表示,所以下面的代码就能完成:

1
2
3
4
5
6
7
8
// Create a row and put some cells in it. Rows are 0 based.
HSSFCell cell = sheet.CreateRow(0).CreateCell(0);
//set value for the cell
cell.SetCellValue(1.2);
//number format with 2 digits after the decimal point - "1.20"
HSSFCellStyle cellStyle = hssfworkbook.CreateCellStyle();
cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat( "0.00" );
cell.CellStyle = cellStyle;

 

这里与上面有所不同,用的是HSSFDataFormat.GetBuiltinFormat()方法,之所以用这个,是因为0.00是Excel内嵌的格式,完整的Excel内嵌格式列表大家可以看这个窗口中的自定义列表:

image

这里就不一一列出了。

案例三 货币格式

货币格式在金融的项目中经常用到,比如说人民币符号¥,美元符号$等,这里可以用下面的代码表示:

1
2
3
4
5
6
HSSFCell cell2 = sheet.CreateRow(1).CreateCell(0);
cell2.SetCellValue(20000);
HSSFCellStyle cellStyle2 = hssfworkbook.CreateCellStyle();
HSSFDataFormat format = hssfworkbook.CreateDataFormat();
cellStyle2.DataFormat = format.GetFormat( "¥#,##0" );
cell2.CellStyle = cellStyle2;

 

注意,这里还加入了千分位分隔符,所以是#,##,至于为什么这么写,你得去问微软,呵呵。

案例四 百分比

百分比在报表中也很常用,其实基本上和上面一样,只是格式表示是0.00%,代码如下:

1
cellStyle4.DataFormat = HSSFDataFormat.GetBuiltinFormat( "0.00%" );

由于这里是内嵌格式,所以直接用HSSFDataFormat.GetBuiltinFormat即可。

案例五 中文大写

在表示金额时,我们时常会用到,我也见过不少兄弟实现了数字转中文大小写的工具类,以后你可以尝试让Excel去处理这一切,代码和刚才差不多,也是改格式的表示:

1
2
HSSFDataFormat format = hssfworkbook.CreateDataFormat();
cellStyle6.DataFormat = format.GetFormat( "[DbNum2][$-804]0" );

 

由于是自定义格式,所以用了HSSFDataFormat.GetFormat,相信你对这两种获取格式的形式的区别越来越熟悉了。

案例六 科学计数法

这东西数学课上我们都学过,虽然用的不多,但是既然Excel支持,这里也提一下:

1
cellStyle3.DataFormat = HSSFDataFormat.GetBuiltinFormat( "0.00E+00" );

 

下面展示下以上这些例子的显示效果:

image

最后总结一下HSSFDataFormat.GetFormat和HSSFDataFormat.GetBuiltinFormat的区别:

当使用Excel内嵌的(或者说预定义)的格式时,直接用HSSFDataFormat.GetBuiltinFormat静态方法即可。

当使用自己定义的格式时,必须先调用HSSFWorkbook.CreateDataFormat(),因为这时在底层会先找有没有匹配的内嵌FormatRecord,如果没有就会新建一个FormatRecord,所以必须先调用这个方法,然后你就可以用获得的HSSFDataFormat实例的GetFormat方法了,当然相对而言这种方式比较麻烦,所以内嵌格式还是用HSSFDataFormat.GetBuiltinFormat静态方法更加直接一些。不过自定义的格式也不是天马行空随便定义,还是要参照Excel的格式表示来定义,具体请看相关的Excel教程。

注意:自定义的FormatRecord是嵌入xls文件内部的,所以不用担心对方Excel中有没有定义过这种格式,都是能够正常使用的。

 

相关范例请参考NPOI 1.2正式版中的NumberFormatInXls项目。

分类: NPOI 标签: Excel 2003Excel 97MicrosoftNPOIpoixls

NPOI 1.2 教程 – 2.2.2 单元格合并

2013年1月19日 tonyqus 没有评论

作者:Tony Qu

 

合并单元格在制作表格时很有用,比如说表格的标题就经常是把第一行的单元格合并居中。那么在NPOI中应该如何实现单元格的合并呢?

为了实现这一功能,NPOI引入了新的概念,即Region,因为合并单元格,其实就是设定一个区域。下面说一下Region类的参数,Region总共有4个参数,如下所示

Region的参数 说明
FirstRow 区域中第一个单元格的行号
FirstColumn 区域中第一个单元格的列号
LastRow 区域中最后一个单元格的行号
LastColumn 区域中最后一个单元格的列号

由于单元格的合并都是在表的基础上建立的,所以我们得先建Sheet:

1
2
HSSFWorkbook hssfworkbook = new HSSFWorkbook();
HSSFSheet sheet = hssfworkbook.CreateSheet( "new sheet" );

接下来我们根据实际场景来做一些演示。

场景一 标题行的合并

这种场景是最常见的,比如说我们要建立一张销售情况表,英文叫Sales Report

image

我们先设置居中和字体样式,这里我们采用20号字体,代码如下:

1
2
3
4
5
6
7
8
9
HSSFRow row = sheet.CreateRow(0);
HSSFCell cell = row.CreateCell(0);
cell.SetCellValue( "Sales Report" );
HSSFCellStyle style = hssfworkbook.CreateCellStyle();
style.Alignment = HSSFCellStyle.ALIGN_CENTER;
HSSFFont font = hssfworkbook.CreateFont();
font.FontHeight = 20*20;
style.SetFont(font);
cell.CellStyle = style;

要产生图中的效果,即把A1:F1这6个单元格合并,然后添加合并区域:

1
sheet.AddMergedRegion( new Region(0, 0, 0, 5));

 

场景二 多行合并

看完场景一,你可不要认为多行合并就需要一行一行做,其实也只需要一行代码,比如说我们要把C3:E5合并为一个单元格,那么就可以用下面的代码:

image

1
sheet.AddMergedRegion( new Region(2, 2, 4, 4));

提示 即使你没有用CreateRow和CreateCell创建过行或单元格,也完全可以直接创建区域然后把这一区域合并,Excel的区域合并信息是单独存储的,和RowRecord、ColumnInfoRecord不存在直接关系。

 

相关范例请参考NPOI 1.2正式版中的MergedCellInXls项目。

分类: NPOI 标签: Excel 2003Excel 97MicrosoftNPOIpoixls

NPOI 1.2 教程 – 2.2.3 单元格对齐相关设置

2013年1月19日 tonyqus 1 条评论

作者:Tony Qu

 

本节将围绕“对齐”选项卡中的设置展开,虽然实际上你会发现该选项卡中的很多设置和对齐没有什么关系。

image

首先我们用代码创建必要的单元格,代码如下:

1
2
3
4
HSSFWorkbook hssfworkbook = <span style= "color: #0000ff" > new </span> HSSFWorkbook();
HSSFSheet sheet1 = hssfworkbook.CreateSheet(<span style= "color: #006080" > "Sheet1" </span>);
HSSFRow row = sheet1.CreateRow(0);
row.CreateCell(0).SetCellValue(<span style= "color: #006080" > "Test" </span>);

这里我们假设在A0单元格中加入了文本Test。

 

请注意接下来我们要做的所有操作都是在CellStyle的基础上完成的,所以我们创建一个HSSFCellStyle:

1
HSSFCellStyle style=hssfworkbook.CreateCellStyle();

 

水平对齐

这里用的是HSSFCellStyle.Alignment,默认值自然是常规,即HSSFCellStyle.ALIGN_GENERAL。

如果是左侧对齐就是

1
style.Alignment = HSSFCellStyle.ALIGN_LEFT;

如果是居中对齐就是

1
style.Alignment = HSSFCellStyle.ALIGN_CENTER;

如果是右侧对齐就是

1
style.Alignment = HSSFCellStyle.ALIGN_RIGHT;

如果是跨列举中就是

1
style.Alignment = HSSFCellStyle.ALIGN_CENTER_SELECTION;

如果是两端对齐就是

1
style.Alignment = HSSFCellStyle.ALIGN_JUSTIFY;

如果是填充就是

1
style.Alignment = HSSFCellStyle.ALIGN_FILL;

 

注意:以上选项仅当有足够的宽度时才能产生效果,不设置宽度恐怕看不出区别。

 

垂直对齐

这里用的是HSSFCellStyle.VerticalAlignment,默认值为居中,即HSSFCellStyle.VERTICAL_CENTER

如果是靠上就是

1
style.VerticalAlignment=HSSFCellStyle.VERTICAL_TOP

如果是居中就是

1
style.VerticalAlignment=HSSFCellStyle.VERTICAL_CENTER

如果是靠下就是

1
style.VerticalAlignment=HSSFCellStyle.VERTICAL_BOTTOM

如果是两端对齐就是

1
style.VerticalAlignment=HSSFCellStyle.VERTICAL_JUSTIFY

注意:以上选项仅当有足够的高度时才能产生效果,不设置高度恐怕看不出区别。

 

自动换行

自动换行翻译成英文其实就是Wrap的意思,所以这里我们应该用WrapText属性,这是一个布尔属性

1
style.WrapText = <span style= "color: #0000ff" > true </span>;

效果如下所示:

image

文本缩进

image

这是一个不太引人注意的选项,所以这里给张图出来,让大家知道是什么,缩进说白了就是文本前面的空白,我们同样可以用属性来设置,这个属性叫做Indention。

1
style.Indention = 3;

文本旋转

文本方向大家一定在Excel中设置过,上图中就是调整界面,主要参数是度数,那么我们如何在NPOI中设置呢?

1
style.Rotation=(<span style= "color: #0000ff" > short </span>)90;

以上代码是把单元格A1中的文本逆时针旋转90度,等同于下图中的设置:

image  

请注意,这里的Rotation取值是从-90到90,而不是0-180度。

 

最后别忘了把样式变量style赋给HSSFCellStyle.CellStyle,否则就前功尽弃了,呵呵!

 

以上的一些功能,比如文本旋转和自动换行,使用传统的cvs和html法恐怕是无法实现的。随着学习的不断深入,你将越来越意识到使用NPOI生成Excel其实如此简单。

相关范例请参考NPOI 1.2正式版中的SetAlignmentInXls和RotateTextInXls。

分类: NPOI 标签: Excel 2003Excel 97MicrosoftNPOIpoixls
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值