您的位置:首页 > 编程语言 > ASP

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

2011-10-12 09:19 861 查看
作者:Tony Qu
NPOI官方网站:http://npoi.codeplex.com/
 
在Excel中我们经常要设置格式,比如说日期格式(yyyymmdd)、小数点格式(1.20)、货币格式($2000)、百分比格式(99.99%)等等,这些东西在过去我们恐怕只能在服务器端生成好,不但增加了服务器端的代码量,还造成了不必要的字符串替换操作,如今NPOI将让服务器从这种完全没有必要的操作中解放出来,一切都将由Excel在客户端处理。
使用NPOI时要注意,所有的格式都是通过CellStyle.DataFormat赋给单元格的,而不是直接赋给单元格。
案例一  日期格式[/u]
假设我们现在需要显示的日期的格式为2008年5月5日,可以用下面的代码生成:

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位小数[/u]
假设我们有个单元格的值为1.2,怎么显示成1.20呢?在Excel中可以用“0.00”来表示,所以下面的代码就能完成:

// 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内嵌格式列表大家可以看这个窗口中的自定义列表:



这里就不一一列出了。
案例三 货币格式[/u]
货币格式在金融的项目中经常用到,比如说人民币符号¥,美元符号$等,这里可以用下面的代码表示:

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;


 
注意,这里还加入了千分位分隔符,所以是#,##,至于为什么这么写,你得去问微软,呵呵。
案例四 百分比[/u]
百分比在报表中也很常用,其实基本上和上面一样,只是格式表示是0.00%,代码如下:

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


由于这里是内嵌格式,所以直接用HSSFDataFormat.GetBuiltinFormat即可。
案例五 中文大写[/u]
在表示金额时,我们时常会用到,我也见过不少兄弟实现了数字转中文大小写的工具类,以后你可以尝试让Excel去处理这一切,代码和刚才差不多,也是改格式的表示:

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


 
由于是自定义格式,所以用了HSSFDataFormat.GetFormat,相信你对这两种获取格式的形式的区别越来越熟悉了。
案例六 科学计数法[/u]
这东西数学课上我们都学过,虽然用的不多,但是既然Excel支持,这里也提一下:

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


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



最后总结一下HSSFDataFormat.GetFormat和HSSFDataFormat.GetBuiltinFormat的区别:
当使用Excel内嵌的(或者说预定义)的格式时,直接用HSSFDataFormat.GetBuiltinFormat静态方法即可。
当使用自己定义的格式时,必须先调用HSSFWorkbook.CreateDataFormat(),因为这时在底层会先找有没有匹配的内嵌FormatRecord,如果没有就会新建一个FormatRecord,所以必须先调用这个方法,然后你就可以用获得的HSSFDataFormat实例的GetFormat方法了,当然相对而言这种方式比较麻烦,所以内嵌格式还是用HSSFDataFormat.GetBuiltinFormat静态方法更加直接一些。不过自定义的格式也不是天马行空随便定义,还是要参照Excel的格式表示来定义,具体请看相关的Excel教程。
注意:自定义的FormatRecord是嵌入xls文件内部的,所以不用担心对方Excel中有没有定义过这种格式,都是能够正常使用的。
 
相关范例请参考NPOI 1.2正式版中的NumberFormatInXls项目。

作者:Tony Qu
NPOI官方网站:http://npoi.codeplex.com/
 
合并单元格在制作表格时很有用,比如说表格的标题就经常是把第一行的单元格合并居中。那么在NPOI中应该如何实现单元格的合并呢?
为了实现这一功能,NPOI引入了新的概念,即Region,因为合并单元格,其实就是设定一个区域。下面说一下Region类的参数,Region总共有4个参数,如下所示
Region的参数说明
FirstRow区域中第一个单元格的行号
FirstColumn区域中第一个单元格的列号
LastRow区域中最后一个单元格的行号
LastColumn区域中最后一个单元格的列号
由于单元格的合并都是在表的基础上建立的,所以我们得先建Sheet:

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


接下来我们根据实际场景来做一些演示。
 
场景一 标题行的合并[/u]
这种场景是最常见的,比如说我们要建立一张销售情况表,英文叫Sales Report



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

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个单元格合并,然后添加合并区域:

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


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




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


提示 即使你没有用CreateRow和CreateCell创建过行或单元格,也完全可以直接创建区域然后把这一区域合并,Excel的区域合并信息是单独存储的,和RowRecord、ColumnInfoRecord不存在直接关系。
 
相关范例请参考NPOI 1.2正式版中的MergedCellInXls项目。


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

作者:Tony Qu
NPOI官方网站:http://npoi.codeplex.com/
 
本节将围绕“对齐”选项卡中的设置展开,虽然实际上你会发现该选项卡中的很多设置和对齐没有什么关系。合并单元格已经在2.2.2节讲过了,这里就不提了。



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

HSSFWorkbook hssfworkbook = new HSSFWorkbook();
HSSFSheet sheet1 = hssfworkbook.CreateSheet("Sheet1");
HSSFRow row = sheet1.CreateRow(0);
row.CreateCell(0).SetCellValue("Test");


这里我们假设在A0单元格中加入了文本Test。
 
请注意接下来我们要做的所有操作都是在CellStyle的基础上完成的,所以我们创建一个HSSFCellStyle:

HSSFCellStyle style=hssfworkbook.CreateCellStyle();


 
水平对齐[/u]
这里用的是HSSFCellStyle.Alignment,默认值自然是常规,即HSSFCellStyle.ALIGN_GENERAL。
如果是左侧对齐就是

style.Alignment = HSSFCellStyle.ALIGN_LEFT;


如果是居中对齐就是

style.Alignment = HSSFCellStyle.ALIGN_CENTER;


如果是右侧对齐就是

style.Alignment = HSSFCellStyle.ALIGN_RIGHT;


如果是跨列举中就是

style.Alignment = HSSFCellStyle.ALIGN_CENTER_SELECTION;


如果是两端对齐就是

style.Alignment = HSSFCellStyle.ALIGN_JUSTIFY;


如果是填充就是

style.Alignment = HSSFCellStyle.ALIGN_FILL;


 
注意:以上选项仅当有足够的宽度时才能产生效果,不设置宽度恐怕看不出区别。
 
垂直对齐[/u]
这里用的是HSSFCellStyle.VerticalAlignment,默认值为居中,即HSSFCellStyle.VERTICAL_CENTER
如果是靠上就是

style.VerticalAlignment=HSSFCellStyle.VERTICAL_TOP


如果是居中就是

style.VerticalAlignment=HSSFCellStyle.VERTICAL_CENTER


如果是靠下就是

style.VerticalAlignment=HSSFCellStyle.VERTICAL_BOTTOM


如果是两端对齐就是

style.VerticalAlignment=HSSFCellStyle.VERTICAL_JUSTIFY


注意:以上选项仅当有足够的高度时才能产生效果,不设置高度恐怕看不出区别。
 
自动换行[/u]
自动换行翻译成英文其实就是Wrap的意思,所以这里我们应该用WrapText属性,这是一个布尔属性

style.WrapText = true;


效果如下所示:



 
文本缩进[/u]



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

style.Indention = 3;


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

style.Rotation=(short)90;


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


   
 
请注意,这里的Rotation取值是从-90到90,而不是0-180度。
 
最后别忘了把样式变量style赋给HSSFCellStyle.CellStyle,否则就前功尽弃了,呵呵!
 
以上的一些功能,比如文本旋转和自动换行,使用传统的cvs和html法恐怕是无法实现的。随着学习的不断深入,你将越来越意识到使用NPOI生成Excel其实如此简单。
相关范例请参考NPOI 1.2正式版中的SetAlignmentInXls和RotateTextInXls。


NPOI 1.2教程 - 2.2.4 设置单元格边框

作者:Tony Qu
NPOI官方网站:http://npoi.codeplex.com/
 
很多表格中都要使用边框,本节将为你重点讲解NPOI中边框的设置和使用。
边框和其他单元格设置一样也是在HSSFCellStyle上操作的,HSSFCellStyle有2种和边框相关的属性,分别是:
边框相关属性说明范例
Border+方向边框类型BorderTop, BorderBottom,BorderLeft, BorderRight
方向+BorderColor边框颜色TopBorderColor,BottomBorderColor, LeftBorderColor, RightBorderColor
 
其中边框类型分为以下几种:
边框范例图对应的静态值


HSSFCellStyle.BORDER_DOTTED


HSSFCellStyle.BORDER_HAIR


HSSFCellStyle.BORDER_DASH_DOT_DOT


HSSFCellStyle.BORDER_DASH_DOT


HSSFCellStyle.BORDER_DASHED


HSSFCellStyle.BORDER_THIN


HSSFCellStyle.BORDER_MEDIUM_DASH_DOT_DOT


HSSFCellStyle.BORDER_SLANTED_DASH_DOT


HSSFCellStyle.BORDER_MEDIUM_DASH_DOT


HSSFCellStyle.BORDER_MEDIUM_DASHED


HSSFCellStyle.BORDER_MEDIUM


HSSFCellStyle.BORDER_THICK


HSSFCellStyle.BORDER_DOUBLE
至于颜色那就很多了,全部在HSSFColor下面,如HSSFColor.GREEN, HSSFColor.RED,都是静态实例,可以直接引用。
下面我们假设我们要把一个单元格的四周边框都设置上,可以用下面的代码:

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

// Create a row and put some cells in it. Rows are 0 based.
HSSFRow row = sheet.CreateRow(1);
// Create a cell and put a value in it.
HSSFCell cell = row.CreateCell(1);
// Style the cell with borders all around.
HSSFCellStyle style = hssfworkbook.CreateCellStyle();
style.BorderBottom= HSSFCellStyle.BORDER_THIN;
style.BorderLeft= HSSFCellStyle.BORDER_THIN;
style.BorderRight= HSSFCellStyle.BORDER_THIN;
style.BorderTop = HSSFCellStyle.BORDER_THIN ;
cell.CellStyle= style;


这段代码使用了最普通的细边框,使得这个单元格看上去像块空心砖头。



注意:这里我们没有设置边框的颜色,但这不会影响最终的效果,因为Excel会用默认的黑色给边框上色。
 
如果要设置颜色的话,也很简单,如下:

style.BottomBorderColor= HSSFColor.GREEN.index;


以上代码将底部边框设置为绿色,要注意,不是直接把HSSFColor.GREEN赋给XXXXBorderColor属性,而是把index的值赋给它。
 
相关范例请参考NPOI 1.2正式版中的SetBorderStyleInXls项目。


NPOI 1.2教程 - 2.2.5 设置单元格字体

作者:Tony Qu
NPOI官方网站:http://npoi.codeplex.com/
 
本节我们将继续使用NPOI来设置单元格格式,这一节我们主要讲如何设置“字体”。



 
在设置字体之前,我们首先要做的就是创建字体对象,这和创建数字格式很相似。

HSSFFont font = hssfworkbook.CreateFont();


这句话会在Excel文件内部创建相应的FontRecord,所以你不用客户因为自己机器上的Excel没有相应的字体设置而导致设置丢失。
字体在设置完成后,我们就可以把它赋给单元格样式,代码如下:

HSSFCellStyle style1 = hssfworkbook.CreateCellStyle();
style1.SetFont(font);
cell1.CellStyle=style1;


这里的cell1是HSSFCell的一个实例。
 
好了,下面我们就开始对字体进行设置。
字体名称[/u]
这里的字体名称是通过HSSFFont.FontName进行设置的,至于具体的名称,只要是常用字体都可以,比如说Arial, Verdana等,当然也可以是中文字体名,如宋体、黑体等。不过设置字体名称有个前提,那就是假设打开这个xls文件的客户机上有这种字体,如果没有,Excel将使用默认字体。
下面就是设置字体名称为“宋体”的代码:

font.FontName = "宋体";


字号[/u]
与字号有关的属性有两个,一个是FontHeight,一个是FontHeightInPoints。区别在于,FontHeight的值是FontHeightInPoints的20倍,通常我们在Excel界面中看到的字号,比如说12,对应的是FontHeightInPoints的值,而FontHeight要产生12号字体的大小,值应该是240。所以通常建议你用FontHeightInPoint属性。
如果要设置字号为12,代码就是

font.FontHeightInPoints = 12;


 
字体颜色[/u]
这里可能会与CellStyle上的ForegroundColor和BackgroundColor产生混淆,其实所有的字体颜色都是在HSSFFont的实例上设置的,CellStyle的ForegroundColor和BackgroundColor分别指背景填充色和填充图案的颜色,和文本颜色无关。
要设置字体颜色,我们可以用HSSFFont.Color属性,颜色可以通过HSSFColor获得,代码如下所示:

font.Color = HSSFColor.RED.index;


这行代码把文本设置为红色。
 
下划线[/u]
通常我们所说的下划线都是单线条的,其实Excel支持好几种下划线,如下所示:
类型对应的值
单下划线HSSFFont.U_SINGLE
双下划线HSSFFont.U_DOUBLE
会计用单下划线HSSFFont.U_SINGLE_ACCOUNTING
会计用双下划线HSSFFont.U_DOUBLE_ACCOUNTING
无下划线HSSFFont.U_NONE
当你要设置下划线时,可以用HSSFFont.Underline属性,这是一个byte类型的值,例如

font.Underline=HSSFFont.U_SINGLE


这行代码就是设置单下划线的代码。
上标下标[/u]
设置这东西可以用HSSFFont.TypeOffset属性,值有以下几种:
TypeOffset的值说明
HSSFFont.SS_SUPER上标
HSSFFont.SS_SUB下标
HSSFFont.SS_NONE普通,默认值
所以如果你要上标的话,可以用下面的代码:

font.TypeOffset=HSSFFont.SS_SUPER;


删除线[/u]
设置这东西可以用HSSFFont.IsStrikeout属性,当为true时,表示有删除线;为false则表示没有删除线。
 
相关范例请参考NPOI 1.2正式版中的ApplyFontInXls的项目。


NPOI 1.2教程 - 2.2.6设置单元格的背景和图案

作者:Tony Qu
NPOI官方网站:http://npoi.codeplex.com/
 
本节我们将用NPOI来为单元格添加背景和图案。
 
在之前的教程中,我们已经提到HSSFCellStyle有两个背景颜色属性,一个叫FillBackgroundColor,另一个叫FillForegroundColor,但其实这指的都是背景颜色,那为什么还有ForegroundColor呢?为了能够帮助大家理解,我们举一个实际的例子,下面这个图案是Excel的一个单元格:



线是白色的,背景是红色的。这里的线其实就是下面的Excel界面中的图案:



 
至于线的颜色则是图案颜色,即白色。
所以以上单元格如果要用NPOI来设置就可以用以下代码完成:

//fill background
HSSFCellStyle style8 = hssfworkbook.CreateCellStyle();
style8.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.WHITE.index;
style8.FillPattern = HSSFCellStyle.SQUARES;
style8.FillBackgroundColor = NPOI.HSSF.Util.HSSFColor.RED.index;
sheet1.CreateRow(7).CreateCell(0).CellStyle = style8;


现在是不是清楚一些了,这里的FillPattern就图案样式,所有的枚举值都是HSSFCellStyle的常量;FillForegroundColor就是图案的颜色,而FillBackgroundColor则是背景的颜色,即红色。
下面罗列一下图案样式及其对应的值:
图案样式常量


HSSFCellStyle.NO_FILL


HSSFCellStyle.ALT_BARS


HSSFCellStyle.FINE_DOTS


HSSFCellStyle.SPARSE_DOTS


HSSFCellStyle.LESS_DOTS


HSSFCellStyle.LEAST_DOTS


HSSFCellStyle.BRICKS


HSSFCellStyle.BIG_SPOTS


HSSFCellStyle.THICK_FORWARD_DIAG


HSSFCellStyle.THICK_BACKWARD_DIAG


HSSFCellStyle.THICK_VERT_BANDS


HSSFCellStyle.THICK_HORZ_BANDS


HSSFCellStyle.THIN_HORZ_BANDS


HSSFCellStyle.THIN_VERT_BANDS


HSSFCellStyle.THIN_BACKWARD_DIAG


HSSFCellStyle.THIN_FORWARD_DIAG


HSSFCellStyle.SQUARES


HSSFCellStyle.DIAMONDS
通过这张表,你将很容易找到自己需要的样式,不用再去一个一个猜测了。
 
相关范例请参考NPOI 1.2正式版中的ColorfullMatrixTable和FillBackgroundInXls。


NPOI 1.2教程 - 2.2.7 设置单元格的宽度和高度

作者:Tony Qu
NPOI官方网站:http://npoi.codeplex.com/
 
在Excel中,单元格的宽度其实就是列的宽度,因为Excel假设这一列的单元格的宽度肯定一致。所以要设置单元格的宽度,我们就得从列的宽度下手,HSSFSheet有个方法叫SetColumnWidth,共有两个参数:一个是列的索引(从0开始),一个是宽度。
现在假设你要设置B列的宽度,就可以用下面的代码:

HSSFWorkbook hssfworkbook = new HSSFWorkbook();
HSSFSheet sheet1 = hssfworkbook.CreateSheet("Sheet1");
sheet1.SetColumnWidth(1, 100 * 256);


这里你会发现一个有趣的现象,SetColumnWidth的第二个参数要乘以256,这是怎么回事呢?其实,这个参数的单位是1/256个字符宽度,也就是说,这里是把B列的宽度设置为了100个字符。
刚才说的是如何设置,那如何去读取一个列的宽度呢?直接用GetColumnWidth方法,这个方法只有一个参数,那就是列的索引号。如下所示:

int col1width = sheet1.GetColumnWidth(1);


 
说完宽度,我们来说高度,在Excel中,每一行的高度也是要求一致的,所以设置单元格的高度,其实就是设置行的高度,所以相关的属性也应该在HSSFRow上,它就是HSSFRow.Height和HeightInPoints,这两个属性的区别在于HeightInPoints的单位是点,而Height的单位是1/20个点,所以Height的值永远是HeightInPoints的20倍。
要设置第一行的高度,可以用如下代码:

sheet1.CreateRow(0).Height = 200*20;


或者

sheet1.CreateRow(0).HeightInPoints = 200;


如果要获得某一行的行高,可以直接拿HSSFRow.Height属性的返回值。
 
你可能觉得一行一行设置行高或者一列一列设置列宽很麻烦,那你可以考虑使用HSSFSheet.DefaultColumnWidth、HSSFSheet.DefaultRowHeight和HSSFSheet.DefaultRowHeightInPoints属性。
一旦设置了这些属性,如果某一行或者某一列没有设置宽度,就会使用默认宽度或高度。代码如下:

sheet1.DefaultColumnWidth=100*256;
sheet1.DefaultRowHeight=30*20;


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


NPOI 1.2教程 - 组合行、列

作者:Tony Qu
NPOI官方网站:http://npoi.codeplex.com/
 
Excel 2007中有一个面板是专门用于设置组合功能的,叫做“分级显示”面板,如下所示:



可能我们在过去生成Excel文件的时候根本不会用这个功能,也没办法用,因为cvs法和html法没办法控制这些东西。这里简单的介绍一下什么叫做组合:
组合分为行组合和列组合,所谓行组合,就是让n行组合成一个集合,能够进行展开和合拢操作,在Excel中显示如下:



图中左侧就是用于控制行组合折叠的图标,图中上部就是用于控制列组合的,是不是有点像TreeView中的折叠节点?很多时候由于数据太多,为了让用户对于大量数据一目了然,我们可以使用行列组合来解决显示大纲,这和Visual Studio 里面的region的概念是类似的。
细心的朋友可能已经注意到了,我们其实可以对一行做多次组合操作,这就是分级显示的概念,图中就把行2-3分为2个组合,第2行到第4行为一个组合,第2行到第5行一个组合,所以是分两级。
在NPOI中,要实现分组其实并不难,你只需要调用HSSFSheet.GroupRow和HSSFSheet.GroupColumn这两个方法就可以了。
 
首先我们来看HSSFSheet.GroupRow,GroupRow有2个参数,分别是fromRow和toRow,表示起始行号和结束行号,这些行号都是从0开始算起的。

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


上面的代码把第2行到第4行做了组合。
要组合列,其实代码很相似,如下所示:

s.GroupColumn(1,3)


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

s.UngroupColumn(1,3)


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


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

作者:Tony Qu
NPOI官方网站:http://npoi.codeplex.com/
 
有些时候,我们需要网格线,而有些时候我们不需要,这取决于实际的业务需求。前两天inmegin兄就问我,怎么把网格给去掉,因为他们要把Excel文档当Word使,也许是因为Excel排版方便吧。
Excel中的网格线设置是以表(Sheet)为单位进行管理的,这也就意味着你可以让一个表显示网格线,而另一个表不显示,这是不冲突的。
 
在Excel 2007中,我们通常用“工作表选项”面板来设置这个属性:



 
在面板中,你会发现有2个多选框,一个是查看,一个是打印,也就是说Excel是把查看和打印网格线作为两个设置来处理的,存储的Record也是不同的。
在NPOI中,如果要让网格线在查看时显示/隐藏,你可以HSSFSheet.DisplayGridlines属性,默认值为true(这也是为什么默认情况下我们能够看到网格线)。下面的代码就是让网格线在查看时不可见的:

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


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

s1.IsGridsPrinted = true;


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



 
 
在此也提醒大家,如果这个Excel最终客户有打印意向,可别忘了把IsGridPrinted属性也设置上。
 
相关范例可以参考NPOI 1.2正式版中的DisplayGridlinesInXls项目。


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

作者:Tony Qu
NPOI官方网站:http://npoi.codeplex.com/
 
打印设置主要包括方向设置、缩放、纸张设置、页边距等。NPOI 1.2支持大部分打印属性,能够让你轻松满足客户的打印需要。
 
首先是方向设置,Excel支持两种页面方向,即纵向和横向。



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



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



接下来就是纸张设置了,对应于HSSFSheet.PrintSetup.PaperSize,但这里的PaperSize并不是随便设置的,而是由一些固定的值决定的,具体的值与对应的纸张如下表所示:
纸张
1US Letter 8 1/2 x 11 in
2US Letter Small 8 1/2 x 11 in
3US Tabloid 11 x 17 in
4US Ledger 17 x 11 in
5US Legal 8 1/2 x 14 in
6US Statement 5 1/2 x 8 1/2 in
7US Executive 7 1/4 x 10 1/2 in
8A3 297 x 420 mm
9A4 210 x 297 mm
10A4 Small 210 x 297 mm
11A5 148 x 210 mm
12B4 (JIS) 250 x 354
13B5 (JIS) 182 x 257 mm
14Folio 8 1/2 x 13 in
15Quarto 215 x 275 mm
1610 x 14 in
1711 x 17 in
18US Note 8 1/2 x 11 in
19US Envelope #9 3 7/8 x 8 7/8
20US Envelope #10 4 1/8 x 9 1/2
21US Envelope #11 4 1/2 x 10 3/8
22US Envelope #12 4 \276 x 11
23US Envelope #14 5 x 11 1/2
24C size sheet
25D size sheet
26E size sheet
27Envelope DL 110 x 220mm
28Envelope C5 162 x 229 mm
29Envelope C3 324 x 458 mm
30Envelope C4 229 x 324 mm
31Envelope C6 114 x 162 mm
32Envelope C65 114 x 229 mm
33Envelope B4 250 x 353 mm
34Envelope B5 176 x 250 mm
35Envelope B6 176 x 125 mm
36Envelope 110 x 230 mm
37US Envelope Monarch 3.875 x 7.5 in
386 3/4 US Envelope 3 5/8 x 6 1/2 in
39US Std Fanfold 14 7/8 x 11 in
40German Std Fanfold 8 1/2 x 12 in
41German Legal Fanfold 8 1/2 x 13 in
42B4 (ISO) 250 x 353 mm
43Japanese Postcard 100 x 148 mm
449 x 11 in
4510 x 11 in
4615 x 11 in
47Envelope Invite 220 x 220 mm
48RESERVED--DO NOT USE
49RESERVED--DO NOT USE
50US Letter Extra 9 \275 x 12 in
51US Legal Extra 9 \275 x 15 in
52US Tabloid Extra 11.69 x 18 in
53A4 Extra 9.27 x 12.69 in
54Letter Transverse 8 \275 x 11 in
55A4 Transverse 210 x 297 mm
56Letter Extra Transverse 9\275 x 12 in
57SuperA/SuperA/A4 227 x 356 mm
58SuperB/SuperB/A3 305 x 487 mm
59US Letter Plus 8.5 x 12.69 in
60A4 Plus 210 x 330 mm
61A5 Transverse 148 x 210 mm
62B5 (JIS) Transverse 182 x 257 mm
63A3 Extra 322 x 445 mm
64A5 Extra 174 x 235 mm
65B5 (ISO) Extra 201 x 276 mm
66A2 420 x 594 mm
67A3 Transverse 297 x 420 mm
68A3 Extra Transverse 322 x 445 mm
69Japanese Double Postcard 200 x 148 mm
70A6 105 x 148 mm
71Japanese Envelope Kaku #2
72Japanese Envelope Kaku #3
73Japanese Envelope Chou #3
74Japanese Envelope Chou #4
75Letter Rotated 11 x 8 1/2 11 in
76A3 Rotated 420 x 297 mm
77A4 Rotated 297 x 210 mm
78A5 Rotated 210 x 148 mm
79B4 (JIS) Rotated 364 x 257 mm
80B5 (JIS) Rotated 257 x 182 mm
81Japanese Postcard Rotated 148 x 100 mm
82Double Japanese Postcard Rotated 148 x 200 mm
83A6 Rotated 148 x 105 mm
84Japanese Envelope Kaku #2 Rotated
85Japanese Envelope Kaku #3 Rotated
86Japanese Envelope Chou #3 Rotated
87Japanese Envelope Chou #4 Rotated
88B6 (JIS) 128 x 182 mm
89B6 (JIS) Rotated 182 x 128 mm
9012 x 11 in
91Japanese Envelope You #4
92Japanese Envelope You #4 Rotated
93PRC 16K 146 x 215 mm
94PRC 32K 97 x 151 mm
95PRC 32K(Big) 97 x 151 mm
96PRC Envelope #1 102 x 165 mm
97PRC Envelope #2 102 x 176 mm
98PRC Envelope #3 125 x 176 mm
99PRC Envelope #4 110 x 208 mm
100PRC Envelope #5 110 x 220 mm
101PRC Envelope #6 120 x 230 mm
102PRC Envelope #7 160 x 230 mm
103PRC Envelope #8 120 x 309 mm
104PRC Envelope #9 229 x 324 mm
105PRC Envelope #10 324 x 458 mm
106PRC 16K Rotated
107PRC 32K Rotated
108PRC 32K(Big) Rotated
109PRC Envelope #1 Rotated 165 x 102 mm
110PRC Envelope #2 Rotated 176 x 102 mm
111PRC Envelope #3 Rotated 176 x 125 mm
112PRC Envelope #4 Rotated 208 x 110 mm
113PRC Envelope #5 Rotated 220 x 110 mm
114PRC Envelope #6 Rotated 230 x 120 mm
115PRC Envelope #7 Rotated 230 x 160 mm
116PRC Envelope #8 Rotated 309 x 120 mm
117PRC Envelope #9 Rotated 324 x 229 mm
118PRC 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)
 



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



“打印”栏中的“网格线”设置对应于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 1.2教程 – 3.1 基于.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项目。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息