Java导入、导出excel


Java Java Java Java 导入、导出 导入、导出 导入、导出 导入、导出 ExcelExcelExcelExcel 作者:李江波 作者:李江波 作者:李江波 作者:李江波 QQQQQQQQ::::550470425550470425550470425550470425 2010 2010 2010 2010 年年年年8888月月月月6666日日日日 一介绍 当前 B/S 模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求: 你要把我们的报表直接用 Excel 打开(电信系统、银行系统)。或者是:我们已经习惯用 Excel 打印。这样在我们实际的开发中,很多时候需要实现导入、导出 Excel 的应用。 目前,比较常用的实现 Java 导入、导出 Excel 的技术有两种 Jakarta POI 和Java Excel 下面我就分别讲解一下如何使用这两个技术实现导入、导出 Excel 二使用 JakartaJakartaJakartaJakarta POI POI POI POI 导入、导出 ExcelExcelExcelExcel Jakarta POI 是一套用于访问微软格式文档的 Java API。Jakarta POI 有很多组件组成,其 中有用于操作 Excel 格式文件的 HSSF 和用于操作 Word 的HWPF,在各种组件中目前只有 用于操作 Excel 的HSSF 相对成熟。官方主页 http://poi.apache.org/index.html,API 文档 http://poi.apache.org/apidocs/index.html 2.1 2.1 2.1 2.1 环 境配 置 环 境配 置 环 境配 置 环 境配 置 2.1.1 2.1.1 2.1.1 2.1.1 下载 jarjarjarjar 官方下载:http://poi.apache.org/download.html 这里可以下载到它的最新版本和文档,目 前最新版本是 3.7,这里使用比较稳定的 3.6 版。 2.1.2 2.1.2 2.1.2 2.1.2 加入 jar jar jar jar 包 将根目录下的 poi-3.6-20091214.jar 和Lib 目录下三个通用包 commons-logging-1.1.jar junit-3.8.1.jar log4j-1.2.13.jar 拷贝到项目的 Lib 下 2.22.22.22.2 JakartaJakartaJakartaJakarta POIPOIPOIPOIHSSFHSSFHSSFHSSF API API API API 组件组件组件组件 HSSF(用于操作 Excel 的组件)提供给用户使用的对象在 rg.apache.poi.hssf.usermodel 包中,主要部分包括 Excel 对象,样式和格式,还有辅助操作。有以下几种对象: 常用组件: HSSFWorkbook excel 的文档对象 HSSFSheet excel 的表单 HSSFRow excel 的行 HSSFCell excel 的格子单元 HSSFFont excel 字体 HSSFDataFormat 日期格式 HSSFHeader sheet 头 HSSFFooter sheet 尾(只有打印的时候才能看到效果) 样式: HSSFCellStyle cell 样式 辅助操作包括: HSSFDateUtil 日期 HSSFPrintSetup 打印 HSSFErrorConstants 错误信息表 2.2.2.2.3333 基本基本基本基本操 作步 骤 操 作步 骤 操 作步 骤 操 作步 骤 首先,理解一下一个 Excel 的文件的组织形式,一个 Excel 文件对应于一个 workbook(HSSFWorkbook),一个 workbook 可以有多个 sheet(HSSFSheet)组成,一个 sheet 是由多个 row(HSSFRow)组成,一个 row 是由多个 cell(HSSFCell)组成。 基本操作步骤: 1、用HSSFWorkbook 打开或者创建“Excel 文件对象” 2、用HSSFWorkbook 对象返回或者创建 Sheet 对象 3、用Sheet 对象返回行对象,用行对象得到 Cell 对象 4、对 Cell 对象读写。 下面来看一个动态生成 Excel 文件的例子: //创建 HSSFWorkbook 对象 HSSFWorkbook wb = new HSSFWorkbook(); //创建 HSSFSheet 对象 HSSFSheet sheet = wb.createSheet("sheet0"); //创建 HSSFRow 对象 HSSFRow row = sheet.createRow(0); //创建 HSSFCell 对象 HSSFCell cell=row.createCell(0); //设置单元格的值 cell.setCellValue("单元格中的中文"); //输出 Excel 文件 FileOutputStream output=new FileOutputStream("d:\\workbook.xls"); wkb.write(output); output.flush(); HSSF 读取文件同样还是使用这几个对象,只是把相应的 createXXX 方法变成了 getXXX 方 法即可。可见只要理解了其中原理,不管是读还是写亦或是特定格式都可以轻松实现,正所 谓知其然更要知其所以然。 2.2.2.2.4444 导出导出导出导出Excel Excel Excel Excel 应 用实 例 应 用实 例 应 用实 例 应 用实 例 在2.3 中我们寥寥几行代码实际上就已经就是实现了导出 Excel 一个简单示例,下面我 们在看如何实现导出如图所示的 Excel 表格? 代码如下:(实际开发中应封装到业务层组件中,然后在控制层中调用。这里直接写在 控制层组件,如 Servlet 的doGet/doPost 方法或 Struts 框架的 execute 方法中) //创建HSSFWorkbook 对象(excel 的文档对象) HSSFWorkbook wb = new HSSFWorkbook(); //建立新的 sheet对象(excel 的表单) HSSFSheet sheet=wkb.createSheet("成绩表"); //在sheet 里创建第一行,参数为行索引(excel 的行),可以是 0~65535 之间的任何一个 HSSFRow row1=sheet.createRow(0); //创建单元格(excel的单元格,参数为列索引,可以是 0~255之间的任何一个 HSSFCell cell=row1.createCell(0); //设置单元格内容 cell.setCellValue("学员考试成绩一览表"); //合并单元格 CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列 sheet.addMergedRegion(newCellRangeAddress(0,0,0,3)); //在sheet里创建第二行 HSSFRowrow2=sheet.createRow(1); //创建单元格并设置单元格内容 row2.createCell(0).setCellValue("姓名"); row2.createCell(1).setCellValue("班级"); row2.createCell(2).setCellValue("笔试成绩"); row2.createCell(3).setCellValue("机试成绩"); //在sheet里创建第三行 HSSFRowrow3=sheet.createRow(2); row3.createCell(0).setCellValue("李明"); row3.createCell(1).setCellValue("As178"); row3.createCell(2).setCellValue(87); row3.createCell(3).setCellValue(78); //.....省略部分代码 //输出Excel 文件 OutputStream output=response.getOutputStream(); response.reset(); response.setHeader("Content-disposition", "attachment; filename=details.xls"); response.setContentType("application/msexcel"); wkb.write(output); output.close(); retrun null; 加下划线这部分代码是 B/S 模式中采用的输出方式,而不是输出到本地指定的磁盘目 录。该代码表示将 details.xls 的Excel 文件通过应答实体(response)输出给请求的客户端浏 览器,客户端可保存或直接打开。 2.2.2.2.5555 样 式设 置 样 式设 置 样 式设 置 样 式设 置 在实际应用中导出的 Excel 文件往往需要阅读和打印的,这就需要对输出的 Excel 文档 进行排版和样式的设置,主要操作有合并单元格、设置单元格样式、设置字体样式等。 2.5.1 2.5.1 2.5.1 2.5.1 单元格合并 使用 HSSFSheet 的addMergedRegion()方法 public int addMergedRegionaddMergedRegionaddMergedRegionaddMergedRegion(CellRangeAddress region) 参数 CellRangeAddress 表示合并的区域,构造方法如下: CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol) 构造参数依次表示起始行,截至行,起始列, 截至列 示例代码参照 2.4部分 2.5.2 2.5.2 2.5.2 2.5.2 设置单元格的行高、列宽 HSSFSheet sheet=wb.createSheet(); sheet.setDefaultRowHeightInPoints(10);//设置缺省列高 sheet.setDefaultColumnWidth(20);//设置缺省列宽 //设置指定列的列宽,256 * 50这种写法是因为 width 参数单位是单个字符的256分之一 sheet.setColumnWidth(cell.getColumnIndex(), 256 * 50); 2.5.2 2.5.2 2.5.2 2.5.2 单元格样式 1、创建 HSSFCellStyle HSSFCellStyle cellStyle=wkb.createCellStyle(); 2、设置样式 // 设置单元格的横向和纵向对齐方式,具体参数就不列了,参考 HSSFCellStyle cellStyle.setAlignment(HSSFCellStyle.ALIGN_JUSTIFY); cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); /* 设置单元格的填充方式,以及前景颜色和背景颜色 三点注意: 1.如果需要前景颜色或背景颜色,一定要指定填充方式,两者顺序无所谓; 2.如果同时存在前景颜色和背景颜色,前景颜色的设置要写在前面; 3.前景颜色不是字体颜色。 */ //设置填充方式(填充图案) cellStyle.setFillPattern(HSSFCellStyle.DIAMONDS); //设置前景色 cellStyle.setFillForegroundColor(HSSFColor.RED.index); //设置背景颜色 cellStyle.setFillBackgroundColor(HSSFColor.LIGHT_YELLOW.index); // 设置单元格底部的边框及其样式和颜色 // 这里仅设置了底边边框,左边框、右边框和顶边框同理可设 cellStyle.setBorderBottom(HSSFCellStyle.BORDER_SLANTED_DASH_DOT); cellStyle.setBottomBorderColor(HSSFColor.DARK_RED.index); //设置日期型数据的显示样式 cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm")); 3、将样式应用于单元格 cell.setCellStyle(cellStyle); //将样式应用到行,但有些样式只对单元格起作用 row.setRowStyle(cellStyle); 2.5.2 2.5.2 2.5.2 2.5.2 设置字体样式 1、创建 HSSFFont 对象(调用 HSSFWorkbook 的createFont 方法) HSSFWorkbook wb=new HSSFWorkbook(); HSSFFont fontStyle=wb.createFont(); HSSFWorkbook wb=new HSSFWorkbook (); 2、设置字体各种样式 //设置字体样式 fontStyle.setFontName("宋体"); //设置字体高度 fontStyle.setFontHeightInPoints((short)20); //设置字体颜色 font.setColor(HSSFColor.BLUE.index); //设置粗体 fontStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //设置斜体 font.setItalic(true); //设置下划线 font.setUnderline(HSSFFont.U_SINGLE); 3、将字体设置到单元格样式 字体也是单元格格式的一部分,所以从属于 HSSFCellStyle // 将字体对象赋值给单元格样式对象 cellStyle.setFont(font); // 将单元格样式应用于单元格 cell.setCellStyle(cellStyle); 2.2.2.2.6666 导导导导入入入入Excel Excel Excel Excel 应 用实 例 应 用实 例 应 用实 例 应 用实 例 实现将已存在的 Excel 文件中的数据导入到系统中的基本步骤同导出十分的类似,关键 在于要了解要导入 Excel 文件的结构,比如数据有哪些列、读取数据起始位置(有效数据从 第几行几列开始)等。在实际项目中由于这些数据(Excel 文件)往往来自于日常办公人员 或其他系统平台产生的业务数据,因此这些 Excel 文件的数据格式要有统一的要求,并提供 访问接口(指访问途径),这样在所需数据的系统中就可通过提供这个访问接口调用方法, 从而获得数据。解决方案采用 Web Service 是不错的选择。这里,我们就以导入 2..4 所产生 的excel 表为例,重点掌握如何编写导入 Excel 代码 publicListloadScoreInfo(StringxlsPath)throws IOException{ Listtemp=newnewnewnewArrayList(); FileInputStreamfileIn=newnewnewnewFileInputStream(xlsPath); //根据指定的文件输入流导入Excel从而产生Workbook对象 Workbookwb0=newnewnewnewHSSFWorkbook(fileIn); //获取Excel文档中的第一个表单 Sheetsht0=wb0.getSheetAt(0); //对Sheet中的每一行进行迭代 forforforfor(Rowr:sht0){ //如果当前行的行号(从0开始)未达到2(第三行)则从新循环 If(r.getRowNum()<1){ continue; } //创建实体类 ScoreInfoinfo=newScoreInfo(); //取出当前行第1个单元格数据,并封装在info实体stuName属性上 info.setStuName(r.getCell(0).getStringCellValue()); info.setClassName(r.getCell(1).getStringCellValue()); info.setRscore(r.getCell(2).getNumericCellValue()); info.setLscore(r.getCell(3).getNumericCellValue()); temp.add(info); } fileIn.close(); returntemp; } 三使用 javajavajavajava Excel Excel Excel Excel 操作 Excel Excel Excel Excel 文件 Java Excel 是一开放源码项目,通过它 Java 开发人员可以读取 Excel 文件的内容、创建 新的 Excel 文件、更新已经存在的 Excel 文件。jxl 由于其小巧 易用的特点, 逐渐已经取代 了 POI-excel 的地位, 成为了越来越多的 java 开发人员生成 excel 文件的首选。Java Excel 的特征: ● 支持 Excel 95-2000 的所有版本 ● 生成 Excel 2000 标准格式 ● 支持字体、数字、日期格式化操作 ● 支持对单元格加阴影和加色彩; ● 修改存在的工作表; ● 支持图像和图表 ● 日志记录可以定制 ● 更小更快更省内存 应该说以上功能已经能够大致满足我们的需要。最关键的是这套 API 是纯 Java 的,并不依 赖Windows 系统,即使运行在 Linux 下,它同样能够正确 的处理 Excel 文件。另外需要说 明的是,这套 API 对图形和图表的支持很有限,而且仅仅识别 PNG 格式。 在线帮助文档 http://jexcelapi.sourceforge.net/resources/javadocs/2_6_10/docs/index.html 在这里我们将通过一些实例,学习掌握读取、新建、更新,其中也包括常见格式的设置:字 体、颜色、背景、合并单元格等操作,有这些其实已经基本足够应付大部分问题了。 3.1 3.1 3.1 3.1 环 境配 置 环 境配 置 环 境配 置 环 境配 置 3.1.1 3.1.1 3.1.1 3.1.1 下载 下载地址 http://www.andykhan.com/jexcelapi/ 3.1.23.1.23.1.23.1.2 加入jar jar jar jar 包 将jxl.jar 拷贝到项目的 Lib 下 3.23.23.23.2 使用使用使用使用JavaJavaJavaJava ExcelExcelExcelExcel ApiApiApiApi 导出导出导出导出Excel Excel Excel Excel 文件文件文件文件 下面我们在看如何使用 Java Excel 实现导出如下图所示的 Excel 表格? 代码如下:(实际开发中应封装到业务层组件中,然后在控制层中调用。这里直接写在 控制层组件,如 Servlet 的doGet/doPost 方法或 Struts 框架的 execute 方法中) //获得输出流,该输出流的输出介质是客户端浏览器 OutputStreamoutput=response.getOutputStream(); response.reset(); response.setHeader("Content-disposition","attachment; filename=temp.xls"); response.setContentType("application/msexcel"); //创建可写入的Excel工作薄,且内容将写入到输出流,并通过输出流输出给客户 端浏览器 WritableWorkbookwk=Workbook.createWorkbook(output); ///创建可写入的Excel工作表 WritableSheetsheet=wk.createSheet("成绩表",0); //把单元格(column,row)到单元格(column1,row1)进行合并。 //mergeCells(column,row,column1,row1); sheet.mergeCells(0,0,4,0);//单元格合并方法 //创建WritableFont字体对象,参数依次表示黑体、字号12、粗体、非斜体、不带下划线、 亮蓝色 WritableFonttitleFont=newnewnewnewWritableFont(WritableFont.createFont("黑体 "),12,WritableFont.BOLD,falsefalsefalsefalse,UnderlineStyle.NO_UNDERLINE,Colour.LIGHT_BL UE); //创建WritableCellFormat对象,将该对象应用于单元格从而设置单元格的样式 WritableCellFormattitleFormat=newnewnewnewWritableCellFormat(); //设置字体格式 titleFormat.setFont(titleFont); //设置文本水平居中对齐 titleFormat.setAlignment(Alignment.CENTRE); //设置文本垂直居中对齐 titleFormat.setVerticalAlignment(VerticalAlignment.CENTRE); //设置背景颜色 titleFormat.setBackground(Colour.GRAY_25); //设置自动换行 titleFormat.setWrap(true); //添加Label对象,参数依次表示在第一列,第一行,内容,使用的格式 Labellab_00=newnewnewnewLabel(0,0,"学员考试成绩一览表",titleFormat); //将定义好的Label对象添加到工作表上,这样工作表的第一列第一行的内容为‘学员考试成 绩一览表’并应用了titleFormat定义的样式 sheet.addCell(lab_00); WritableCellFormat cloumnTitleFormat=newnewnewnew WritableCellFormat(); cloumnTitleFormat.setFont(newnewnewnew WritableFont(WritableFont.createFont(" 宋体"),10,WritableFont.BOLD,falsefalsefalsefalse)); cloumnTitleFormat.setAlignment(Alignment.CENTRE); Label lab_01=newnewnewnew Label(0,1,"姓名",cloumnTitleFormat); Label lab_11=newnewnewnew Label(1,1,"班级",cloumnTitleFormat); Label lab_21=newnewnewnew Label(2,1,"笔试成绩",cloumnTitleFormat); Label lab_31=newnewnewnew Label(3,1,"上机成绩",cloumnTitleFormat); Label lab_41=newnewnewnew Label(4,1,"考试日期",cloumnTitleFormat); sheet.addCell(lab_01); sheet.addCell(lab_11); sheet.addCell(lab_21); sheet.addCell(lab_31); sheet.addCell(lab_41); sheet.addCell(newnewnewnew Label(0,2,"李明")); sheet.addCell(newnewnewnew Label(1,2,"As178")); //定义数字格式 NumberFormat nf=newnewnewnew NumberFormat("0.00"); WritableCellFormat wcf=newnewnewnew WritableCellFormat(nf); //类似于Label对象,区别Label表示文本数据,Number表示数值型数据 Number numlab_22=newnewnewnew Number(2,2,78,wcf); sheet.addCell(numlab_22); sheet.addCell(newnewnewnew Number(3,2,87,newnewnewnew WritableCellFormat(newnewnewnew NumberFormat("#.##")))); //定义日期格式 DateFormat df=newnewnewnew DateFormat("yyyy-MM-dd hh:mm:ss"); //创建WritableCellFormat对象 WritableCellFormat datewcf=newnewnewnew WritableCellFormat(df); //类似于Label对象,区别Label表示文本数据,DateTime表示日期型数据 DateTime dtLab_42=newnewnewnew DateTime(4,2,newnewnewnew Date(),datewcf); sheet.addCell(dtLab_42); //将定义的工作表输出到之前指定的介质中(这里是客户端浏览器) wk.write(); //操作完成时,关闭对象,释放占用的内存空间 wk.close(); 加下划线这部分代码是 B/S 模式中采用的输出方式,而不是输出到本地指定的磁盘目 录。该代码表示将 temp.xls 的Excel 文件通过应答实体(response)输出给请求的客户端浏 览器,下载到客户端本地(保存或直接打开)。若要直接输出到磁盘文件可采用下列代码替 换加下划线这部分代码 File file=new File("D://temp.xls"); WritableWorkbook wwb = Workbook.createWorkbook(file); 3.3 3.3 3.3 3.3 高 级操 作 高 级操 作 高 级操 作 高 级操 作 3.3.1 3.3.1 3.3.1 3.3.1 数据格式化 在Excel 中不涉及复杂的数据类型,能够比较好的处理字串、数字和日期已经能够满足 一般的应用即可。 数据的格式化涉及到的是字体、粗细、字号等元素,这些功能主要由 WritableFont 和 WritableCellFormat 类来负责。例如: ① WritableFont font=new WritableFont(WritableFont.createFont("宋体 "),12,WritableFont.NO_BOLD ); ② WritableCellFormat format1=new WritableCellFormat(font); ③ Label label=new Label(0,0,”data 4 test”,format1); 其中 I.指定了字串格式:字体为宋体,字号 16,加粗显示。WritableFont 有非常丰富的构造子, 供不同情况下使用,jExcelAPI 的java-doc 中有详细列表,这里不再列出。 II. 处代码使用了 WritableCellFormat 类,这个类非常重要,通过它可以指定单元格的各种属 性,如上例代码所示。 III. 处使用了 Label 类的构造子,指定了显示的位置,文本内容,字串被赋予的格式。 与Label类似的Number、DateTime,区别Label表示文本数据;Number表示数值数据,可使 NumberFormat格式化数据;用DateTime表示日期型数据,可应用DateFormat格式化数 据。 3.3.2 3.3.2 3.3.2 3.3.2 单元格操作 Excel 中很重要的一部分是对单元格的操作,比如行高、列宽、单元格合并等,所幸 jExcelAPI 提供了这些支持。这些操作相对比较简单,下面只介绍一下相关的 API。 1111、 合并单元格 WritableSheet.mergeCells(int m,int n,int p,int q); 作用是从(m,n)到(p,q)的单元格全部合并,比如: WritableSheet sheet=book.createSheet(“第一页”,0); //合并第一列第一行到第六列第一行的所有单元格 sheet.mergeCells(0,0,5,0); 合并既可以是横向的,也可以是纵向的。合并后的单元格不能再次进行合并,否则会触发异 常。 2222、 行高和列宽 writableSheet.setRowView(int i,int height); 作用是指定第 i+1 行的高度,比如: // 将第一行的高度设为 200 sheet.setRowView(0,200); WritableSheet.setColumnView(int i,int width); 作用是指定第 i+1 列的宽度,比如: //将第一列的宽度设为 30 sheet.setColumnView(0,30); 3.33.33.33.3 从从从从Excel Excel Excel Excel 文 件读 取数 据表 文 件读 取数 据表 文 件读 取数 据表 文 件读 取数 据表 我们就以导入 3.2 所产生的 excel 表为例,掌握如何编写导入 Excel 代码(该代码封装在 业务层方法) publicListloadScoreInfo(StringxlsPath)throwsthrowsthrowsthrows IOException,BiffException{ //导入已存在的Excel文件,获得只读的工作薄对象 FileInputStreamfis=newnewnewnewFileInputStream(xlsPath); Workbookwk=Workbook.getWorkbook(fis); //获取第一张Sheet表 Sheetsheet=wk.getSheet(0); //获取总行数 intintintintrowNum=sheet.getRows(); //从数据行开始迭代每一行 forforforfor(intintintinti=2;i
还剩12页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 3 人已下载

下载pdf

pdf贡献者

kklion

贡献于2012-09-26

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf