美文网首页
记一次poi版本升级产生的错误

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

作者: camus57 | 来源:发表于2020-07-24 17:15 被阅读0次

    前几天经理说要做一个打印的功能,功能简单,设定打印模板后内容填充再转换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类了。

    相关文章

      网友评论

          本文标题:记一次poi版本升级产生的错误

          本文链接:https://www.haomeiwen.com/subject/jdqslktx.html