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

 

作者:Tony Qu

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

 

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

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

案例一  日期格式

假设我们现在需要显示的日期的格式为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位小数

假设我们有个单元格的值为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内嵌格式列表大家可以看这个窗口中的自定义列表:

image

这里就不一一列出了。

案例三 货币格式

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

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%,代码如下:

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

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

案例五 中文大写

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

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

 

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

案例六 科学计数法

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

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项目。

作者: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");
接下来我们根据实际场景来做一些演示。

 

场景一 标题行的合并

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

image

我们先设置居中和字体样式,这里我们采用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));

 

场景二 多行合并

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

image

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节讲过了,这里就不提了。

image

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

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();

 

水平对齐

这里用的是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;

 

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

 

垂直对齐

这里用的是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

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

 

自动换行

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

style.WrapText = true;

效果如下所示:

image

 

文本缩进

image

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

style.Indention = 3;

 

文本旋转

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

style.Rotation=(short)90;

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

image   

 

请注意,这里的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

 

其中边框类型分为以下几种:

边框范例图 对应的静态值
image HSSFCellStyle.BORDER_DOTTED
image HSSFCellStyle.BORDER_HAIR
image HSSFCellStyle.BORDER_DASH_DOT_DOT
image HSSFCellStyle.BORDER_DASH_DOT
image HSSFCellStyle.BORDER_DASHED
image HSSFCellStyle.BORDER_THIN
image HSSFCellStyle.BORDER_MEDIUM_DASH_DOT_DOT
image HSSFCellStyle.BORDER_SLANTED_DASH_DOT
image HSSFCellStyle.BORDER_MEDIUM_DASH_DOT
image HSSFCellStyle.BORDER_MEDIUM_DASHED
image HSSFCellStyle.BORDER_MEDIUM
image HSSFCellStyle.BORDER_THICK
image 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;

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

image

注意:这里我们没有设置边框的颜色,但这不会影响最终的效果,因为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来设置单元格格式,这一节我们主要讲如何设置“字体”。

image

 

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

HSSFFont font = hssfworkbook.CreateFont();

这句话会在Excel文件内部创建相应的FontRecord,所以你不用客户因为自己机器上的Excel没有相应的字体设置而导致设置丢失。

字体在设置完成后,我们就可以把它赋给单元格样式,代码如下:

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

这里的cell1是HSSFCell的一个实例。

 

好了,下面我们就开始对字体进行设置。

字体名称

这里的字体名称是通过HSSFFont.FontName进行设置的,至于具体的名称,只要是常用字体都可以,比如说Arial, Verdana等,当然也可以是中文字体名,如宋体、黑体等。不过设置字体名称有个前提,那就是假设打开这个xls文件的客户机上有这种字体,如果没有,Excel将使用默认字体。

下面就是设置字体名称为“宋体”的代码:

font.FontName = "宋体";

字号

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

如果要设置字号为12,代码就是

font.FontHeightInPoints = 12;

 

字体颜色

这里可能会与CellStyle上的ForegroundColor和BackgroundColor产生混淆,其实所有的字体颜色都是在HSSFFont的实例上设置的,CellStyle的ForegroundColor和BackgroundColor分别指背景填充色和填充图案的颜色,和文本颜色无关。

要设置字体颜色,我们可以用HSSFFont.Color属性,颜色可以通过HSSFColor获得,代码如下所示:

font.Color = HSSFColor.RED.index;

这行代码把文本设置为红色。

 

下划线

通常我们所说的下划线都是单线条的,其实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

这行代码就是设置单下划线的代码。

上标下标

设置这东西可以用HSSFFont.TypeOffset属性,值有以下几种:

TypeOffset的值 说明
HSSFFont.SS_SUPER 上标
HSSFFont.SS_SUB 下标
HSSFFont.SS_NONE 普通,默认值

所以如果你要上标的话,可以用下面的代码:

font.TypeOffset=HSSFFont.SS_SUPER;

删除线

设置这东西可以用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的一个单元格:

image

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

image

 

至于线的颜色则是图案颜色,即白色。

所以以上单元格如果要用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则是背景的颜色,即红色。

下面罗列一下图案样式及其对应的值:

图案样式 常量
image HSSFCellStyle.NO_FILL
image HSSFCellStyle.ALT_BARS
image HSSFCellStyle.FINE_DOTS
image HSSFCellStyle.SPARSE_DOTS
image HSSFCellStyle.LESS_DOTS
image HSSFCellStyle.LEAST_DOTS
image HSSFCellStyle.BRICKS
image HSSFCellStyle.BIG_SPOTS
image HSSFCellStyle.THICK_FORWARD_DIAG
image HSSFCellStyle.THICK_BACKWARD_DIAG
image HSSFCellStyle.THICK_VERT_BANDS
image HSSFCellStyle.THICK_HORZ_BANDS
image HSSFCellStyle.THIN_HORZ_BANDS
image HSSFCellStyle.THIN_VERT_BANDS
image HSSFCellStyle.THIN_BACKWARD_DIAG
image HSSFCellStyle.THIN_FORWARD_DIAG
image HSSFCellStyle.SQUARES
image 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中有一个面板是专门用于设置组合功能的,叫做“分级显示”面板,如下所示:

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开始算起的。

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中,我们通常用“工作表选项”面板来设置这个属性:

image

 

在面板中,你会发现有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;

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

image

 

 

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

 

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

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

作者:Tony Qu

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

 

打印设置主要包括方向设置、缩放、纸张设置、页边距等。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 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模板。如下图

image

我们的程序就是要填充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的使用者来说基本上和读取普通文件没有什么两样。

 

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

 

 

image

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

 

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

 

转自:http://blog.csdn.net/binyao02123202/article/details/6865077

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值