前两天项目需用到excel2007/2010,发现以前的POI包已经不能支持得到了,赶紧的到网上找了个最新的POI3.6包,可这个解析方式给我们来了个大变样,以前的在excel2003中用的那一套已经不能适用,网上能找到的又只是一些很简单的例子,没办法,自己来搞吧,好了,开工吧,本文件分别把2007的读文件和写文件的关键代码贴了出来供大家参考,如有更简洁的方式,欢迎指正:
1、读文件,其实从下面的代码中就可以看出其实读excel2007是可以基本上2003通用的,只是Workbook的对像不同而已,当然对于HSSFXXX形式的具体类都需要改成用新的接口:
public static String getHeaders(String filePath){ String ret = null; String suffix = filePath.substring(filePath.lastIndexOf(".")); // 文件后辍. Workbook wb = null; FileInputStream is = new FileInputStream(new File(filePath)); if (TYPE_EXCEL2003.equals(suffix.toLowerCase())) { try { wb = new HSSFWorkbook(is); ret = getHeaders(wb); } catch (Exception e) { throw new FatalBizException(ERROR_CODE_1); } finally { try { is.close(); } //关闭流,finally里可以嵌套trycatch结构 catch (Exception e) { } } } else if (TYPE_EXCEL2007.equals(suffix.toLowerCase())) { try { wb = new XSSFWorkbook(is); ret = getHeaders(wb); } catch (Exception e) { throw new FatalBizException(ERROR_CODE_2); }finally { try { is.close(); } //关闭流,finally里可以嵌套trycatch结构 catch (Exception e) { } } } else { throw new FatalBizException("不支持的文件类型!"); } return ret; } private static String getHeaders(Workbook wb) throws Exception { StringBuffer sb = new StringBuffer("["); int sheetNum = wb.getNumberOfSheets(); if (sheetNum > 0) { Sheet childSheet = wb.getSheetAt(0); int rowNum = childSheet.getLastRowNum(); if (rowNum > 0) { Row headerRow = childSheet.getRow(0); // 目前默认第0行为header int cellNum = headerRow.getLastCellNum(); for (int k = 0; k < cellNum; k++) { if (k != 0) sb.append(","); sb.append("\"").append(headerRow.getCell(k).toString()).append("\""); } } } sb.append("]"); return sb.toString(); }
2、写文件,如果说读文件还差别不大的话,那么写文件就差得比较多了,特别是对单元格颜色的处理改得更加合理了,2003中用模板的形式真的很恶心 ,至于合并单元格,虽然类名不同了,但逻辑还是一致的。
public static Workbook exp(String xml,String pathToSaveFolder,int type) throws IOException, DocumentException { XmlToObj t = new XmlToObj(); ObjForExpImp[] objForExpImps = t.readFromXml(xml); Workbook wb = new XSSFWorkbook(); CreationHelper createHelper = wb.getCreationHelper(); Sheet sheet = wb.createSheet("第一页"); int i; for (ObjForExpImp objForExpImp : objForExpImps) { i = topToRow((int) objForExpImp.getTop()); // create the table head Row row = sheet.createRow(i); int cellstart = leftToCell((int) objForExpImp.getLeft()); Cell hcell = row.createCell(cellstart); RichTextString richTextString = createHelper.createRichTextString( objForExpImp.getTitle()); richTextString.applyFont(createFont(wb, objForExpImp.getFont(), objForExpImp.getFontsize(), true, objForExpImp .getFontstyle(), objForExpImp.getFontweight())); // hcell.setEncoding(HSSFCell.ENCODING_UTF_16); hcell.setCellStyle(getStyle(wb, 1, objForExpImp.getPosition(), null)); hcell.setCellValue(richTextString); merged(sheet, i, cellstart, i, cellstart + objForExpImp.getCellSlength(), getStyle(wb, 1, objForExpImp.getPosition(), null)); // create the table body RowForExp[] rowForExps = objForExpImp.getRowForExps(); i++; Font bodyFont = createFont(wb, objForExpImp.getFont(), objForExpImp.getFontsize(), false, objForExpImp .getFontstyle(), objForExpImp.getFontweight()); // LastRowSpan lastRowSpan = new LastRowSpan(); for (RowForExp rowForExp : rowForExps) { CellForExp[] cellForExps = rowForExp.getCellForExps(); row = sheet.createRow(i); int j = leftToCell((int) objForExpImp.getLeft()); CellStyle cs = wb.createCellStyle(); for (CellForExp cellForExp : cellForExps) { if(0==cellForExp.getColspan()){ //colspan为0的不生成cell. j++; continue; } Cell cell = row.createCell(j); CellStyle cellStyle = getStyle(wb, cellForExp .getRowspan(), cellForExp.getAlign(),cellForExp.getColor()); if (cellForExp.getColspan() > 1 || cellForExp.getRowspan() > 1) { int endcolspan = j + cellForExp.getColspan() - 1; merged(sheet, i, j, i + cellForExp.getRowspan() - 1, endcolspan, cellStyle); } j++; // cell.setEncoding(HSSFCell.ENCODING_UTF_16); RichTextString richString = createHelper.createRichTextString( cellForExp.getData()); richString.applyFont(bodyFont); cell.setCellValue(richString); cell.setCellStyle(cellStyle); } i++; } ImageForExp[] imageForExps = objForExpImp.getImageForExps(); for (ImageForExp imageForExp : imageForExps) { ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); BufferedImage bufferImg = ImageIO.read(new File( pathToSaveFolder + File.separator + imageForExp.getName())); ImageIO.write(bufferImg, "jpg", byteArrayOut); Drawing drawing = sheet.createDrawingPatriarch(); ClientAnchor anchor = new XSSFClientAnchor( 0, 0, 1023, 255, (short) leftToCell(imageForExp.getLeft()), topToRow(imageForExp.getTop()), (short) (lengthToCell(imageForExp.getLength()) + leftToCell(imageForExp .getLeft())), topToRow(imageForExp.getTop()) + (short) height2Row(imageForExp.getHeight())); drawing.createPicture(anchor, wb.addPicture(byteArrayOut .toByteArray(), XSSFWorkbook.PICTURE_TYPE_JPEG)); } } return wb; } private static CellStyle getStyle(Workbook wb, int rowspan, int align, String color) { XSSFCellStyle cs = (XSSFCellStyle)wb.createCellStyle(); if (rowspan > 1) cs.setVerticalAlignment(HSSFCellStyle.VERTICAL_TOP); cs.setAlignment(getAlignment(align)); cs.setBorderBottom(HSSFCellStyle.BORDER_THIN); cs.setBottomBorderColor(HSSFColor.BLACK.index); cs.setBorderLeft(HSSFCellStyle.BORDER_THIN); cs.setLeftBorderColor(HSSFColor.BLACK.index); cs.setBorderRight(HSSFCellStyle.BORDER_THIN); cs.setRightBorderColor(HSSFColor.BLACK.index); cs.setBorderTop(HSSFCellStyle.BORDER_THIN); cs.setTopBorderColor(HSSFColor.BLACK.index); int[] rbg = Utils.hex2rbg(StringUtils.isBlank(color)?"#ffffff":color); cs.setFillForegroundColor(new XSSFColor(new Color(rbg[0],rbg[1],rbg[2]))); cs.setFillPattern(CellStyle.SOLID_FOREGROUND); return cs; } private static void merged(Sheet sheet, int startRow, int startCell, int endRow, int endCell, CellStyle cs) { CellRangeAddress cellRangeAddress = new CellRangeAddress(startRow,endRow, (short) startCell, (short) endCell); sheet.addMergedRegion(cellRangeAddress); setRegionStyle(sheet, cellRangeAddress, cs); } private static void setRegionStyle(Sheet sheet, CellRangeAddress cellRangeAddress, CellStyle cs) { for (int i = cellRangeAddress.getFirstRow(); i <= cellRangeAddress.getLastRow(); i++) { Row row = CellUtil.getRow(i, sheet); for (int j = cellRangeAddress.getFirstColumn(); j <= cellRangeAddress.getLastColumn(); j++) { Cell cell = CellUtil.getCell(row, (short) j); cell.setCellStyle(cs); } } }
好了,代码就贴这么多了,在excel2003是如何渲染背景色、合并单元格、添加图表在这里就不多做说明了,相信网上资料也不少了。