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