使用java中的Apache poi 3.8在Excel文件上写入图像时发生java.util.NoSuchElementException
当我调用resize方法时,我遇到了以下不一致的异常。 由于以下错误,它有10%的时间失败。我无法在本地环境中复制它使用java中的Apache poi 3.8在Excel文件上写入图像时发生java.util.NoSuchElementException,java,apache-poi,Java,Apache Poi,当我调用resize方法时,我遇到了以下不一致的异常。 由于以下错误,它有10%的时间失败。我无法在本地环境中复制它 java.util.NoSuchElementException at javax.imageio.spi.FilterIterator.next(ServiceRegistry.java:836) at javax.imageio.ImageIO$ImageReaderIterator.next(ImageIO.java:528) at javax.im
java.util.NoSuchElementException
at javax.imageio.spi.FilterIterator.next(ServiceRegistry.java:836)
at javax.imageio.ImageIO$ImageReaderIterator.next(ImageIO.java:528)
at javax.imageio.ImageIO$ImageReaderIterator.next(ImageIO.java:513)
at org.apache.poi.ss.util.ImageUtils.getImageDimension(ImageUtils.java:64)
at org.apache.poi.xssf.usermodel.XSSFPicture.getImageDimension(XSSFPicture.java:278)
at org.apache.poi.xssf.usermodel.XSSFPicture.getPreferredSize(XSSFPicture.java:203)
at org.apache.poi.xssf.usermodel.XSSFPicture.resize(XSSFPicture.java:170)
at org.apache.poi.xssf.usermodel.XSSFPicture.resize(XSSFPicture.java:152)
请提出任何根本原因
我编写的代码片段如下
Sheet sheet2 = workbook.createSheet("Graph");
//feedChartToExcel = new FileInputStream("C:\\Users\\idnyob\\Desktop\\PcrChartImageFogX7eRH4c1551955300676.png");
feedChartToExcel = new FileInputStream(this.imagePath);
// Convert picture to be added into a byte array
byte[] bytes = IOUtils.toByteArray(feedChartToExcel);
// Add Picture to Workbook, Specify picture type as PNG and Get an Index
int pictureId = workbook.addPicture(bytes, Workbook.PICTURE_TYPE_PNG);
// Close the InputStream. We are ready to attach the image to workbook now
feedChartToExcel.close();
// Create the drawing container
XSSFDrawing drawing = (XSSFDrawing) sheet2.createDrawingPatriarch();
// Create an anchor point
XSSFClientAnchor anchor = new XSSFClientAnchor();
// Define top left corner, and we can resize picture suitable from there
anchor.setCol1(2);
anchor.setRow1(1);
// Invoke createPicture and pass the anchor point and ID
XSSFPicture picture = drawing.createPicture(anchor, pictureId);
// Call resize method, which resizes the image
picture.resize();
因为问题是关于该异常的根本原因,所以答案如下: 是否有下列情况: 如果给定的类型是
Workbook.PICTURE\u-type\u-JPEG
或Workbook.PICTURE\u-type\u-PNG
或Workbook.PICTURE\u-type\u-DIB
,则它使用javax.imageio.imageio
从给定的InputStream
创建ImageInputStream
。然后它为该ImageInputStream
获取可能的ImageReader
s的迭代器。然后它就做错了。它调用Iterator.next
来获取第一个可能的ImageReader
,而不检查Iterator
是否有下一个元素。如果迭代器中没有下一个元素,则trowsjava.util.NoTouchElementException
但是为什么迭代器中没有下一个元素呢?因为只有一个调用Iterator.next
,所以Iterator
中甚至没有一个ImageReader
。迭代器甚至没有一个元素。但这意味着,javax.imageio.imageio
无法找到声称能够解码提供的ImageInputStream
的当前注册的ImageReader
。这意味着给定的InputStream
不是来自jpeg
、png
或bmp
图片的InputStream
,或者当前没有注册的声称能够正确解码jpeg
、png
或bmp
图片的ImageReader
由于它只在其他环境中失败,在OP的本地环境中从不失败,因此第一个选项不适用。所以我怀疑,如果它失败了,目前没有注册的ImageReader
声称能够正确解码jpeg
、png
或bmp
图片。所以我要做的是:
第一:确定使用哪种图片类型失败(jpeg
、png
或bmp
)
第二:确定它在什么环境下失败(操作系统,Java
version,使用的框架,…)
apache poi
版本不相关,因为即使是apache poi 4.0.1
也会错误地调用Iterator.next
而没有选中Iterator.hasNext
first:。因为问题是关于该异常的根本原因,下面是答案:
是否有下列情况:
如果给定的类型是Workbook.PICTURE\u-type\u-JPEG
或Workbook.PICTURE\u-type\u-PNG
或Workbook.PICTURE\u-type\u-DIB
,则它使用javax.imageio.imageio
从给定的InputStream
创建ImageInputStream
。然后它为该ImageInputStream
获取可能的ImageReader
s的迭代器。然后它就做错了。它调用Iterator.next
来获取第一个可能的ImageReader
,而不检查Iterator
是否有下一个元素。如果迭代器中没有下一个元素,则trowsjava.util.NoTouchElementException
但是为什么迭代器中没有下一个元素呢?因为只有一个调用Iterator.next
,所以Iterator
中甚至没有一个ImageReader
。迭代器甚至没有一个元素。但这意味着,javax.imageio.imageio
无法找到声称能够解码提供的ImageInputStream
的当前注册的ImageReader
。这意味着给定的InputStream
不是来自jpeg
、png
或bmp
图片的InputStream
,或者当前没有注册的声称能够正确解码jpeg
、png
或bmp
图片的ImageReader
由于它只在其他环境中失败,在OP的本地环境中从不失败,因此第一个选项不适用。所以我怀疑,如果它失败了,目前没有注册的ImageReader
声称能够正确解码jpeg
、png
或bmp
图片。所以我要做的是:
第一:确定使用哪种图片类型失败(jpeg
、png
或bmp
)
第二:确定它在什么环境下失败(操作系统,Java
version,使用的框架,…)
ApachePOI
版本不相关,因为即使是ApachePOI 4.0.1
也会错误地调用Iterator.next
而没有选中Iterator.hasNext
first:。为什么要使用?升级到更现代、更受支持的版本时会发生什么情况?根据该异常org.apache.poi.ss.util.ImageUtils.getImageDimension
调用javax.imageio.imageio$ImageReaderIterator.next
而不检查是否存在下一个元素,您是否可以确认此异常与此版本3.8相关(将是简单的迭代器.hasNext
).在查看代码后,我发现即使在上一个apache poi 4.0.1
中也是如此。但这违反了基本编程规则,apache poi
应该尽快改进。为什么要使用?升级到更现代、更受支持的版本时会发生什么?您能确认吗