《java的POI操作Excel.doc》由会员分享,可在线阅读,更多相关《java的POI操作Excel.doc(12页珍藏版)》请在金锄头文库上搜索。
1、java的POI操作Excel文件(2)现在我要做的东西基本完成啦,我把这段时间使用POI的一些心得总结出来,希望能对和我遇到相同问题的朋友有所帮助,至于POI基本的使用方法,自己去看文档吧。1、设置分页符的bugPOI里的HSSFSheet类提供了setRowBreak方法可以设置Sheet的分页符。Bug:如果你要设置分页符的Sheet是本来就有的,并且你没有在里面插入过分页符,那么调用setRowBreak时POI会抛出空指针的异常。解决方法:在Excel里给这个sheet插入一个分页符,用POI打开后再把它删掉,然后你就可以随意插入分页符了。如果sheet是由POI生成的则没有这个问题
2、。我跟踪了setRowBreak的源代码,发现是Sheet.Java下的PageBreakRecord rowBreaks这个变量在搞鬼,如果Sheet里原来没有分页符,开发这个模块的那位兄台忘了为这个对象new实例,所以只能我们先手工给Excel插入一个分页符来触发POI为rowBreaks创建实例。2、如何拷贝行我在gmane.org的POI用户论坛翻遍了每个相关的帖子,找遍了api,也没看到一个拷贝行的方法,没办法,只能自己写:/注:this.fWorkbook是一个HSSHWorkbook,请自行在外部new public void copyRows (String pSourceSh
3、eetName, String pTargetSheetName, int pStartRow, int pEndRow, int pPosition) HSSFRow sourceRow = null; HSSFRow targetRow = null; HSSFCell sourceCell = null; HSSFCell targetCell = null; HSSFSheet sourceSheet = null; HSSFSheet targetSheet = null; Region region = null; int cType; int i; short j; int ta
4、rgetRowFrom; int targetRowTo; if (pStartRow = -1) | (pEndRow = -1) return; sourceSheet = this.fWorkbook.getSheet(pSourceSheetName); targetSheet = this.fWorkbook.getSheet(pTargetSheetName); /拷贝合并的单元格 for (i = 0; i = pStartRow) & (region.getRowTo() = pEndRow) targetRowFrom = region.getRowFrom() - pSta
5、rtRow + pPosition; targetRowTo = region.getRowTo() - pStartRow + pPosition; region.setRowFrom(targetRowFrom); region.setRowTo(targetRowTo); targetSheet.addMergedRegion(region); /设置列宽 for (i = pStartRow; i = pEndRow; i+) sourceRow = sourceSheet.getRow(i); if (sourceRow != null) for (j = sourceRow.get
6、FirstCellNum(); j sourceRow.getLastCellNum(); j+) targetSheet.setColumnWidth(j, sourceSheet.getColumnWidth(j); break; /拷贝行并填充数据 for (;i = pEndRow; i+) sourceRow = sourceSheet.getRow(i); if (sourceRow = null) continue; targetRow = targetSheet.createRow(i - pStartRow + pPosition); targetRow.setHeight(
7、sourceRow.getHeight(); for (j = sourceRow.getFirstCellNum(); j = 0) result.append(pPOIFormula.substring(0, index); result.append(pPOIFormula.substring(index + cstReplaceString.length(); else result.append(pPOIFormula); return result.toString(); 至于为什么会出现ATTR(semiVolatile),还需要大家的探索精神!4、向Excel写入图片的问题。我
8、上POI论坛查相关帖子,得到两种结论:1、不支持写入图片;2、支持写入图片,通过EscherGraphics2d这个Class实现。于是我就去查EscherGraphics2d这个Class,发现这个Class提供了N个drawImage方法,喜出望外的我开始写代码,结果调了一天,一直看不到效果,黔驴技穷的我在万般无奈下只好跟踪进drawImage这个函数内部,经过N个函数调用后在最底层函数发现了最终答案:public boolean drawImage(Image image, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgColor, ImageObserver imageobserver) if (logger.check( POILogger.WARN ) logger.log(POILogger.WARN,drawImage() not supported); return true; 所以我强烈建议大家,以后使用第三方开发包一定尽量下载它的源代码,这样你在碰到问题时,看看它的的内部是怎么实现的,很多