栏目编辑粱春丽E—ma}l期躺… 软件服务,liangfizi505@16363 comcom:目 ■ - ■中国人民银行南昌中心支行 中国人民银行上饶市中心支行王逞吴 朱勇± 报表输出是Java应用开发巾经常涉及的内容,而一 睃的报表往往缺乏通用性。不方便用户进行个性化编 阻。Java程序南于其跨平台特性,不能直接操纵Excel。 鉴于此,本文探讨—下POI实现Java程序中操作Excel报 表的应用。 还有辅助操作等。最主要的对象见表1所列。 表1 POIfi ̄-主要对象 一 PcjI简介 (一)POI的简单应用 下例中,实现的主要功能为:使用表l中的对象在 程序的当前目录下创建一个Excel文件test.xls,在第一个 单元格中写入内容,然后读出该单元格的内容。主要程 序部分为: Jakarta POI是apache的子项目,目标是处理ole2对 象。它提供了一组操纵windows ̄档的Java API。目前比 菠成熟的是HSSF(Horrible SpreadSheet Format)接口, 处理MS Excel(97—2002)对象。通过HSSF,开发人员 可以用纯Jaya代码来读取、写入、修改Excel文件。 二 PO!应用配置 POI包可以在Apache官方网站下载。下载后,解压 宿得到如图1所示的目录结构。在应用中主要用poi_3.1一 public class CreateExcelReport{ public static String xlsFile=”test.xls『1.//Excel文件的 名称 public static void main(String args[]){ try{ HSSFW0rkb00k workbook=new HSSF rkbo0kf): ?INAL一20080629.jar这个库文件。如果是纯Java应用程 芋,需把该文件的路径添加到系统环境变量classpath 中,否则无法编译;如果是Java Web应用,则需要将该库 艾件部署到应用程序的\WEB—INF\lib目录 t*i in、p“-3 1-#Zl ̄ //产生工作簿对象 HSSFSheet sheet=workbook.createSheet0;//产生T 作表对象 ,/设置第一个工作表的名称为firstSheet,设置字符 编码为UTF_16 workbook.SetSheetNamef0,”fi rstSbeet”, HSSFW0rkb00k.ENCODINGUTF一16); —,/产生一行,且为第一行 图1 P0I的目录结构 HSSFRow row=sheet.createrOW((short)0): ,/产生该行的第一个单元格 三、POI的应用 POI提供给用户使用的对象在org.apache.poi.hssf sermodel包中,主要部分包括Excel对象、样式和格式, HSSFCell cell:row.createCell((short)0); cel1.setCellType(HSSFCel1.CELL_TYPE—STRING); cel1.setEncoding(HSSFCel1.ENCODING—UTF'_16): 洲A A coMM R 言 I 47 目 嘲 ∞嘲∞… cel1.setCellType(HSSFCel1.CELL_TYPE—STRING1; cel1.setEnc0ding(HSSFCel1.ENCODING—UTF_-l6); //往第一个单元格中写入信息 cel1.setCellValue(”测试消息”); FileOutputStream fOut=new FileOutputStream(xlsFile); cel1.setCellValue(”用户编码”); f}第二 cell=row.createCell((short)1); cel1.setCellType(HSSFCel1.CELL_TYPE—STRING); cel1.setEnc0ding(HSSFCel1.ENCODING—UTF一16); workbook.write(fOut); fOut.lfush(); System.out.println(”生成文件…”); //以下语句读取生成的Excel文件内容 FileInputStream fin=new FileInputStream(xlsFile); HSSF 女book rea 缪西tBook=new HSSF 女book cel1.setCellValue(”用户姓名”); while(rs.next()){ (仃n); HSSFSheet readSheet=readWorkBook.getSheet //iRow初始值为1,表示从第二行开始写数据 (第一行为表头) row=sheet.createRow((short)iRow); (”firstSheet”); HSSFRow readRow=readSheet.getRow(0); ∥此处以该数据集的每条记录有两个字段为例 ∥如果数据类型一样,可以考虑使用循环 cell=row eateCell((short)0); CELLTYPE_——HSSFCell readCell=readRow.getCell((short)0); System.out.println(readCel1.getStringCellValue0); ) catch(Exception e){ STRING); cel1.setEnc0ding(HSSFCel1.ENCODING—UTF一16); System.out.println(e); l cel1.setCellValue(rs.getString(1)); cell=row.createCell((short)1); cel1.setCellType(HSSFCel1.CELL_TYPE——STRING); cel1.setEnc0ding(HSSFCel1.ENCODING—UTF—l6); 】 } (二)结合数据库应用 使用POI,可以方便地将数据库中的数据导出生成 cel1.setCellValue(rs.getDouble(2)); ) iRow++: Excel报表,也可以读取上传的Excel报表,并将其内容写 入数据库表中保存。以下是将数据中的数据读取出来 并生成Excel报表的关键代码: 把数据集rs中的数据导出至Excel ̄E作表中 / public static void dataToExcel(ResuhSet rs,String xlsName){ } FileOutputStream fOut=new FileOutputStream(xlsNa me); workbook.write(fOut); fOut.flush(); . 1Out.close(); } HSSFWorkbook workbook=new HSSFWorkbook0; HSSFSheet sheet:workbook.createSheet0; wOrkbOOk.SetSheetNaIlle(0, ”Sheet1”, HSSFW0rkb0ok.ENCODINGUTF_l6); —catch(Exception e){ System.out.println(e); l HSSFRow row=sheet.createRow((short)0); HSSFCell cell; int iRow=l; } //写入各条记录,每条记录对应Excel中的一行 try{ 四.总结 POI功能强大,本文只是简单地介绍了它的主要 功能,其他功能本文不一一举例,具体可以参考其帮 助文档。总之,使用POI可以较好地解决Java编程中的 Excel报表问题,很好地满足用户的需求。 ,/第一行为表头 f愫一 cell=rOW.createCell((short)0); 48 I 积 oMPLrrER OF HUAM