POI框架开发经验小结

POI框架使用了一段时间,总结下自己的使用经验。

POI框架介绍

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

1. 07版excel行的上限

2的20次方,超过这个值会报错

2. 下拉列表能包含的最多字符个数

下拉列表能包含的最多字符个数256个,超了就不显示。如果下拉列表的数据超过了256个字符,只能用函数的方式引用另一列作为数据源

3. 不同workbook类实例间不能复制样式

  This Style does not belong to the supplied Workbook Stlyes Source. Are you trying to assign a style from one workbook to the cell of a differnt workbook?
java.lang.IllegalArgumentException: This Style does not belong to the supplied Workbook Stlyes Source. Are you trying to assign a style from one workbook to the cell of a differnt workbook?
    at org.apache.poi.xssf.usermodel.XSSFCellStyle.verifyBelongsToStylesSource(XSSFCellStyle.java:120)
    at org.apache.poi.xssf.usermodel.XSSFCell.setCellStyle(XSSFCell.java:651)
    at org.apache.poi.xssf.usermodel.XSSFCell.copyCellFrom(XSSFCell.java:184)
    at org.apache.poi.xssf.usermodel.XSSFRow.copyRowFrom(XSSFRow.java:640)

4. 向cell设置非string类型的值

向cell设置非string类型的值时,同时要设置cell的类型。否则打开excel的时候excel会有错误提示,“数字类型以字符串形式存储”,poi这一点做的不完善。如果设置的数字类型,那么poi应该自动把单元格类型设置成数字类型才对。

 destRowCell.setCellValue(sourceRowCell.getNumericCellValue());
 destRowCell.setCellType(CellType.NUMERIC);

5. 关于autoSizeColumn(int, boolean) 方法

这个方法一定要放在excel处理的最后使用,一开始就用或者中途用达不到效果

6. 强制用户从下拉列表中取值

加了这个校验,一旦用户手动输入,excel会弹错误提示。excel有这样的特点,即使提供下拉列表,也可以手动输入值。

 XSSFDataValidation dataValidation = (XSSFDataValidation) helper.createValidation(constraint, regions);
        dataValidation.createErrorBox("输入错误", "请从下拉列表中取值");
        dataValidation.setShowErrorBox(true);

7. 设置单元格背景色

XSSFCellStyle errorCellStyle = errorBook.createCellStyle();
errorCellStyle.setFillForegroundColor(new XSSFColor(Color.RED));
errorCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);

setFillBackgroundColor,这个方式不起效果。

8. 设置row默认高度

org.apache.poi.xssf.usermodel.XSSFSheet#setDefaultRowHeightInPoints不可靠。在mac上,excel文件和其他文件压缩zip包之后,填了数据的行,会恢复设置前的excel本身的默认高度。

9. 设置列宽

org.apache.poi.xssf.usermodel.XSSFSheet#autoSizeColumn(int),在单元格有中文的情况下,会出问题(mac上2016版不会有问题),正确的方式是取出字符串的字节数,再乘以256

扫描二维码关注公众号,回复: 941796 查看本文章
 xssfSheet.setColumnWidth(columnIndex, string.getBytes().length * 256);

10. excel支持的最大行数和列数

在POI的这个类里有定义,包括03版一下的和07版以上的

org.apache.poi.ss.SpreadsheetVersion

11. sheet名字的最大长度

30个字符,超了就会被excel自动截断。并且名字里不能包括“\”, “/”, “[“, “]”, “*”, “?” 。建议使用poi自带工具方法设置sheet的name, 这个方法会自动过滤非法字符:

org.apache.poi.ss.util.WorkbookUtil#createSafeSheetName(java.lang.String, char)

12. XssfWorkBook解析Ole2格式的xls文件会报如下异常。部分2007版excel用户也会报如下错误,可能是excel客户端的问题

org.apache.poi.openxml4j.exceptions.OLE2NotOfficeXmlFileException: The supplied data appears to be in the OLE2 Format. You are calling the part of POI that deals with OOXML (Office Open XML) Documents. You need to call a different part of POI to process this data (eg HSSF instead of XSSF)

03版一下的excel文件用HssfWorkBook打开,07版以上的excel文件则需要用XssfWorkBook类打开,不能串。

13. 日期数据的判断与解析

日期数据是org.apache.poi.ss.usermodel.CellType#NUMERIC的一个特例,当一个单元格是Numeric类型的时候,再用下面的方法判断是否是日期类型

if (DateUtil.isCellDateFormatted(cell)) {
    Date dateCellValue = cell.getDateCellValue();
}

DateUtil全路径: org.apache.poi.ss.usermodel.DateUtil

14. 平台兼容性问题

这里指的是mac/windows平台的兼容性。我的开发机是mac的,用poi开发出来的excel模板的样式在mac上调的十分漂亮。但是在测试同学的windows机器上特别难看,为了解决windows上样式的问题,我不得不装一台windows虚拟机,一点一点的调windows上的样式问题。

15. 整型溢出问题

excel单元格里设置数字的时候,excel会将数字存成double类型。亲测当数字超过15位的时候,数据会出现精度丢失,更长的时候,最后将以科学计数法表示。如果希望完整的保存一个大数字,可以通过将单元格设置成字符型来绕过。后端处理的时候再转成BigDecimal类型就可以了。

excel_digit

猜你喜欢

转载自blog.csdn.net/bruce128/article/details/78887529
今日推荐