记一次poi版本升级产生的错误

2020-07-24  本文已影响0人  camus57

前几天经理说要做一个打印的功能,功能简单,设定打印模板后内容填充再转换HTML给前台,前台调用打印机就行了。在网上搜了下word内容填充,发现了poi-tl工具包,查看文档的时候发现需要poi版本在4.1.1以上:


于是升级了项目的poi版本,使用poi-tl根据模板做内容填充很简单,但是之后word转html出现了问题
java.lang.NoSuchMethodError: org.apache.poi.util.IOUtils.copy(Ljava/io/InputStream;Ljava/io/OutputStream;)V

错误出现在FileImageExtractor类的extract方法调用IOUtils.copy时:

public void extract( String imagePath, byte[] imageData )
            throws IOException
    {
        File imageFile = new File( baseDir, imagePath );
        imageFile.getParentFile().mkdirs();
        InputStream in = null;
        OutputStream out = null;
        try
        {
            in = new ByteArrayInputStream( imageData );
            out = new FileOutputStream( imageFile );
            IOUtils.copy( in, out );
        }
        finally
        {
            if ( in != null )
            {
                IOUtils.closeQuietly( in );
            }
            if ( out != null )
            {
                IOUtils.closeQuietly( out );
            }
        }
    }

项目poi之前是3.16的,转html没有问题,于是将poi降版本到4.0.0,发现还是报同样的错误,再降版本到3.17,错误神奇的消失了,然后分别查看4.0.0,3.17的IOUtils.copy方法:

4.0.0
3.17

对比两个版本的copy方法,可以发现4.0.0的copy方法增加了返回值,3.17则是void的,然后再回到出错的地方,FileImageExtractor类存在于org.apache.poi.xwpf.converter.core包下

这个包在我程序中是1.0.0版本,在pom中ctrl单击core包可以看到它内置了3.8版本的poi


将poi版本更换为3.8可以看到copy方法果然是没有返回值的

3.8

也就是说FileImageExtractor类的extract方法在调用IOUtils.copy( in, out )时期待一个没有返回值的copy方法,但是poi 4.1.1却提供了一个return long的copy方法,自然会报NoSuchMethodError。

如果像我这样对poi版本有强制要求并且word转html时需要保存图片时,就只好自己写个继承IImageExtractor的FileImageExtractor和IOUtils类了。

上一篇 下一篇

猜你喜欢

热点阅读