使用Apache开源POI和jXLS两种API生成报表编写人:杜航航编写时间:2011/1/28目录1引言.........................................................................................................32使用POI对Excel进行读写.................................................................42.1POI读取excel文件的内容..........................................................42.2使用POI对Excel进行写操作....................................................62.3创建Sheet......................................................................................62.4创建Cell........................................................................................72.5设置Cell的格式...........................................................................73使用jXLS生成Excel报表....................................................................83.1使用excel模板生成报表.............................................................83.2根据模板生成图表.......................................................................93.3根据数据库数据生成报表.........................................................111引言在电信领域,生成报表是日常工作中必不可少的一项任务。提供报表的方式也是多种多样,例如使用BO来生成报表,使用eclipse的插件来做报表。但是有些时候,需要我们自已来开发报表。这就是要借助于报表操作的API来完成。可以通过API直接将数据读写如报表文件,也可以根据模板来生成报表。根据这个需要,我研究了一下操作报表的两种API,一种Apache的开源项目POI,POI是针对微软OFFICE文档的一种JAVAAPI,使用该API可以实现对微软的OFFICE文档的各种操作。其中使用最广泛的是对MSword,excel,PPT的操作。不仅仅支持windows2003的office文档还支持windows2007的office文档。例如:HSSFisthePOIProject'spureJavaimplementationoftheExcel'97(-2007)fileformat.XSSFisthePOIProject'spureJavaimplementationoftheExcel2007OOXML(.xlsx)fileformat.HSSFandXSSFprovideswaystoreadspreadsheetscreate,modify,readandwriteXLSspreadsheets.Theyprovide:lowlevelstructuresforthosewithspecialneedsaneventmodelapiforefficientread-onlyaccessafullusermodelapiforcreating,readingandmodifyingXLSfiles再随后的例子中,我也将以操作Excel作为例子,使用HSSF操作Excel'97(-2007)。POI这个开源项目的特点是直接对Excel的每个sheet或者是每个Row,或者是每个Cell操作。API的优点是简单易懂,容易上手。对于复杂表格的操作比较繁琐,并且不方便生成各种饼状图和柱状图等等。另外一个API是jXLS。jXLS是一个专门针对excel的API,并不支持word或者是PPT。它是在POI的基础上进一步的包装,是一个更加优秀的开源项目。当前最新的版本是jXLS1.0。jXLS1.0新增的特性是对excel2007的支持。jXLS最大的特点用一句话概况就是:jXLSisasmallandeasy-to-useJavalibraryforwritingExcelfilesusingXLStemplatesandreadingdatafromExcelintoJavaobjectsusingXMLconfiguration.。ExcelgenerationisrequiredinmanyJavaapplicationsthathavesomekindofreportingfunctionality.ThemostcompletelibrarytomanipulateXLSfilesfromJavaisApachePOIlibrary.TheproblemsappearwhenitisrequiredtocreatealotofcustomandcomplexExcelreportswithrichformattingandenhancedfunctionality.jXLS的特性包括:UsingSQLqueriesdirectlyinXLStemplatesSimplepropertyaccessnotationFullexpressionlanguagesupportComplexobjectgraphexportFlexiblecollectionexportFlow-ControlTagssupportDynamicgroupingofdataExportofasinglecollectionintomultipleworksheetsAdjacenttablessupport!ComplexformulassupportCharts,MacrosandmanyotherExcelfeaturesinXLStemplateDynamicOutlinesDynamicColumnsHidingDynamicCellStyleprocessingthroughcustomProcessorsJDBCResultSetexportMergedCellssupportMultiplebeanpropertiesinasinglecellReadingXLSfiles使用POI可以去Apache的网站下载最新的POI版本,网址是:的网站下载最新版本,网址是:使用POI对Excel进行读写2.1POI读取excel文件的内容POI对excel文件的读取很方便,很简单,可以大致按照以下几步:第一步:加载Excel文件第二步:指定要读取的sheet第三步:指定要读取的Row第四步:获得要读取的Cell具体代码如下:从代码中可以看到从33-35行是根据要读取的excel文件生产一个HSSFSheet的对象,这样以后通过对HSSFSheet的读取,就实现了对excel文件本事的读取。36行是读取指定的Sheer,wb.getSheetAt(0),表示的是读取的是第一个sheet,也就是说sheet的编号是从0开始,也可以通过sheet名称获取该Sheet,例如,wb.getSheet(“Sheet1”),就实现了对Sheet1的读取。37行是获取Row,也就是获取某行的数据,可以通过sheet.getRow(rownumber)来获取。读取任一行的数据。33-44行的代码是遍历了第一行的所有数据。46-47行的代码是获取第一行的第一个表格的内容,可以通过row.getCell()来获取某个表格的内容。以上就是读取Excel中表格内容的代码,很简单明了吧!2.2使用POI对Excel进行写操作以下是对Excel进行写操作的代码:代码的61-66行和读操作是一样是,即获得要写的表格68行是设置单元格的数据类型,这里有设置的是字符串类型,其他的类型请参考POI的API。69行是设置单元格的内容71行是设置单元格为数字类型。72行是为单元格赋值。74-76行是将需要写入的内容加载到excel中。以上就是对单元格的写操作。2.3创建Sheet以上的操作都是保证单元格存在的情况下,如果Sheet不存在,首先要创建一个Sheet,然后才能操作。以下代码是创建一个Sheet的代码:80行是创建一个HSSFWorkbook82,83分别创建两个sheet,sheet的Name是newsheet和secondsheet。84-87行是将根据创建的java对象生成excel文件。2.4创建Cell2.3是创建一个sheet,创建一个sheet之后,就需要创建Cell,以下是创建Cell的代码。以上代码就是创建一个Cell的代码。94-97行是创建一个Cell。98-104行是创建Cell并且赋值。2.5设置Cell的格式众所周之,Excel表格可以设置表格的各种格式以及字体等等,这些都是可以通过POI的API来实现。以下代码就是设置单元格格式和字体的样例代码。113行是创建一个Cell的样式。114-125行是设置Cell样式的具体内容,例如可以设置表格的时间的格式,设置表格边框的样式,设置背景颜色等等。126行是将Cell使用设置的样式。设置字体的代码如下:以上是设置字体的代码。其中可以设置字体大小,字体的类型等等。设置好字体之后将cell的样式设置为设置好的字体,再将样式赋给Cell,这样该Cell的字体就是设置好的字体。3使用jXLS生成Excel报表3.1使用excel模板生成报表jXLS的最大特点就是可以利用模板生成报表,当然POI也可以实现,但是对于报表格式比较的情况来说,POI需要书写大量的代码。而jXLS是对POI的包装,在支持报表方面有很强的优势,可以节省大量的代码。下面具体说明。首先需要设计一个报表的模板,这里举例如下:这个报表列出一个公司所有的部门,列出部门名称,部门主管的信息,以及部门下所有员工的信息,包括员工姓名,年龄,工资,等等;并自动计算出部门的工资总额等。因此需要两个Bean,一个是员工信息的Bean,该java类是Employee,一个是部门信息的Bean,该java类是Department。该两个java见附件。根据该模板生成报表的代码如下:66行是excel模板的文件地址。67行是要生成的报表的Excel文件地址。68行是初始化部门信息的方法。具体内容见附件。70-71行是将部门信息封装到一个Map表中。72-73行是将部门信息封装写入到模板中,生成报表文件。生成的报表如下:3.2根据模板生成图表使用jXLS还有一个优点就是可以生成图表类型的报表,例如生成柱状图或者是饼状图。下面是一个Excel的模板:生成报表的代码如下:19-20行分别是模板的文件地址和生成的报表的文件地址。22-29行是初始化一个员工信息的列表的代码。30-31行是将员工信息列表封装到一个Map中。32-34行是根据员工信息生成报表的代码。生成的报表如下图所示:3.3根据数据库数据生成报表jXLS还有一个很好的特点是可以直接将数据库的数据生成excel报表。上图是excel模板。该报表模板是显示员工信息。上图是数据库中员工的数据信息。根据数据库数据生成报