NPOI使用手册1

转自链接

目录

1.认识NPOI

2.使用NPOI生成xls文件

2.1创建基本内容

2.1.1创建Workbook和Sheet

2.1.2创建DocumentSummaryInformation和SummaryInformation

2.1.3创建单元格

2.1.5创建批注

2.1.6创建页眉和页脚

2.2单元格操作

2.2.1设置格式

2.2.2合并单元格

2.2.3对齐相关设置

2.2.4使用边框

2.2.5字体设置

2.2.6背景和纹理

2.2.7设置宽度和高度

2.3使用Excel公式

2.3.1基本计算

2.3.2 SUM函数

2.3.3日期函数

2.3.4字符串相关函数


NPOI 1.2教程- 1认识NPOI

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

QQ交流群:  78142590

1.4团队介绍

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

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

NPOI 1.2教程- 2.1.1创建Workbook和Sheet

作者: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实例就行了,如下所示:

usingNPOI.HSSF.UserModel;

...

HSSFWorkbookhssfworkbook =newHSSFWorkbook();

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

HSSFSheetsheet = hssfworkbook.CreateSheet("newsheet");

如果要创建标准的Excel文件,即拥有3个Sheet,可以用下面的代码:

hssfworkbook.CreateSheet("Sheet1");

hssfworkbook.CreateSheet("Sheet2");

hssfworkbook.CreateSheet("Sheet3");

最后就是把这个HSSFWorkbook实例写入文件了,代码也很简单,如下所示:

FileStreamfile =newFileStream(@"test.xls", FileMode.Create);

hssfworkbook.Write(file);

file.Close();

这里假设文件名是test.xls,,在创建完FileStream之后,直接调用HSSFWorkbook类的Write方法就可以了。

最后你可以打开test.xls文件确认一下,是不是有3个空的Sheet。

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

NPOI 1.2教程- 2.1.2创建DocumentSummaryInformation和SummaryInformation

作者:Tony Qu

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

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

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

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

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

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

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

提示

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

好了,说到这里,我想大家对于接下来我们要创建的内容有了初步的认识,下面我们就马上动手创建。

首先引用以下这些命名空间:

usingNPOI.HSSF.UserModel;

usingNPOI.HPSF;

usingNPOI.POIFS.FileSystem;

其中与DocummentSummaryInformation和SummaryInformation密切相关的是HPSF命名空间。

首先创建Workbook

HSSFWorkbookhssfworkbook =newHSSFWorkbook();

然后创建DocumentSummaryInformation

DocumentSummaryInformationdsi = PropertySetFactory.CreateDocumentSummaryInformation();

dsi.Company ="NPOI Team";

再创建SummaryInformation

SummaryInformationsi = PropertySetFactory.CreateSummaryInformation();

si.Subject ="NPOI SDK Example";

因为是范例,这里仅各设置了一个属性,其他都没有设置。

现在我们把创建好的对象赋给Workbook,这样才能保证这些信息被写入文件。

hssfworkbook.DocumentSummaryInformation= dsi;

hssfworkbook.SummaryInformation= si;

最后和2.1.1节一样,我们把Workbook通过FileStream写入文件。

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

NPOI 1.2教程- 2.1.3创建单元格

作者:Tony Qu

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

用过Excel的人都知道,单元格是Excel最有意义的东西,我们做任何操作恐怕都要和单元格打交道。在Excel中我们要添加一个单元格只需要点击任何一个单元格,然后输入内容就是了,但是Excel底层其实没有这么简单,不同的单元格是有不同的类型的,比如说数值单元格是用NumberRecord表示,文本单元格是用LabelSSTRecord表示,空单元格是用BlankRecord表示。这也就意味着,在设置单元格时,你必须告诉NPOI你需要创建哪种类型的单元格。

要创建单元格首先要创建单元格所在的行,比如,下面的代码创建了第0行:

HSSFSheetsheet1 = hssfworkbook.CreateSheet("Sheet1");

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

NPOI 1.2教程- 2.1.4创建批注

作者:Tony Qu

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

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

在过去,我们恐怕没有办法实现这一功能,因为无论是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之间,就应该这么写:

HSSFPatriarchpatr = sheet.CreateDrawingPatriarch();

HSSFCommentcomment1 = patr.CreateComment(newHSSFClientAnchor(0, 0, 0, 0, 1, 2 , 4, 4));

下面我们设置这个批注的内容和作者,这个比较简单:

comment1.String=newHSSFRichTextString("Hello World");

comment1.Author="NPOI Team";

最后一步就是把批注赋给某个单元格:

HSSFCell cell= sheet.CreateRow(1).CreateCell(1);

cell.CellComment= comment1;

对于批注,你有两种选择,一种是隐藏(默认),一种是显示(即表单一打开就显示该批注),可以通过comment1.Visible属性来控制。

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

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

NPOI 1.2教程- 2.1.6创建页眉和页脚

作者:Tony Qu

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

很多人并不知道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 Tony Qu(瞿杰)";

以上代码中我添加了页眉的Center内容,Footer的Left和Right内容,在打印预览中看到的效果大概是这样的:

页眉

页脚

至于一些Excel特殊字符,比如说页码可以用&P,当前日期可以用&D,其他的东西你就自己研究吧。

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

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

作者:Tony Qu

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

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

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

案例一日期格式

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

HSSFSheetsheet = hssfworkbook.CreateSheet("newsheet");

HSSFCell cell= sheet.CreateRow(0).CreateCell(0);

cell.SetCellValue(newDateTime(2008,5,5));

//set dateformat

HSSFCellStylecellStyle = hssfworkbook.CreateCellStyle();

HSSFDataFormatformat = 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 arow and put some cells in it. Rows are 0 based.

HSSFCell cell= sheet.CreateRow(0).CreateCell(0);

//set valuefor the cell

cell.SetCellValue(1.2);

//numberformat with 2 digits after the decimal point - "1.20"

HSSFCellStylecellStyle = hssfworkbook.CreateCellStyle();

cellStyle.DataFormat= HSSFDataFormat.GetBuiltinFormat("0.00");

cell.CellStyle= cellStyle;

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

这里就不一一列出了。

案例三货币格式

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

HSSFCellcell2 = sheet.CreateRow(1).CreateCell(0);

cell2.SetCellValue(20000);

HSSFCellStylecellStyle2 = hssfworkbook.CreateCellStyle();

HSSFDataFormatformat = hssfworkbook.CreateDataFormat();

cellStyle2.DataFormat= format.GetFormat("¥#,##0");

cell2.CellStyle= cellStyle2;

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

案例四百分比

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

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

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

案例五中文大写

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

HSSFDataFormatformat = hssfworkbook.CreateDataFormat();

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

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

案例六科学计数法

这东西数学课上我们都学过,虽然用的不多,但是既然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项目。

NPOI 1.2教程- 2.2.2单元格合并

作者:Tony Qu

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

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

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

Region的参数说明

FirstRow区域中第一个单元格的行号

FirstColumn区域中第一个单元格的列号

LastRow区域中最后一个单元格的行号

LastColumn区域中最后一个单元格的列号

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

HSSFWorkbookhssfworkbook =newHSSFWorkbook();

HSSFSheetsheet = hssfworkbook.CreateSheet("newsheet");

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

场景一标题行的合并

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

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

HSSFRow row =sheet.CreateRow(0);

HSSFCell cell= row.CreateCell(0);

cell.SetCellValue("Sales Report");

HSSFCellStylestyle = 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(newRegion(0, 0, 0,5));

场景二多行合并

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

sheet.AddMergedRegion(newRegion(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节讲过了,这里就不提了。

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

HSSFWorkbookhssfworkbook =newHSSFWorkbook();

HSSFSheetsheet1 = hssfworkbook.CreateSheet("Sheet1");

HSSFRow row =sheet1.CreateRow(0);

row.CreateCell(0).SetCellValue("Test");

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

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

HSSFCellStylestyle=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;

效果如下所示:

文本缩进

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

style.Indention= 3;

文本旋转

文本方向大家一定在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,都是静态实例,可以直接引用。

下面我们假设我们要把一个单元格的四周边框都设置上,可以用下面的代码:

HSSFSheetsheet = hssfworkbook.CreateSheet("newsheet");

// Create arow and put some cells in it. Rows are 0 based.

HSSFRow row =sheet.CreateRow(1);

// Create acell and put a value in it.

HSSFCell cell= row.CreateCell(1);

// Style thecell with borders all around.

HSSFCellStylestyle = 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没有相应的字体设置而导致设置丢失。

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

HSSFCellStylestyle1 = 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的一个单元格:

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

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

所以以上单元格如果要用NPOI来设置就可以用以下代码完成:

//fillbackground

HSSFCellStylestyle8 = 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列的宽度,就可以用下面的代码:

HSSFWorkbookhssfworkbook =newHSSFWorkbook();

HSSFSheetsheet1 = hssfworkbook.CreateSheet("Sheet1");

sheet1.SetColumnWidth(1,100 * 256);

这里你会发现一个有趣的现象,SetColumnWidth的第二个参数要乘以256,这是怎么回事呢?其实,这个参数的单位是1/256个字符宽度,也就是说,这里是把B列的宽度设置为了100个字符。

刚才说的是如何设置,那如何去读取一个列的宽度呢?直接用GetColumnWidth方法,这个方法只有一个参数,那就是列的索引号。如下所示:

intcol1width = 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项目

2.3.1用NPOI操作EXCEL--基本计算

从这节开始,我们将开始学习Excel高级一点的功能--公式。为某个单元格指定公式后,单元格中的类容将根据公式计算得出,如图:

图中设置的是一个基本表达式”1+2*3”,单元格A1中将显示此表达式计算的结果”7”,如图所示。对应的C#生成代码也很简单,如下:

HSSFSheet sheet1 = hssfworkbook.CreateSheet("Sheet1");

HSSFRow row1=sheet1.CreateRow(

0);

HSSFCell cel1 = row1.CreateCell(

0);

HSSFCell cel2 = row1.CreateCell(

1);

HSSFCell cel3 = row1.CreateCell(

2);

cel1.SetCellFormula(

"1+2*3");

cel2.SetCellValue(

5);

同样,NPOI也支持单元格引用类型的公式设置,如下图中的C1=A1*B1。

对应的公式设置代码为:

cel3.SetCellFormula("A1*B1");

是不是很简单呢?但要注意,在利用NPOI写程序时,行和列的计数都是从0开始计算的,但在设置公式时又是按照Excel的单元格命名规则来的。

2.3.2用NPOI操作EXCEL--SUM函数

这节我们开始学习Excel中最常用的函数—Sum求和函数。

首先,我们先看一上最简单的Sum函数:Sum(num1,num2,...)。使用效果如图

图中的E1=Sum(A1,C1)表示将A1与C1的和填充在E1处,与公式”E1=A1+C1”等效。对应的生成代码与上一节中的基本计算公式类似:

HSSFSheet sheet1 = hssfworkbook.CreateSheet("Sheet1");

HSSFRow row1 = sheet1.CreateRow(

0);

HSSFCell cel1 = row1.CreateCell(

0);

HSSFCell cel2 = row1.CreateCell(

1);

HSSFCell cel3 = row1.CreateCell(

2);

HSSFCell celSum1 = row1.CreateCell(

3);

HSSFCell celSum2 = row1.CreateCell(

4);

HSSFCell celSum3 = row1.CreateCell(

5);

cel1.SetCellValue(

1);

cel2.SetCellValue(

2);

cel3.SetCellValue(

3);

celSum2.SetCellFormula(

"sum(A1,C1)");

当然,把每一个单元格作为Sum函数的参数很容易理解,但如果要求和的单元格很多,那么公式就会很长,既不方便阅读也不方便书写。所以Excel提供了另外一种多个单元格求和的写法:

如上图中的“Sum(A1:C1)”表示求从A1到C1所有单元格的和,相当于A1+B1+C1。对应的代码为:

celSum1.SetCellFormula("sum(A1:C1)");

最后,还有一种求和的方法。就是先定义一个区域,如”range1”,然后再设置Sum(range1),此时将计算区域中所有单元格的和。定义区域的代码为:

HSSFName range = hssfworkbook.CreateName();

range.Reference =

"Sheet1!$A1:$C1";

range.NameName =

"range1";

执行此代码后的Excel文件将在的公式菜单下的名称管理器(Excel2007的菜单路径,2003稍有不同)中看到如下区域定义:

给单元格F1加上公式:

celSum3.SetCellFormula("sum(range1)");

生成的Excel如下图所示:

2.3.3用NPOI操作EXCEL--日期函数

Excel中有非常丰富的日期处理函数,在NPOI中同样得到了很好的支持。如下图:对应的与前面的基本公式设置类似:

HSSFSheet sheet1 = hssfworkbook.CreateSheet("Sheet1");

HSSFRow row1 = sheet1.CreateRow(

0);

HSSFRow row2 = sheet1.CreateRow(

1);

row1.CreateCell(

0).SetCellValue("姓名");

row1.CreateCell(

1).SetCellValue("参加工作时间");

row1.CreateCell(

2).SetCellValue("当前日期");

row1.CreateCell(

3).SetCellValue("工作年限");

HSSFCell cel1 = row2.CreateCell(

0);

HSSFCell cel2 = row2.CreateCell(

1);

HSSFCell cel3 = row2.CreateCell(

2);

HSSFCell cel4 = row2.CreateCell(

3);

cel1.SetCellValue(

"aTao.Xiang");

cel2.SetCellValue(

newDateTime(2004,7,1));

cel3.SetCellFormula(

"TODAY()");

cel4.SetCellFormula(

"CONCATENATE(DATEDIF(B2,TODAY(),\"y\"),\"年\",DATEDIF(B2,TODAY(),\"ym\"),\"个月\")");

//在poi中日期是以double类型表示的,所以要格式化HSSFCellStyle cellStyle = hssfworkbook.CreateCellStyle();

HSSFDataFormat format = hssfworkbook.CreateDataFormat();

cellStyle.DataFormat = format.GetFormat(

"yyyy-m-d");

cel2.CellStyle = cellStyle;

cel3.CellStyle = cellStyle;

下面对上例中用到的几个主要函数作一些说明:

TODAY()

:取得当前日期;

DATEDIF(B2,TODAY(),"y")

:取得B2单元格的日期与前日期以年为单位的时间间隔。(“Y”:表示以年为单位,”m”表示以月为单位;”d”表示以天为单位);

CONCATENATE(str1,str2,...)

:连接字符串。

另外附上Excel中常用的日期函数列表,只需要将此句代码作适当修改即可:

cel4.SetCellFormula("CONCATENATE(DATEDIF(B2,TODAY(),\"y\"),\"年\",DATEDIF(B2,TODAY(),\"ym\"),\"个月\")");

函数名函数说明语法

DATE返回代表特定日期的系列数。DATE(year,month,day)

DATEDIF计算两个日期之间的天数、月数或年数。DATEDIF(start_date,end_date,unit)

DATEVALUE函数DATEVALUE的主要功能是将以文字表示的日期转换成一个系列数。DATEVALUE(date_text)

DAY返回以系列数表示的某日期的天数,用整数1到31表示。DAY(serial_number)

DAYS360按照一年360天的算法(每个月以30天计,一年共计12个月),返回两日期间相差的天数。DAYS360(start_date,end_date,method)

EDATE返回指定日期(start_date)之前或之后指定月份数的日期系列数。使用函数EDATE可以计算与发行日处于一月中同一天的到期日的日期。EDATE(start_date,months)

EOMONTH返回start-date之前或之后指定月份中最后一天的系列数。用函数EOMONTH可计算特定月份中最后一天的时间系列数,用于证券的到期日等计算。EOMONTH(start_date,months)

HOUR返回时间值的小时数。即一个介于0 (12:00 A.M.)到23 (11:00 P.M.)之间的整数。HOUR(serial_number)

MINUTE返回时间值中的分钟。即一个介于0到59之间的整数。MINUTE(serial_number)

MONTH返回以系列数表示的日期中的月份。月份是介于1(一月)和12(十二月)之间的整数。MONTH(serial_number)

NETWORKDAYS返回参数start-data和end-data之间完整的工作日数值。工作日不包括周末和专门指定的假期NETWORKDAYS(start_date,end_date,holidays)

NOW返回当前日期和时间所对应的系列数。NOW( )

SECOND返回时间值的秒数。返回的秒数为0至59之间的整数。SECOND(serial_number)

TIME返回某一特定时间的小数值,函数TIME返回的小数值为从0到0.99999999之间的数值,代表从0:00:00 (12:00:00 A.M)到23:59:59 (11:59:59 P.M)之间的时间。TIME(hour,minute,second)

TIMEVALUE返回由文本串所代表的时间的小数值。该小数值为从0到0.999999999的数值,代表从0:00:00 (12:00:00 AM)到23:59:59 (11:59:59 PM)之间的时间。TIMEVALUE(time_text)

TODAY返回当前日期的系列数,系列数是Microsoft Excel用于日期和时间计算的日期-时间代码。TODAY( )

WEEKDAY返回某日期为星期几。默认情况下,其值为1(星期天)到7(星期六)之间的整数。WEEKDAY(serial_number,return_type)

WEEKNUM返回一个数字,该数字代表一年中的第几周。WEEKNUM(serial_num,return_type)

WORKDAY返回某日期(起始日期)之前或之后相隔指定工作日的某一日期的日期值。工作日不包括周末和专门指定的假日。WORKDAY(start_date,days,holidays)

YEAR返回某日期的年份。返回值为1900到9999之间的整数。YEAR(serial_number)

YEARFRAC返回start_date和end_date之间的天数占全年天数的百分比。YEARFRAC(start_date,end_date,basis)

2.3.4用NPOI操作EXCEL--字符串函数

这一节我们开始学习Excel另一类非常常见的函数—字符串函数。在Excel中提供了非常丰富的字符串函数,在NPOI中同样得到了很好的支持。一、大小写转换类函数LOWER(String):将一个文字串中的所有大写字母转换为小写字母。

UPPER(String)

:将文本转换成大写形式。

PROPER(String)

:将文字串的首字母及任何非字母字符之后的首字母转换成大写。将其余的字母转换成小写。对应的C#代码与前几节讲的设置公式的代码类似:

HSSFRow row1 = sheet1.CreateRow(0);

row1.CreateCell(

0).SetCellValue("待操作字符串");

row1.CreateCell(

1).SetCellValue("操作函数");

row1.CreateCell(

2).SetCellValue("操作结果");

HSSFRow row2 = sheet1.CreateRow(

1);

row2.CreateCell(

0).SetCellValue("This is a NPOI example!");

row2.CreateCell(

1).SetCellValue("LOWER(A2)");

//将此句中的“LOWER(A2)”换成UPPER (A2)、PROPER (A2)可以看到不同效果。row2.CreateCell(2).SetCellFormula("LOWER(A2)");

二、取出字符串中的部分字符

LEFT(text,num_chars)

:LEFT(text,num_chars)其中Text是包含要提取字符的文本串。Num_chars指定要由LEFT所提取的字符数。

MID(text,start_num,num_chars):MID(text,start_num,num_chars)其中Text是包含要提取字符的文本串。Start_num是文本中要提取的第一个字符的位置,num_chars表示要提取的字符的数。

RIGHT(text,num_chars):RIGHT(text,num_chars)其中Text是包含要提取字符的文本串。Num_chars指定希望RIGHT提取的字符数。代码与上面类似,就不写了。

三、去除字符串的空白TRIM(text):其中Text为需要清除其中空格的文本。需要注意的是,与C#中的Trim不同,Excel中的Trim函数不仅会删除字符串头尾的字符,字符串中的多余字符也会删除,单词之间只会保留一个空格。

四、字符串的比较

EXACT(text1,text2)

:比较两个字符串是否相等,区分大小写。

执行效果如下:

在此只简单的讲了一下常用的函数,Excel中还有很多的字符串函数,在此附上,读者可以一个一个去测试。

函数名函数说明语法

ASC将字符串中的全角(双字节)英文字母更改为半角(单字节)字符。ASC(text)

CHAR返回对应于数字代码的字符,函数CHAR可将其他类型计算机文件中的代码转换为字符。CHAR(number)

CLEAN删除文本中不能打印的字符。对从其他应用程序中输入的字符串使用CLEAN函数,将删除其中含有的当前操作系统无法打印的字符。例如,可以删除通常出现在数据文件头部或尾部、无法打印的低级计算机代码。CLEAN(text)

CODE返回文字串中第一个字符的数字代码。返回的代码对应于计算机当前使用的字符集。CODE(text)

CONCATENATE将若干文字串合并到一个文字串中。CONCATENATE (text1,text2,...)

DOLLAR依照货币格式将小数四舍五入到指定的位数并转换成文字。DOLLAR或RMB(number,decimals)

EXACT该函数测试两个字符串是否完全相同。如果它们完全相同,则返回TRUE;否则,返回FALSE。函数EXACT能区分大小写,但忽略格式上的差异。利用函数EXACT可以测试输入文档内的文字。EXACT(text1,text2)

FINDFIND用于查找其他文本串(within_text)内的文本串(find_text),并从within_text的首字符开始返回find_text的起始位置编号。FIND(find_text,within_text,start_num)

FIXED按指定的小数位数进行四舍五入,利用句点和逗号,以小数格式对该数设置格式,并以文字串形式返回结果。FIXED(number,decimals,no_commas)

JIS将字符串中的半角(单字节)英文字母或片假名更改为全角(双字节)字符。JIS(text)

LEFTLEFT基于所指定的字符数返回文本串中的第一个或前几个字符。

LEFTB

基于所指定的字节数返回文本串中的第一个或前几个字符。此函数用于双字节字符。

LEFT(text,num_chars)

LEFTB(text,num_bytes)

LENLEN返回文本串中的字符数。

LENB

返回文本串中用于代表字符的字节数。此函数用于双字节字符。

LEN(text)

LENB(text)

LOWER将一个文字串中的所有大写字母转换为小写字母。LOWER(text)

MIDMID返回文本串中从指定位置开始的特定数目的字符,该数目由用户指定。

MIDB

返回文本串中从指定位置开始的特定数目的字符,该数目由用户指定。此函数用于双字节字符。

MID(text,start_num,num_chars)

MIDB(text,start_num,num_bytes)

PHONETIC提取文本串中的拼音(furigana)字符。PHONETIC(reference)

PROPER将文字串的首字母及任何非字母字符之后的首字母转换成大写。将其余的字母转换成小写。PROPER(text)

REPLACEREPLACE使用其他文本串并根据所指定的字符数替换某文本串中的部分文本。

REPLACEB

使用其他文本串并根据所指定的字符数替换某文本串中的部分文本。此函数专为双字节字符使用。

REPLACE(old_text,start_num,num_chars,new_text)

REPLACEB(old_text,start_num,num_bytes,new_text)

REPT按照给定的次数重复显示文本。可以通过函数REPT来不断地重复显示某一文字串,对单元格进行填充。REPT(text,number_times)

RIGHTRIGHT根据所指定的字符数返回文本串中最后一个或多个字符。

RIGHTB

根据所指定的字符数返回文本串中最后一个或多个字符。此函数用于双字节字符。

RIGHT(text,num_chars)

RIGHTB(text,num_bytes)

SEARCHSEARCH返回从start_num开始首次找到特定字符或文本串的位置上特定字符的编号。使用SEARCH可确定字符或文本串在其他文本串中的位置,这样就可使用MID或REPLACE函数更改文本。

SEARCHB

也可在其他文本串(within_text)中查找文本串(find_text),并返回find_text的起始位置编号。此结果是基于每个字符所使用的字节数,并从start_num开始的。此函数用于双字节字符。此外,也可使用FINDB在其他文本串中查找文本串。

SEARCH(find_text,within_text,start_num)

SEARCHB(find_text,within_text,start_num)

SUBSTITUTE在文字串中用new_text替代old_text。如果需要在某一文字串中替换指定的文本,请使用函数SUBSTITUTE;如果需要在某一文字串中替换指定位置处的任意文本,请使用函数REPLACE。SUBSTITUTE(text,old_text,new_text,instance_num)

T将数值转换成文本。T(value)

TEXT将一数值转换为按指定数字格式表示的文本。TEXT(value,format_text)

TRIM除了单词之间的单个空格外,清除文本中所有的空格。在从其他应用程序中获取带有不规则空格的文本时,可以使用函数TRIM。TRIM(text)

UPPER将文本转换成大写形式。UPPER(text)

VALUE将代表数字的文字串转换成数字。VALUE(text)

WIDECHAR将单字节字符转换为双字节字符。WIDECHAR(text)

YEN使用¥(日圆)货币格式将数字转换成文本,并对指定位置后的数字四舍五入。YEN(number,decimals)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容

  • 转自链接 2.3.5 IF函数 2.3.6 CountIf和SumIf函数 2.3.7 Lookup函数 2.3....
    腿毛裤阅读 12,861评论 0 0
  • 也许你已经做了上千张表格,也许你用函数算了上千复杂的运算。也许认为excel不过如此,今天25招秘技希望可以帮到大...
    南屋阿米佛头阅读 3,709评论 0 51
  • 一、误删资料恢复 一不小心删错了,还把回收站清空了,咋办啊?只要三步,你就能找回你删掉并清空回收站的东西。 步骤:...
    八爷君阅读 1,540评论 2 7
  • 使用首先需要了解他的工作原理 1.POI结构与常用类 (1)创建Workbook和Sheet (2)创建单元格 (...
    长城ol阅读 8,411评论 2 25
  • 转自链接 3.项目实践 3.1基于.xls模板生成Excel文件 3.2生成九九乘法表 3.3生成一张工资单 3....
    腿毛裤阅读 3,436评论 0 0