1 POI介绍与相关jar包
JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI 。jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel。而poi可以操作Excel 95及以后的版本,即可操作后缀为 .xls 和 .xlsx两种格式的excel。 JXL的官网为:http://www.andykhan.com/jexcelapi
POI全称 Poor Obfuscation Implementation,直译为“可怜的模糊实现”,利用POI接口可以通过JAVA操作Microsoft office 套件工具的读写功能。官网:http://poi.apache.org ,POI支持office的所有版本,并且在接下来的演示中需要从前端页面导入用户上传的版本不确定的excel文件,所以选择POI来讲解。
在官网中下载jar包以及源码包:
下载完后,打开“poi-bin-3.10.1-20140818”获取操作excel需要的jar包,并将这些jar包复制到项目中。对于只操作2003 及以前版本的excel,只需要poi-3.10.1-20140818.jar ,如果需要同时对2007及以后版本进行操作则需要复制 poi-ooxml-3.10.1-20140818.jar,poi-ooxml-schemas-3.10.1-20140818.jar,以及复制在ooxml-lib目录下的xmlbeans-2.6.0.jar,dom4j-1.6.1.jar。
在“poi-bin-3.10.1-20140818poi-3.10.1docsapidocs”目录中,点击“index.html”查看POI api文档,我们可以查询POI中所有这些对象的属性和方法。
2 POI与Excel
(03版) xls
(1)、 Excel 的工作簿对应POI的HSSFWorkbook对象;
(2)、 Excel 的工作表对应POI的HSSFSheet对象;
(3)、 Excel 的行对应POI的HSSFRow对象;
(4)、 Excel 的单元格对应POI的HSSFCell对象。
(07版) xlsx
(1) Excel 的工作簿对应POI的XSSFWorkbook对象;
(2) Excel 的工作表对应POI的XSSFSheet对象;
(3) Excel 的行对应POI的XSSFRow对象;
(4)Excel 的单元格对应POI的XSSFCell对象。
3 API
3.1 格式化Excel
在POI中可以利用格式化对象来格式化excel文档;也即设置excel内容的样式。POI中主要的格式化对象常用的有合并单元格、设置单元格字体、边框,背景颜色等。
合并单元格
在POI中有一个CellRangeAddress对象,中文直译是 单元格范围地址,主要用于在单元格的合并上,这个对象的构造方法CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol) 有4个参数,分别表示(起始行号,终止行号, 起始列号,终止列号), 设置这个对象中要合并的单元格范围后,工作表对象sheet调用方法addMergedRegion(CellRangeAddress region) ,将上述设置的CellRangeAddress对象作为参数传入即可合并单元格。
【注意:上图中合并单元格后,单元格的名称是第一个单元格;即上面中合并了第二行的第二列到第五列,合并后的单元格叫B2,而其它被合并的单元格已经无效了,不能对无效单元格设置值。如果进行了设置将不显示。】
设置单元格样式
首先要设置单元格样式则要先初始化POI中的单元格样式对象HSSFCellStyle,然后在样式对象中设置不同的样式(内容位置、字体、背景、颜色、边框等)。单元格样式是由工作簿workbook创建的,一个工作簿可以创建多个样式。
① 设置单元格内容位置;设置水平位置 setAlignment(short align) ,设置垂直位置setVerticalAlignment(short align)
② 设置单元格字体;POI中的字体对象为HSSFFont,字体是由工作簿创建,可以用于多个单元格上。
③ 设置单元格背景色。
4 POI案例
工具: myeclipse2015, mysql,tomcat6.0
技术支持: struts2 hibernate3.6,spring3版本
需求实现: execl的导入并且保存到数据库;从数据库中生成execl表, 前端界面可以下载!
导出核心代码:
1 //execl表导出 2 public void doExportExcel() throws Exception{ 3 userlist= userService.findObjects(); 4 HttpServletResponse res= ServletActionContext.getResponse(); 5 res.setContentType("application/x-execl"); 6 res.setHeader("Content-Disposition", "attachment;filename= "+new String("用户表.xls".getBytes(), "ISO-8859-1")); 7 ServletOutputStream outputStream = res.getOutputStream(); 8 userService.exportExcel(userlist,outputStream); 9 10 if(outputStream != null){ 11 outputStream.close(); 12 } 13 14 15 }
1 public class UserexeclUntils { 2 3 //导出execl 4 public static void exportExcel(List<User> userlist, 5 ServletOutputStream outputStream) { 6 // 1 创建工作簿 7 8 HSSFWorkbook workbook=new HSSFWorkbook(); 9 //1.1创建合并单元格 10 11 CellRangeAddress cellrangeaddress=new CellRangeAddress(0,0,0,4);//起始行, 结束行, 起始列,结束列 12 13 //1.2 创建头标题样式 14 HSSFCellStyle style1=cellStyle(workbook,(short) 16); 15 //1.3 创建列表题样式 16 HSSFCellStyle style2=cellStyle(workbook,(short) 13); 17 18 // 2 创建工作表 19 HSSFSheet sheet=workbook.createSheet("用户表"); 20 sheet.addMergedRegion(cellrangeaddress); 21 //设置工作表行宽样式 22 sheet.setDefaultColumnWidth(25); 23 // 3,4 创建行和列 24 25 //第一行 26 HSSFRow row=sheet.createRow(0); 27 HSSFCell cell=row.createCell(0); 28 cell.setCellStyle(style1); 29 cell.setCellValue("用户列表"); 30 31 //创建第二行 32 HSSFRow row1=sheet.createRow(1); 33 String[] values={"用户名","账号","所属部门","性别","电子邮箱"}; 34 for(int i=0;i<values.length;i++){ 35 HSSFCell ce=row1.createCell(i); 36 ce.setCellStyle(style2); 37 ce.setCellValue(values[i]); 38 39 } 40 41 42 //迭代用户信息 43 User u=null; 44 if(userlist!=null){ 45 for(int j=0;j<userlist.size();j++){ 46 u=userlist.get(j); 47 //创建行 48 HSSFRow hssfRow=sheet.createRow(j+2); 49 //创建列 50 HSSFCell cell11=hssfRow.createCell(0); 51 cell11.setCellValue(u.getName()); 52 HSSFCell cell12=hssfRow.createCell(1); 53 cell12.setCellValue(u.getAccount()); 54 HSSFCell cell13=hssfRow.createCell(2); 55 cell13.setCellValue(u.getDept()); 56 HSSFCell cell14=hssfRow.createCell(3); 57 cell14.setCellValue(u.isGender()?"男":"女"); 58 HSSFCell cell15=hssfRow.createCell(4); 59 cell15.setCellValue(u.getEmail()); 60 } 61 } 62 //将工作簿写到输出流 63 try { 64 workbook.write(outputStream); 65 } catch (Exception e) { 66 e.printStackTrace(); 67 } 68 69 70 } 71 72 public static HSSFCellStyle cellStyle(HSSFWorkbook workbook,short size){ 73 74 HSSFCellStyle style =workbook.createCellStyle(); 75 style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中 76 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中! 77 78 79 HSSFFont font= workbook.createFont(); 80 font.setFontHeightInPoints(size); 81 font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 82 // 83 style.setFont(font); 84 return style; 85 } 86 87 88 }
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
导入核心代码:
1 //execl表导入 2 @Override 3 public void doImportExcel(File userExcel, String userExcelFileName) { 4 //获取文件输出流 5 FileInputStream fileInputStream; 6 Workbook workbook; 7 try { 8 fileInputStream = new FileInputStream(userExcel); 9 boolean is03execl=userExcelFileName.matches("^.+\.(?i)(xls)$"); 10 //创建工作簿 11 workbook=is03execl?new HSSFWorkbook(fileInputStream):new XSSFWorkbook(fileInputStream); 12 //获取工作表 13 Sheet sheet=workbook.getSheetAt(0); 14 User u=null; 15 if(sheet.getPhysicalNumberOfRows()>2){ 16 //说明存在用户数据,迭代保存到数据库 17 for(int i=2;i<sheet.getPhysicalNumberOfRows();i++){ 18 u=new User(); 19 //获取第i行 20 Row row=sheet.getRow(i); 21 u.setName(row.getCell(0).getStringCellValue()); 22 u.setAccount(row.getCell(1).getStringCellValue()); 23 u.setDept(row.getCell(2).getStringCellValue()); 24 u.setGender(row.getCell(3).getStringCellValue().equals("男")); 25 26 String mobile=""; 27 try{ 28 mobile= row.getCell(4).getStringCellValue(); 29 30 }catch(Exception e){ 31 mobile=BigDecimal.valueOf(row.getCell(4).getNumericCellValue()).toString(); 32 } 33 34 u.setMobile(mobile); 35 u.setEmail(row.getCell(5).getStringCellValue()); 36 u.setBirthday(row.getCell(6).getDateCellValue()); 37 save(u); 38 } 39 40 } 41 42 } catch (Exception e) { 43 // TODO Auto-generated catch block 44 e.printStackTrace(); 45 } 46 }
````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````