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包"是Apache POI库的一个版本,这里是 poi-3.11-beta2,这意味着它是3.11版本的第二个beta版本。 Apache POI 提供了一套API,使得开发者可以在Java环境中读取、写入和修改Microsoft Office格式的...
本压缩包提供了进行POI开发所需的所有依赖包,涵盖了对Excel2003(.xls)和Excel2007(.xlsx)格式的支持。 1. **Apache POI基础** Apache POI是由Apache软件基金会开发的一个项目,其主要目标是创建一个能够读写...
标题提到的“poi开发三种版本的jar包”可能指的是不同版本的Apache POI库,这些版本可能针对不同的功能需求或兼容性问题进行了优化。 Apache POI 提供了几个主要的组件,包括: 1. **HSSF**: 这是处理旧版...
"poi开发使用的jar包"指的是包含了Apache POI库的Java归档(JAR)文件,这个JAR包是进行POI开发的基础。 Apache POI 3.7 版本是较早的一个稳定版本,虽然现在已经有了更新的版本,但依然在许多项目中得到应用。在这...
【基于Struts2 Spring iBatis POI开发的导出Excel实例详解】 在现代Web应用程序中,导出数据到Excel格式是一种常见的需求,这有助于用户分析、存储或共享信息。本实例将详细介绍如何利用Struts2、Spring和iBatis...
在“poi开发包读取excel”的主题下,以下是一些关键知识点: 1. **工作簿(Workbook)**:在POI中,一个Excel文件被抽象为一个Workbook对象。你可以通过HSSFWorkbook或XSSFWorkbook类来创建或打开一个Workbook实例...
### Apache POI 开发与使用知识点详述 #### 一、Apache POI 概述 Apache POI 是 Apache 软件基金会提供的一个开源库,主要用于处理 Microsoft Office 格式的文件,包括 Word、Excel 和 PowerPoint 等。通过提供丰富...
在这个"poi开发实例"中,我们将深入探讨如何使用Apache POI进行Java编程,以创建、读取和修改这些文件。 首先,让我们从Excel处理开始。Apache POI提供了HSSF和XSSF两个API,分别用于处理老版的BIFF8格式(.xls)和...
这个"poi开发例子"提供了使用Apache POI进行开发的具体示例,通过官网下载的版本为3.10.1。 在Apache POI 3.10.1中,你可以学习到以下关键知识点: 1. **POI组件**:了解POI的主要组件,如HSSF(用于处理旧版的...
XML、Excel和shp等多种格式满足了不同应用场景的需求,而开发测试数据集如“百度POI-北京市区-全部分类”和“腾讯POI-广州市区-全部分类”,则为开发者提供了丰富的素材,以便进行功能验证和性能优化。理解和有效...
1. **准备工作**:确保安装了 JDK 1.4 或更高版本,并下载 POI 开发包。可以从 Apache 官方网站获取最新版本。 2. **理解 Excel 结构**:在 POI 中,Excel 文件的结构被抽象为几个关键类: - `HSSFWorkbook` 表示...
Apache的POI组件是Java操作Microsoft Office办公套件的强大API,其中对Word,Excel和PowperPoint都有支持,当然使用较多的还是Excel,因为Word和PowerPoint用程序动态操作的应用较少。那么本文就结合POI来介绍一下...
讲解如何使用POI开源API制作EXCL表格
在Java开发中,Apache POI是解析和生成Excel文件的首选工具,尤其适用于需要批量处理数据或生成报表的应用。 标题中提到的"poi,java,excel开发包"指的是Apache POI项目,它允许Java开发者处理Excel文件。Apache POI...
赠送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 是一个开源项目,由Apache软件基金会维护,它为开发者提供了在Java环境中读取、写入和修改Microsoft Office格式文件的能力。这个强大的库主要关注Excel(XLS和XLSX)、Word(DOC和DOCX)以及PowerPoint...
通过这个最新的Apache POI开发包,开发者不仅可以实现Excel的导入,还能导出Excel,进行复杂的格式设定和计算,极大地扩展了Java在办公自动化领域的应用能力。在实际工作中,结合Maven或Gradle等构建工具,可以轻松...
Apache POI 是一个开源项目,专门用于处理...总之,Apache POI是Java开发中处理Microsoft Office文件的强大工具,通过提供的中文帮助文档和API手册,开发者可以更轻松地理解和应用POI的各种功能,实现高效的文件操作。
在实际开发中,POI非常适用于生成自定义的报告或数据分析结果,因为它可以方便地创建复杂的表格结构,并且能够精确地控制单元格的样式和数据格式。比如,你可以创建带有多个工作表的工作簿,每个工作表可以包含不同...
在Java编程环境中,Apache POI 是一个非常流行的库,它允许开发者读取、写入以及操作Microsoft Office格式的文件,尤其是Excel(.xls 和 .xlsx)文档。在本篇文章中,我们将深入探讨如何使用POI库中的HSSFWorkbook类...