当我调用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();
答案 0 :(得分:0)
因为问题是该异常的根本原因,所以答案是:
org.apache.poi.ss.util.ImageUtils.getImageDimension执行以下操作:
如果给定类型是Workbook.PICTURE_TYPE_JPEG
或Workbook.PICTURE_TYPE_PNG
或Workbook.PICTURE_TYPE_DIB
,则它使用javax.imageio.ImageIO
从给定{{1} }。然后,它为该ImageInputStream
获得了InputStream
个可能的Iterator
s。然后它做错了。它调用ImageReader
来获得第一个可能的ImageInputStream
而不检查Iterator.next
是否根本没有下一个元素。如果ImageReader
中没有下一个元素,则抛出Iterator
。
但是为什么java.util.NoSuchElementException
中没有下一个元素?由于根本只有一个呼叫Iterator
,因此Iterator
中甚至没有一个呼叫Iterator.next
。 ImageReader
甚至没有一个元素。但这意味着Iterator
无法找到声称可以解码提供的Iterator
的当前注册javax.imageio.ImageIO
。这意味着给定的ImageReader
不是ImageInputStream
,InputStream
或InputStream
图片中的jpeg
或当前没有注册的png
声称能够正确解码bmp
,ImageReader
或jpeg
图片。
由于它只会在其他环境中不一致而失败,并且在OP的本地环境中永远不会失败,因此第一个选项不适用。因此,我怀疑如果失败,则当前没有注册的png
声称能够正确解码bmp
,ImageReader
或jpeg
图片。所以我要做的是:
首先:确定使用哪种图片类型失败(png
,bmp
或jpeg
)。
第二:确定在什么环境下失败(操作系统,png
版本,使用的框架,...)。
bmp
版本无关紧要,因为即使Java
都对apache poi
进行了相同的错误调用,而没有先检查apache poi 4.0.1
:org.apache.poi.ss.util.ImageUtils.getImageDimension。