还剩10页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
J__a对Ex__l表格的操作目前软件__多采用B/S架构正B/S架构可以给软件的__部署带来很大的便利,但是与此同时这种架构也带来了一些问题,例如Web报表的处理等,在B/S架构下,客户端的__并没有丰富的、互动性能良好的界面组件供__人员调用,而且调用客户端机器上的设备也很不方便这些缺陷将会导致B/S架构的软件在客户端的一些功能__陷入困境Web报表的__是一个比较常见的功能,然而在B/S架构上实现这些功能并没有在C/S架构上那么简单,针对这样的问题,在下面的内容中将介绍JSP与Ex__l的交互、图形报表的制作和基本的Web打印功能,这些功能都不是很难,可以在掌握这些功能的基础上举一反三,思考其他新的应用1JSP对Ex__l报表的处理在应用系统__的过程中,很多客户会提出把数据表格导出为Ex__l文件的需求,这样就可以利用Ex__l的强大功能做一些统计计算J__a自带的API中并没直接操作Ex__l文档的方法,如果要在J__a中处理Ex__l文档只有借助于第三方的解决方案在接下来的章节中将要介绍的就是利用这些第三方的类库处理Ex__l文档的具体方法
1.1JSP操作Ex__l工具汇总在J__a处理Ex__l这个领域已经有很多开源的解决方案目前在这方面做得比较出色的有ApachePOI和JEx__lApijxlApachePOI是Apache基金组织Jakarta项目的子项目POI包括一系列的API,可以操作多种格式的MicrosoftOffi__文件,通过这些API可以在J__a中很方便地读写Ex__l、Word等文件POI是比较完整的J__aEx__l和J__aWord解决方案其子项目包括POIFS、HSSF、HDF、HPSF其中HSSF是J__a到MicrosoftEx__l97/2002文件的接口,支持读写功能JEx__lApi也是一个J__a操作Ex__l的接口它也是一个开源的解决方案,虽然在名气方面比不上大名鼎鼎的ApachePOI但是在操作Ex__l的功能上丝毫不比POI逊色,而且在某些方面做得比POI更出色,例如生成Ex__l文件时给合并单元格加边框的问题,在POI中这很难实现的,POI的__仅仅承诺在以后的版本中会添加这个功能然而在JEx__Api中通过一个简单的设置语句就可以实现而且总体上JEx__lApi使用都是比较简单方便的利用J__a进行__,尤其当使用第三方类的库进行__的时候,最让人头疼的就是中文乱码问题,在这方面就连ApachePOI也不例外,在生成Ex__l文件时必须经过复杂的编码设置才能看到中文显示但是使用JEx__lApi就没有这个问题,只需要简单的选择即可生成漂亮的中文Ex__l文件,这也是很多__人员愿意选择这个API的又一个重要原因采用这两种工具都可以很方便地操作Ex__l文件,在这里只介绍JEx__lApi的使用方法,其他类似的第三方类库在使用方法上都很类似,参考其文档都是很容易学习的
1.2JEx__lAPi__环境简单配置JEx__lAPi是一个开源的项目,可以在____下载其最新版本在JEx__lAPi的____上提供各种版本的下载,例如要下载版本为的JEx__lApi下载下来的文件为Jex__lapi-2-4-
2.tar.gz直接解压这个压轴文件即可其中docs目录下是类库参考档案Src目录下是整个JEx__lAPi的源代码,在src目录下有demo子目录,里面是例子代码,demo中的源代码对初学者来说是最好的教材,参考其中的例程可以实现其绝大部分功能JEx__lAPi这个目录下面可以看到jx
1.jar文件,这个文件就是JEx__lAPi打包的类库文件,如果要在项目中使用JEx__lAPi只需要把jx
1.jar文件的路径加入classpath中或项目lib目录下
1.3JSP生成Ex__l报表在接下讲解在JSP中使用JEx__lApi生成不同格式的Ex__l文件.在WEB应用__过程中,可能会遇到各种各样的报表需求,这些报表不仅布局格式复杂,而且数据类型也是多种多样,甚至有些报表需要在指定的位置显示__当这些报表需要导出为Ex__l的时候,相应的的问题就会出现,而接下来要阐述的内容就是怎样使用JEx__lApi来解决这些问题解决任何问题的时候都是从简单到复杂,下面几个示例也是按照这个原则组织的在实际应用__中,经常需要把指定的数据生成Ex__l文件,并且可以下载生成的Ex__l文件在本章的示例中利用J__aBean生成的Ex__l文件,在JSP页面上调用这个J__aBean生成的Ex__l文件,然后提供下载方式当访问这个JSP页面的时候可以直接下载生成的Ex__l文件
1.JSP生成简单的Ex__l文件假设下面这种情形,要把表中的内容导出为Ex__l文件学校专业专业竞争力清华大学计算机专业高北京大学法律专业中北京理工大学__专业低在表中展示的内容格式全是字符串而且这个表格的格式也是相当简单,没有任何合并的单元格,也没有颜色的设置类似这种表格生成对应的Ex__l文件是非常容易的,实现这个功能的J__aBean代码如下所示packagebeans.ex__l;importj__a.io.IOEx__ption;importj__a.io.OutputStream;importjxl.Workbook;importjxl.write.Label;importjxl.write.Writable__llFor__t;importjxl.write.WritableSheet;importjxl.write.WritableWorkbook;importjxl.write.WriteEx__ption;importjxl.write.biff.Row_____ededEx__ption;publicclass______Ex__lWrite{publicvoidcreateEx__lOutputStreamosthrowsWriteEx__ptionIOEx__ption{//创建工作薄WritableWorkbookworkbook=Workbook.createWorkbookos;//创建新的一页WritableSheetsheet=workbook.createSheetFirstSheet0;//创建要显示的具体内容Label___xiao=newLabel00学校;sheet.add__ll___xiao;Labelzhuanye=newLabel10专业;sheet.add__llzhuanye;Label___gzhengli=newLabel20专业竞争力;sheet.add__ll___gzhengli;Labelqinghua=newLabel01清华大学;sheet.add__llqinghua;Labeljisuanji=newLabel11计算机专业;sheet.add__lljisuanji;Labelgao=newLabel21高;sheet.add__llgao;Labelbeida=newLabel02北京大学;sheet.add__llbeida;Labelfalv=newLabel12法律专业;sheet.add__llfalv;Labelzhong=newLabel22中;sheet.add__llzhong;Labelligong=newLabel03北京理工大学;sheet.add__llligong;Labelhangkong=newLabel13__专业;sheet.add__llhangkong;Labeldi=newLabel23低;sheet.add__lldi;//把创建的内容写入到输出流中,并关闭输出流workbook.write;workbook.close;os.close;}}上面这个J__aBean中的主要代码解释如下WritableWorkbookworkbook=Workbook.createWorkbookos;上面这行代码创建一个Ex__l工作区(WorkBook)在Ex__l中,所有的页(Sheet)只能在工作区(WorkBook)中创建WritableSheetsheet=workbook.createSheetFirstSheet0;上面这行代码在工作区(WorkBook)中创建新的一页(Sheeet)其中新建的页(Sheet)名称为“Firstsheet”这一页的属性是可以进行写操作的在JEx__lAPi中也可以创建只读的页Label___xiao=newLabel00学校;sheet.add__ll___xiao;上面这段代码创建了一个单元格,并把这个单元格添加到指定的页中,其中这个单元格的内容是“学校”位置在第一行第一列,其中第1个参数是列坐标,第2个参数是行坐标,而且两个坐标都是从0开始计算workbook.write;workbook.close;os.close;这3行代码执行的操作是把工作区中的内容写到输出流中,然后关闭工作区,最后关闭输出流下面来看如何在JSP页面上调用这个J__aBean,并且实现下载的功能具体的JSP代码如下所示%@pagelanguage=j__aimport=j__a.util.*pageEncoding=gb2312%%@pageimport=j__a.io.*%%@pageimport=beans.ex__l.*%%Stringfname=学校专业竞争力情况;OutputStreamos=response.getOutputStream;//取得输出流response.reset;//清空输出流//下面是对中文文件名的处理response.setCharacterEncodingUTF-8;fname=j__a.net.URLEncoder.encodefnameUTF-8;response.setHeaderContent-Dispositionattachment;filename=+newStringfname.getBytesUTF-8GBK+.xls;response.setContentTypeapplication/m_____l;//定义输出类型______Ex__lWritesw=new______Ex__lWrite;sw.createEx__los;%htmlbody/body/html上面这个JSP页面实现的功能是调用J__aBean生成的Ex__l文件,并且提供下载Stringfname=学校专业竞争力情况;上面这行设置生成Ex__l文件的文件名OutputStreamos=response.getOutputStream;//取得输出流response.reset;//清空输出流上面两行代码取得输出流,并且清空输出流的男内容提供给后面生成的Ex__l文件使用response.setCharacterEncodingUTF-8;fname=j__a.net.URLEncoder.encodefnameUTF-8;上面两行代码进行的操作是中文显示的处理,上面一行设置整个Ex__l的编码格式,下面一行设置Ex__l文件名的编码格式这两处编码格式如果不进行设置就会出现中文乱码的情况response.setHeaderContent-Dispositionattachment;filename=+newStringfname.getBytesUTF-8GBK+.xls;response.setContentTypeapplication/m_____l;//定义输出类型上面这段代码实现了下载的功能______Ex__lWritesw=new______Ex__lWrite;sw.createEx__los;上面这段代码调用______Ex__lWrite这个J__aBean生成Ex__l文件,这里之所以没有使用〈jsp:useBean〉标签是因为在这个J__aBean中并没有需要设置的属性和用来获取的属性,所以用调用一般类的方法也是可以的,同样可以调用到J__aBean中的方法
2.JSP生成各种复杂数据格式的Ex__l文件在上面的示例程序中,数据格式是非常简单的,仅仅只有字符串这一种格式,下面考虑这样的情形,现在需要把表
11.2中的数据导出为Ex__l文件JEx__lApi支持数据格式列表数据格式浮点型整型布尔型日期格式数据示例
3.141592653515042699true2007-7-15实现这个操作比前一个例子中的要稍微麻烦一些,需要对各种数据类型进行单独的设置,不同的数据类型需要用不同的单元格的构造方式生成这个Ex__l的J__aBean具体代码如下所示packagebeans.ex__l;importj__a.io.IOEx__ption;importj__a.io.OutputStream;importj__a.text.______DateFor__t;importj__a.util.Calendar;importj__a.util.Date;importjxl.Workbook;importjxl.for__t.Colour;importjxl.write.DateFor__ts;importjxl.write.Label;importjxl.write.NumberFor__ts;importjxl.write.Writable__llFor__t;importjxl.write.WritableSheet;importjxl.write.WritableWorkbook;importjxl.write.WriteEx__ption;importjxl.write.Number;importjxl.write.Boolean;importjxl.write.DateTime;publicclassComplexDataEx__lWrite{publicvoidcreateEx__lOutputStreamosthrowsWriteEx__ptionIOEx__ption{//创建工作薄WritableWorkbookworkbook=Workbook.createWorkbookos;//创建新的一页WritableSheetsheet=workbook.createSheetFirstSheet0;//创建要显示的具体内容Labelfor__te=newLabel00数据格式;sheet.add__llfor__te;Labelfloats=newLabel10浮点型;sheet.add__llfloats;Labelintegers=newLabel20整型;sheet.add__llintegers;Labelbooleans=newLabel30布尔型;sheet.add__llbooleans;Labeldates=newLabel40日期格式;sheet.add__lldates;Labelexample=newLabel01数据示例;sheet.add__llexample;//浮点数据Numbernumber=newNumber
113.1415926535;sheet.add__llnumber;//整型数据Numberints=newNumber2115042699;sheet.add__llints;//布尔型数据Booleanbools=newBoolean31true;sheet.add__llbools;//日期型数据Calendarc=Calendar.getInstan__;Datedate=c.getTime;Writable__llFor__tcf1=newWritable__llFor__tDateFor__ts.FOR__T1;DateTimedt=newDateTime41datecf1;sheet.add__lldt;//把创建的内容写入到输出流中,并关闭输出流workbook.write;workbook.close;os.close;}}这个程序的思路和前一个例子基本一样,不同之处在于各种数据类型单元格的处理,这个在程序的注释中已经写得很清楚了具体不同数据类型的处理请参考上面的程序代码这个J__aBean的调用方法和上一个例子一样,只需要稍微改动一下上一个例子中的JSP文件(______Ex__lWrite.jsp)即可,所需改动的仅仅有下面两个地方Stringfname=学校专业竞争力情况;把上面这句中的“学校专业竞争力情况”改为“JEx__lApi支持数据格式列表”______Ex__lWritesw=new______Ex__lWrite;把上面这行代码改为ComplexDataEx__lWritesw=newComplexDataEx__lWrite即可经过这样的改动,就可以调用上面这个J__aBean
3.JSP生成复杂布局和样式的Ex__l文件上面的示例程序只是展示了JEx__lApi支持的各种数据类型,接下来将要展示JEx__lApi对复杂的布局和样式的支持假设要把表中的数据导出为Ex__l文件JEx__lApi支持数据类型详细说明JEx__lApi支持数据类型详细说明数据格式浮点型整型布尔型日期格式数据示例
3.141592653515042699true2007-7-15在表中,表格的布局发生了变化,表头占了5列,高度也明显大于其他各行,同时各单元格的样式也有了变化,采用了不同的字体类型、背景颜色针对这样的表格,在生成Ex__l文件的时候就要设置其布局和显示的属性下面就是这个J__aBean的具体实现代码packagebeans.ex__l;importj__a.io.IOEx__ption;importj__a.io.OutputStream;importj__a.text.______DateFor__t;importj__a.util.Calendar;importj__a.util.Date;importjxl.Workbook;importjxl.for__t.Colour;importjxl.for__t.UnderlineStyle;importjxl.write.DateFor__ts;importjxl.write.Label;importjxl.write.NumberFor__ts;importjxl.write.Writable__llFor__t;importjxl.write.WritableFont;importjxl.write.WritableSheet;importjxl.write.WritableWorkbook;importjxl.write.WriteEx__ption;importjxl.write.Number;importjxl.write.Boolean;importjxl.write.DateTime;publicclassMutiStyleEx__lWrite{publicvoidcreateEx__lOutputStreamosthrowsWriteEx__ptionIOEx__ption{//创建工作薄WritableWorkbookworkbook=Workbook.createWorkbookos;//创建新的一页WritableSheetsheet=workbook.createSheetFirstSheet0;//构造表头sheet.merge__lls0040;//添加合并单元格WritableFontbold=newWritableFontWritableFont.ARIAL10WritableFont.BOLD;//设置字体种类和黑体显示Writable__llFor__ttitleFor__te=newWritable__llFor__tbold;titleFor__te.setAlig__entjxl.for__t.Alig__ent.__NTRE;//单元格中的内容水平方向居中titleFor__te.setVerticalAlig__entjxl.for__t.VerticalAlig__ent.__NTRE;//单元格中的内容垂直方向居中Labeltitle=newLabel00JEx__lApi支持数据类型详细说明titleFor__te;sheet.setRowView0600false;//设置第一行的高度sheet.add__lltitle;//创建要显示的具体内容WritableFontcolor=newWritableFontWritableFont.ARIAL;//选择字体color.setColourColour.GOLD;//设置字体颜色为金黄色Writable__llFor__tcolorFor__t=newWritable__llFor__tcolor;Labelfor__te=newLabel01数据格式colorFor__t;sheet.add__llfor__te;Labelfloats=newLabel11浮点型;sheet.add__llfloats;Labelintegers=newLabel21整型;sheet.add__llintegers;Labelbooleans=newLabel31布尔型;sheet.add__llbooleans;Labeldates=newLabel41日期格式;sheet.add__lldates;Labelexample=newLabel02数据示例colorFor__t;sheet.add__llexample;//浮点数据WritableFontunderline=newWritableFontWritableFont.ARIALWritableFont.DEFAULT_POINT_SIZEWritableFont.NO_BOLDfalseUnderlineStyle.SINGLE;//设置下划线Writable__llFor__tgreyBackground=newWritable__llFor__tunderline;greyBackground.setBackgroundColour.GRAY_25;//设置背景颜色为灰色Numbernumber=newNumber
123.1415926535greyBackground;sheet.add__llnumber;//整型数据WritableFontboldNumber=newWritableFontWritableFont.ARIAL10WritableFont.BOLD;//设置黑体Writable__llFor__tboldNumberFo__te=newWritable__llFor__tboldNumber;Numberints=newNumber2215042699boldNumberFo__te;sheet.add__llints;//布尔型数据Booleanbools=newBoolean32true;sheet.add__llbools;//日期型数据WritableFontboldDate=newWritableFontWritableFont.ARIALWritableFont.DEFAULT_POINT_SIZEWritableFont.BOLDfalseUnderlineStyle.SINGLE;//设置黑体和下划线Writable__llFor__tboldDateFo__te=newWritable__llFor__tboldDateDateFor__ts.FOR__T1;Calendarc=Calendar.getInstan__;Datedate=c.getTime;DateTimedt=newDateTime42dateboldDateFo__te;sheet.add__lldt;//把创建的内容写入到输出流中,并关闭输出流workbook.write;workbook.close;os.close;}}从上面的程序中可以看出JEx__lApi设置格式和样式的思路,如果需要天加合并单元格只需要在Sheet上面添加merge__lls即可而对单元格的样式进行设置的时候,只需要构造一个Writable__llFor__t即可,在这个对象里面可以进行除字体外的各种样式设置,如果需要设置字体,在构造Writable__llFor__t前就需要构造WritableFont,然后把字体设置完成的WritableFont对象作为参数传给Writable__llFor__t即可下面来解释这个J__aBean的关键代码sheet.merge__lls0040;//添加合并单元格上面这行代码向页(Sheet)里面添加一个合并单元格,这个合并单元格的区域是第一行到第五列其中第一个参数是起始行,第三个参数是终止列,第四个参数是终止行WritableFontbold=newWritableFontWritableFont.ARIAL10WritableFont.BOLD;上面这行代码构造了一个字体对象,其中选择的字体为ARIAL,字号大小为10,用黑体显示Writable__llFor__ttitleFor__te=newWritable__llFor__tbold;上面这行代码利用前面构造的字体对象生成一个单元格样式控制对象titleFor__te.setAlig__entjxl.for__t.Alig__ent.__NTRE;//单元格中的内容水平方向居中titleFor__te.setVerticalAlig__entjxl.for__t.VerticalAlig__ent.__NTRE;//单元格中的内容垂直方向居中单元格样式控制对象创建以后,就可以在这个对象上进行各种样式设置上面的两行代码就是在前面创建的单元格样式控制对象上进行样式设置Labeltitle=newLabel00JEx__lApi支持数据类型详细说明titleFor__te;在样式结束后只需要在构造单元格的时候选择这个单元格样式控制对象即可上面这行代码中的titleFor__te就是前面已经构造并设置样式的单元格样式控制对象这个程序中其他样式的设置思路和这个基本相同,只是选择的具体参数不同读者可以仔细揣摩上面这个J__aBean的调用方法和前面两个Ex__l文件生成示例的调用方法相同,只需要把______Ex__lWrite.jsp这个JSP页面做如下修改即可Stringfname=学校专业竞争力情况;把上面这句中的“学校专业竞争力情况”改为“JEx__lApi支持数据类型详细说明”______Ex__lWritesw=new______Ex__lWrite;把上面这行代码改为MutiStyleEx__lWritesw=newMutiStyleEx__lWrite即可
4.JSP生成带有__的Ex__l文件在JEx__lApi中,生成带有__的Ex__l文件非常方便,只需构造一个__单元格即可具体构造代码如下所示WritableI__gewi=newWritableI__ge0050newFile“resour__/
123.jpg;上面这段代码构造了一个__单元格,其所占区域为第一行的第一列到第五列,这里第一个参数为起始列,第二个参数为起始行,第三个参数为终止列,第四个参数为终止行,第五个参数是所要显示__的文件对象,其中“resour__/
123.jpg”是文件的目录添加图象单元格的过程和普通的单元格没有什么区别,读者可以把上面这段代码加入前面的例子中,正确指定显示区域和__文件的路径即可显示JSP读取Ex__l报表、这样对所有的单元格都可以使用同一处理方法进行处理针对读取Ex__l的操作没有很多内容,在这里把逻辑代码放在JSP页面进行处理,具体的处理过程可以参考下面的代码%@pagelanguage=j__aimport=j__a.util.*pageEncoding=gb2312%%@pageimport=j__a.io.File%%@pageimport=jxl.__ll%%@pageimport=jxl.Sheet%%@pageimport=jxl.Workbook%htmlbodyfontsize=2%StringfileName=E:/DevolopTool/Tomcat
5.0/webapps/chapt11/学校专业竞争力情况.xls;Filefile=newFilefileName;Workbookwb=Workbook.getWorkbookfile;Sheetsheet=wb.getSheet0;StringoutPut=;outPut=outPut+b+fileName+/bbr;outPut=outPut+第一个sheet的名称为:+sheet.getName+br;outPut=outPut+第一个sheet共有:+sheet.getRows+行+sheet.getColumns+列br;outPut=outPut+具体内容如下:br;forinti=0;isheet.getRows;i++{forintj=0;jsheet.getColumns;j++{__ll__ll=sheet.get__llji;outPut=outPut+__ll.getContents+;}outPut=outPut+br;}out.printlnoutPut;%/font/body/html下面来解释这段程序的关键代码.Filefile=newFilefileName;上面这行代码就是一个简单的文件操作根据文件名创建一个文件对象.Workbookwb=Workbook.getWorkbookfile;上面这行代码从文件流中取得Ex__l工作区对象WorkBookSheetsheet=wb.getSheet0;上面这行代码从工作区中取得页(Sheet),取得这个对象的时候既可以用名称来获得,也可以用序号,在这里我们采用序号,取得第一页outPut=outPut+第一个sheet的名称为:+sheet.getName+br;上面这行代码取出页的名称,并放入字符串,提供给后面进行输出outPut=outPut+第一个sheet共有:+sheet.getRows+行+sheet.getColumns+列br;上面这行代码取出页的行数和列数,并放入字符串,提供给后面进行输出forinti=0;isheet.getRows;i++{forintj=0;jsheet.getColumns;j++{__ll__ll=sheet.get__llji;outPut=outPut+__ll.getContents+;}outPut=outPut+br;}上面这段代码一次取出各行各列的内容,并放入字符串,提供给后面进行输出。