`
dovecat
  • 浏览: 39719 次
  • 性别: 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包"是Apache POI库的一个版本,这里是 poi-3.11-beta2,这意味着它是3.11版本的第二个beta版本。 Apache POI 提供了一套API,使得开发者可以在Java环境中读取、写入和修改Microsoft Office格式的...

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

    本压缩包提供了进行POI开发所需的所有依赖包,涵盖了对Excel2003(.xls)和Excel2007(.xlsx)格式的支持。 1. **Apache POI基础** Apache POI是由Apache软件基金会开发的一个项目,其主要目标是创建一个能够读写...

    poi开发三种版本的jar包

    标题提到的“poi开发三种版本的jar包”可能指的是不同版本的Apache POI库,这些版本可能针对不同的功能需求或兼容性问题进行了优化。 Apache POI 提供了几个主要的组件,包括: 1. **HSSF**: 这是处理旧版...

    poi开发使用的jar包

    "poi开发使用的jar包"指的是包含了Apache POI库的Java归档(JAR)文件,这个JAR包是进行POI开发的基础。 Apache POI 3.7 版本是较早的一个稳定版本,虽然现在已经有了更新的版本,但依然在许多项目中得到应用。在这...

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

    【基于Struts2 Spring iBatis POI开发的导出Excel实例详解】 在现代Web应用程序中,导出数据到Excel格式是一种常见的需求,这有助于用户分析、存储或共享信息。本实例将详细介绍如何利用Struts2、Spring和iBatis...

    poi开发包读取excel

    在“poi开发包读取excel”的主题下,以下是一些关键知识点: 1. **工作簿(Workbook)**:在POI中,一个Excel文件被抽象为一个Workbook对象。你可以通过HSSFWorkbook或XSSFWorkbook类来创建或打开一个Workbook实例...

    POI的开发和使用文档.docx

    ### Apache POI 开发与使用知识点详述 #### 一、Apache POI 概述 Apache POI 是 Apache 软件基金会提供的一个开源库,主要用于处理 Microsoft Office 格式的文件,包括 Word、Excel 和 PowerPoint 等。通过提供丰富...

    poi开发实例

    在这个"poi开发实例"中,我们将深入探讨如何使用Apache POI进行Java编程,以创建、读取和修改这些文件。 首先,让我们从Excel处理开始。Apache POI提供了HSSF和XSSF两个API,分别用于处理老版的BIFF8格式(.xls)和...

    poi开发例子

    这个"poi开发例子"提供了使用Apache POI进行开发的具体示例,通过官网下载的版本为3.10.1。 在Apache POI 3.10.1中,你可以学习到以下关键知识点: 1. **POI组件**:了解POI的主要组件,如HSSF(用于处理旧版的...

    POI开发测试数据

    XML、Excel和shp等多种格式满足了不同应用场景的需求,而开发测试数据集如“百度POI-北京市区-全部分类”和“腾讯POI-广州市区-全部分类”,则为开发者提供了丰富的素材,以便进行功能验证和性能优化。理解和有效...

    POI中文开发文档

    1. **准备工作**:确保安装了 JDK 1.4 或更高版本,并下载 POI 开发包。可以从 Apache 官方网站获取最新版本。 2. **理解 Excel 结构**:在 POI 中,Excel 文件的结构被抽象为几个关键类: - `HSSFWorkbook` 表示...

    Apache的POI开发实例

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

    我的JAVA POI开发

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

    poi,java,excel开发包

    在Java开发中,Apache POI是解析和生成Excel文件的首选工具,尤其适用于需要批量处理数据或生成报表的应用。 标题中提到的"poi,java,excel开发包"指的是Apache POI项目,它允许Java开发者处理Excel文件。Apache POI...

    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文档-中文(简体)版...

    java poi官方文档

    Java POI 是一个开源项目,由Apache软件基金会维护,它为开发者提供了在Java环境中读取、写入和修改Microsoft Office格式文件的能力。这个强大的库主要关注Excel(XLS和XLSX)、Word(DOC和DOCX)以及PowerPoint...

    POI最新官方开发包及文档

    通过这个最新的Apache POI开发包,开发者不仅可以实现Excel的导入,还能导出Excel,进行复杂的格式设定和计算,极大地扩展了Java在办公自动化领域的应用能力。在实际工作中,结合Maven或Gradle等构建工具,可以轻松...

    POI中文帮助文档附带api手册.zip

    Apache POI 是一个开源项目,专门用于处理...总之,Apache POI是Java开发中处理Microsoft Office文件的强大工具,通过提供的中文帮助文档和API手册,开发者可以更轻松地理解和应用POI的各种功能,实现高效的文件操作。

    POI 中文学习文档(.doc)

    在实际开发中,POI非常适用于生成自定义的报告或数据分析结果,因为它可以方便地创建复杂的表格结构,并且能够精确地控制单元格的样式和数据格式。比如,你可以创建带有多个工作表的工作簿,每个工作表可以包含不同...

    POI整理的完整详细的开发资料

    在Java编程环境中,Apache POI 是一个非常流行的库,它允许开发者读取、写入以及操作Microsoft Office格式的文件,尤其是Excel(.xls 和 .xlsx)文档。在本篇文章中,我们将深入探讨如何使用POI库中的HSSFWorkbook类...

Global site tag (gtag.js) - Google Analytics