`
panyi5202
  • 浏览: 56684 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

poi3.6对excel2007的读写

阅读更多

      前两天项目需用到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是如何渲染背景色、合并单元格、添加图表在这里就不多做说明了,相信网上资料也不少了。

2
3
分享到:
评论
4 楼 panyi5202 2010-06-21  
to1楼,这些都是静态变量来的,这个和关键代码没有多大关系的,这个是我为了怕有的人上传的文件是excel2003的,但是后辍却是.xlsx,或文件是2007,后辍却是.xls做的一些处理。
3 楼 panyi5202 2010-06-21  
那是因为你有包没有加进去:
xbean.jar
xbean_xpath.jar
xmlbeans-2.3.0.jar
xmlbeans-qname.jar
xmlpublic.jar
2 楼 JavaCrazyer 2010-06-21  
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xmlbeans/XmlException 怎么报这个错呢
1 楼 JavaCrazyer 2010-06-21  
TYPE_EXCEL2003 ERROR_CODE_1 这都是哪里来的啊?

相关推荐

Global site tag (gtag.js) - Google Analytics