- 浏览: 44834 次
- 性别:
- 来自: 上海
最新评论
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不能写入图片,那我们只能把目光投向JXL,我用JXL写入图片功能是实现了,付出的代价是now()和today()这些函数丢失掉了,鱼与熊掌不能兼得吧,至于怎么解决JXL公式的问题,到下面这个帖子里和我一起守株待兔吧:
http://community.csdn.net/Expert/topic/3569/3569340.xml?temp=.8480646
发表评论
-
HttpClient(too many open files)
2010-06-12 13:56 1650错误信息: java.net.SocketException ... -
log4j配置
2010-06-07 18:09 762log4j配置祥解 第一步:加入log4j-1.2.8 ... -
文件mime类型
2010-06-04 09:29 1064amr audio/amr pmd ... -
Spring管理filter和servlet
2009-10-20 16:06 4541Spring管理filter和servlet在使用spring ... -
spring中quarz的配置
2009-08-25 18:21 1019字段 允许值 允许的特殊字符 秒 ... -
Struts,Spring,Hibernate优缺点
2009-08-17 16:14 8941.strutsstruts框架具有组 ... -
Spring 框架的优点及缺点
2009-08-17 15:36 1158首先Spring 是一个框架,使用Spring并不代表代码质量 ... -
C3P0 配置
2009-06-23 13:58 900官方文档 : http://www.mchange.com/p ... -
PrepareStatement和Statement的区别(SQL执行优化)
2009-06-22 21:49 2379看下面两段程序片断: ... -
Servlet和Filter的url匹配以及url-pattern详解
2009-06-12 15:01 1120Servlet和filter是J2EE开发中常用的技术,使用方 ... -
用servlet显示图片
2009-06-12 14:54 1702最近,公司用servlet做一个跟踪图片点击技术的模块,我个人 ... -
java读取图片大小属性
2009-06-11 15:13 7318经测试下来,一下两种方案针对不同大小的图片所消耗的时间不同 ...
相关推荐
POI 合并单元格 及 注意事项
《POI数据预处理在ArcMap中的操作及注意事项》 POI(Point of Interest),即兴趣点数据,广泛应用于地理信息系统(GIS)中,用于表示特定地理位置,如餐馆、公园、医院等。对POI数据进行预处理是数据分析的重要...
4. **注意事项** - **内存管理**:由于Android设备的内存限制,处理大型Excel文件时需谨慎,避免一次性加载整个工作簿。可以使用流式处理或分块读写来减少内存消耗。 - **性能优化**:使用低级别的API(如SXSSF)...
4. **注意事项** - POI处理大型Excel文件时可能会消耗大量内存,因此在处理大型文件时需要考虑内存管理和分块读写策略。 - 老版本的POI可能不支持最新的Office文件格式或特性,因此对于新格式的文件,应尽可能使用...
**注意事项** - POI-3.9版本可能不支持Excel的最新特性,对于较新的文件格式,可能需要更新到更高版本的POI。 - 大量数据处理时,需注意内存管理,因为加载整个工作簿可能会消耗大量内存。可以使用SXSSF(Streaming ...
**使用POI的注意事项** 1. 内存管理:处理大型文件时,要注意内存分配,避免OOM(Out Of Memory)错误。 2. 文件格式兼容性:不同版本的Office文件可能需要不同的POI API来处理。 3. 错误处理:正确处理文件读写过程...
9. 使用POI的注意事项 在使用POI时,需要注意以下几点:首先,需要安装相关的依赖项。其次,需要 imports 相关的Package。最后,需要正确地使用POI的API。 10. POI的未来发展 POI的未来发展方向是继续完善文档...
9. **注意事项**:处理大型Excel文件时,需要注意内存管理,因为POI会将整个工作簿加载到内存中。可以使用SXSSF API来实现流式处理,以降低内存消耗。 10. **版本更新**:Apache POI持续进行版本迭代,每次更新都会...
**Java操作Excel的注意事项** 1. **内存管理**:处理大型Excel文件时,注意内存使用,避免OOM错误。可以使用SXSSFWorkbook,它以流式处理数据,降低内存消耗。 2. **数据类型**:Excel中的数据类型包括字符串、...
6. **注意事项**:在使用过程中,要注意内存管理和性能优化,因为大量数据可能导致内存溢出。POI提供了流式API来处理大文件,避免一次性加载整个工作簿到内存中。 总之,这个压缩包提供了多个版本的Apache POI和DOM...
五、限制与注意事项: 1. 不支持分页:转换后的HTML不会包含Word文档中的分页信息,这可能导致长文档在网页预览时布局发生变化。 2. 只支持DOC不支持DOCX:代码示例仅适用于旧版的Word文档格式(.doc),对于新版的...
性能和注意事项** 由于Java POI是在内存中处理整个文件,因此对于大型文件,可能会消耗大量内存。为优化性能,可以考虑分批读写或使用SXSSF API(提供流式写入功能)。 总之,Java POI是一个强大的库,使Java...
5. **注意事项**: - 关闭资源:在读写操作完成后,一定要记得关闭FileInputStream、FileOutputStream和Workbook实例,防止内存泄漏。 - 数据类型转换:Excel中的单元格可以包含多种数据类型,如字符串、数字、...
**注意事项** - 选择正确的图片类型(如PICTURE_TYPE_JPEG, PICTURE_TYPE_PNG等)取决于你的图片格式。 - 图片的大小和位置可能需要根据实际需求进行调整。 - 如果在合并单元格时遇到问题,确保已正确设置合并区域。...
6. **注意事项**: - POI处理大型文件可能会消耗大量内存,因此在处理大数据时需谨慎,并考虑使用流式处理或SXSSF低内存模型。 - 文件版本兼容性:不同版本的POI可能对不同版本的Office文件支持程度不同,确保库...
#### 五、注意事项 1. **批注位置**:`XSSFClientAnchor` 的构造函数参数决定了批注的显示位置,需要根据实际需求调整。 2. **字体样式**:`XSSFFont` 可以设置多种字体属性,如字体颜色、加粗、斜体等。 3. **批注...
5. **注意事项**:由于Apache POI处理的老版Office格式不包含富文本或图像,转换后的HTML可能丢失部分格式或图片。此外,转换过程中要特别注意兼容性问题,确保HTML在各种浏览器中都能正确显示。 6. **库依赖**:...
#### 五、注意事项 - 在实际开发中,需要妥善处理文件流的关闭操作,避免资源泄露。 - 处理图片时要注意图片格式与扩展名的一致性,确保图片能被正确解析和展示。 - POI 库版本更新可能会对API有所调整,请根据实际...
POI中的Excel导入注意事项 在使用POI读取Excel文档时,需要注意以下几点: 1. Excel文档的版本:POI支持多种Excel文档版本,包括xls、xlsx等。 2. 文档编码:POI支持多种文档编码,包括GBK、UTF-8等。 3. 单元格...
5. **注意事项**: - 大文件处理时,使用SXSSF可以避免内存溢出。 - 适当关闭资源,如Workbook和InputStream,以防止内存泄漏。 - 处理公式时,需要确保公式计算的正确性和性能。 - 对于复杂格式,需谨慎处理,...