使用java中的Apache poi 3.8在Excel文件上写入图像时发生java.util.NoSuchElementException

使用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

当我调用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.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
是否有下一个元素。如果
迭代器中没有下一个元素,则trows
java.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
是否有下一个元素。如果
迭代器中没有下一个元素,则trows
java.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
应该尽快改进。为什么要使用?升级到更现代、更受支持的版本时会发生什么?您能确认吗