前言

最近在工作时需要做一个导入导出的功能,出现了几个问题,记录一下
环境为poi3.+版本到poi4.+的过渡



问题一

poi读取Excel2003版本和2007版本以及更高版本的兼容性问题

报错说明:

一开始用的都是.xlsx格式的文件做导入操作,一切都没有问题
后面在做导出功能时引入了一个做导出的工具,这个工具使用的是.xls格式的文件做导出操作的,所以当我使用.xlsx格式的文件去做导出时,就出现了异常报错,如:

1
The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)

提示了一个版本问题,原因是不同格式的Excel文件需要使用不同的处理对象(XSSF/HSSF)进行文件读取;

解决方法

使用POIFSFileSystem.hasPOIFSHeader(inputstream)方法对Excel文件的版本进行判断,由此可以知道到底是需要用XSSFWorkbook对象还是需要用HSSFWorkbook对象来读取文件。



问题二

版本更新的差异问题

问题说明:

开始时是用的3.17版本的poi的jar包,也没有对excel文件的版本做判断。然后我就进行做判断,用的是判断方法是:

1
POIFSFileSystem.hasPOIFSHeader(inputstream)

这个方法可以正确判断Excel是2003还是2007的版本,但是后面我更换了其中一个jar包的版本poi-4.1.2,更新后出现了hasPOIFSHeader方法无法找到的错误,原因是poi-4.0+的版本去掉了hasPOIFSHeader这个判断方法。

解决方法

使用poi-ooxml包中的WorkbookFactory.create(inputStream)方法来创建Workbook对象可以很好解决这个问题;
这是因为HSSFWorkbook和XSSFWorkbook都实现了Workbook接口,创建Workbook时它会自行判断版本。创建代码如下:

1
Workbook wb = WorkbookFactory.create(is);

还有就是更新后原本的对单元格数据类型判断和excel样式代码的新变化

poi3.+版本 poi4.+版本 用途
Cell.CELL_TYPE_STRING CellType.STRING 单元格数据格式判断
HSSFCell.CELL_TYPE_NUMERIC CellType.NUMERIC 单元格数据格式判断
CellStyle.ALIGN_CENTER HorizontalAlignment.CENTER 单元格水平居中
CellStyle.VERTICAL_CENTER VerticalAlignment.CENTER 单元格垂直居中
HSSFColor.GREY_25_PERCENT.index IndexedColors.GREY_25_PERCENT.index 设置图案颜色
CellStyle.SOLID_FOREGROUND FillPatternType.SOLID_FOREGROUND 设置图案样式
CellStyle.BORDER_THIN BorderStyle.THIN 边框
ClientAnchor.MOVE_DONT_RESIZE ClientAnchor.AnchorType.MOVE_DONT_RESIZE.value 单元格插入图片

更具体的请看poi版本升级(3.13到4.0.1)的那些坑



问题三

读取Excel时报500错误

问题说明:

读取Excel时报500错误:这里提示的错误是提示缺少org/apache/commons/compress的jar包

1
java.lang.NoClassDefFoundError: org/apache/commons/compress/archivers/zip/ZipFile

报错原因是因为缺少jar包,版本的更新导致需要新的jar包进行配合,并且所有的poi的jar包版本一定要相同

解决方法

加入缺少的jar包即可

注:使用poi做导入导出时,需要加入如下几个jar包配合食用

commons-math3-3.6.1.jar
commons-compress-1.18.jar
poi-4.1.2.jar
poi-ooxml-4.1.2.jar
poi-ooxml-schemas-4.1.2.jar
poi-examples-4.1.2.jar
poi-excelant-4.1.2.jar
poi-scratchpad-4.1.2.jar

这里只是一部分jar包,如果还需要什么jar包但是项目里没有的,下载jar包加入到项目即可





借鉴链接

poi版本升级(3.13到4.0.1)的那些坑
POI - 读取Excel2003、Excel2007或更高级的兼容性问题



声明

借鉴部分均注明了原文出处,可在文章的`借鉴链接`处获取原文出处
文中若内容有涉及原版权,请邮件联系elvin-chen@qq.com,涉及的相关文章或内容将会及时更改或取消发布