`
dovecat
  • 浏览: 39409 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

poi开发

阅读更多
1、设置分页符的bug。
  
  poi里的HSSFSheet类提供了setRowBreak方法可以设置Sheet的分页符。
  
  Bug:如果你要设置分页符的Sheet是本来就有的,并且你没有在里面插入过分页符,那么调用setRowBreak时POI会抛出空指针的异常。
  
  解决方法:在Excel里给这个sheet插入一个分页符,用POI打开后再把它删掉,然后你就可以随意插入分页符了。
  
  如果sheet是由poi生成的则没有这个问题。我跟踪了setRowBreak的源代码,发现是Sheet.java下的PageBreakRecord rowBreaks这个变量在搞鬼,如果Sheet里原来没有分页符,开发这个模块的那位兄台忘了为这个对象new实例,所以只能我们先手工给Excel插入一个分页符来触发poi为rowBreaks创建实例。
  
  2、如何拷贝行。
  
  我在gmane.org的poi用户论坛翻遍了每个相关的帖子,找遍了api,也没看到一个拷贝行的方法,没办法,只能自己写:
  
  //注:this.fWorkbook是一个HSSHWorkbook,请自行在外部new
  public void copyRows(String pSourceSheetName, 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 targetRowFrom;
  int targetRowTo;
  
  if ((pStartRow == -1) || (pEndRow == -1))
  {
  return;
  }
  sourceSheet = this.fWorkbook.getSheet(pSourceSheetName);
  targetSheet = this.fWorkbook.getSheet(pTargetSheetName);
  //拷贝合并的单元格
  for (i = 0; i < sourceSheet.getNumMergedRegions(); i++)
  {
  region = sourceSheet.getMergedRegionAt(i);
  if ((region.getRowFrom() >= pStartRow) && (region.getRowTo() <= pEndRow))
  {
  targetRowFrom = region.getRowFrom() - pStartRow + 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.getFirstCellNum(); 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(sourceRow.getHeight());
  for (j = sourceRow.getFirstCellNum(); j < sourceRow.getLastCellNum(); j++)
  {
  sourceCell = sourceRow.getCell(j);
  if (sourceCell == null)
  {
  continue;
  }
  targetCell = targetRow.createCell(j);
  targetCell.setEncoding(sourceCell.getEncoding());
  targetCell.setCellStyle(sourceCell.getCellStyle());
  cType = sourceCell.getCellType();
  targetCell.setCellType(cType);
  switch (cType)
  {
  case HSSFCell.CELL_TYPE_BOOLEAN:
  targetCell.setCellValue(sourceCell.getBooleanCellValue());
  break;
  case HSSFCell.CELL_TYPE_ERROR:
  targetCell.setCellErrorValue(sourceCell.getErrorCellValue());
  break;
  case HSSFCell.CELL_TYPE_FORMULA:
  //parseFormula这个函数的用途在后面说明
  targetCell.setCellFormula(parseFormula(sourceCell.getCellFormula()));
  break;
  case HSSFCell.CELL_TYPE_NUMERIC:
  targetCell.setCellValue(sourceCell.getNumericCellValue());
  break;
  case HSSFCell.CELL_TYPE_STRING:
  targetCell.setCellValue(sourceCell.getStringCellValue());
  break;
  }
  }
  }
  }
  
  这个函数有两个问题暂时无法解决:
  
  a、只能在同一个Workbook里面使用,跨Workbook总是拷不过去,不知道为什么?
  
  b、由于在拷贝行时也把行高也拷过去了,如果往这些单元格里写入的数据长度超过单元格长度,那么他们不会自动调整行高!
  
  有哪位大侠知道上面两个问题任意一个的解决方法,请第一时间通知我!!!
  
  3、公式的问题。
  
  POI对Excel公式的支持是相当好的,但是我发现一个问题,如果公式里面的函数不带参数,比如now()或today(),那么你通过getCellFormula()取出来的值就是now(ATTR(semiVolatile))和today(ATTR(semiVolatile)),这样的值写入Excel是会出错的,这也是我上面copyRow的函数在写入公式前要调用parseFormula的原因,parseFormula这个函数的功能很简单,就是把ATTR(semiVolatile)删掉,我把它的代码贴出来:
  private String parseFormula(String pPOIFormula)
  {
  final String cstReplaceString = "ATTR(semiVolatile)"; //$NON-NLS-1$
  StringBuffer result = null;
  int index;
  
  result = new StringBuffer();
  index = pPOIFormula.indexOf(cstReplaceString);
  if (index >= 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写入图片的问题。
  
  我上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;
  }
分享到:
评论

相关推荐

    poi开发三种版本的jar包

    poi开发三种版本的jar包。。poi开发三种版本的jar包。。poi开发三种版本的jar包

    poi开发jar包

    在官网上下载的最新的poi开发所需的jar包。

    poi开发所需要提供的所有架包

    java poi开发Excel所需要提供的所有架包,支持Excel2003 , Excel2007

    Apache的POI开发实例

    Apache的POI组件是Java操作Microsoft Office办公套件的强大API,其中对Word,Excel和PowperPoint都有支持,当然使用较多的还是Excel,因为Word和PowerPoint用程序动态操作的应用较少。那么本文就结合POI来介绍一下...

    POI开发测试数据

    某地区的POI数据,包括XML、Excel、shp等多种格式,字段齐全,为开发测试用

    poi开发例子

    poi开发的例子,官网下载的。导入导出各种office系列

    java poi官方文档

    java poi官方文档,开发java poi必备,纯java支持微软办公软件的类库

    我的JAVA POI开发

    讲解如何使用POI开源API制作EXCL表格

    POI的开发和使用文档.docx

    POI的开发和使用文档,共22页。除开最基本的介绍和使用介绍外,另有使用详解,包含POI结构与常用类、Excel的基本操作、Excel的单元格操作、使用Excel的公式、使用图形、Excel表操作、Excel行列操作、Excel的其他功能...

    poi-5.2.0-API文档-中文版.zip

    赠送jar包:poi-5.2.0.jar; 赠送原API文档:poi-5.2.0-javadoc.jar; 赠送源代码:poi-5.2.0-sources.jar; 赠送Maven依赖信息文件:poi-5.2.0.pom; 包含翻译后的API文档:poi-5.2.0-javadoc-API文档-中文(简体)版...

    POI Apache官方开发包

    Apache POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。目前POI已经有了Ruby版本。 结构: •HSSF - 提供读写Microsoft Excel XLS格式档案的功能。 •XSSF - 提供读写Microsoft Excel OOXML XLSX...

    poi开发实例

    poi实例

    poi开发包读取excel

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

    poi开发使用的jar包

    使用文件上传下载使用的poi的jar包,若果型使用,就下载吧

    java打印POI操作手册

    POI开发手册POI开发手册POI开发手册POI开发手册POI开发手册POI开发手册POI开发手册POI开发手册POI开发手册POI开发手册POI开发手册POI开发手册

    POI 入门 使用教程,参考手册

    POI入门教程,POI入门教程,POI入门教程,POI入门教程

    基于struts2 spring ibatis poi开发的导出Excel实例

    基于struts2 spring ibatis 使用poi组建对查询出数据库表中的数据导出Excel中的源码及案例

    poi,java,excel开发包

    基于Java的excel开发包,Java最基本的解析excel文件包

    poi全部开发jar包 3.8版本

    Java poi开发的全部jar包,3.8 -beta4版本,亲测可用。

    java的POI操作Excel文件

    首先说说现在我所知道的Java编辑Excel文件的两大开源工具: jakarta POI和JavaExcelAPI(简称JXL),这两套工具我都试用了一这段时间,感觉各有优劣吧。...经过比较后,我选择了POI开发我的项目。

Global site tag (gtag.js) - Google Analytics