当我调用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();
发布于 2019-03-09 11:10:34
因为问题是关于该异常的根本原因,所以答案如下:
org.apache.poi.ss.util.ImageUtils.getImageDimension执行以下操作:
如果给定的类型是Workbook.PICTURE_TYPE_JPEG
、Workbook.PICTURE_TYPE_PNG
或Workbook.PICTURE_TYPE_DIB
,则它使用javax.imageio.ImageIO
从给定的InputStream
创建ImageInputStream
。然后,它获得该ImageReader
的可能ImageInputStream
s的Iterator
。然后它就做错了。它调用Iterator.next
来获取第一个可能的ImageReader
,而不检查Iterator
是否有下一个元素。如果Iterator
中没有下一个元素,它将拖拽java.util.NoSuchElementException
。
但是为什么Iterator
中没有下一个元素呢?因为只有一个调用Iterator.next
,所以Iterator
中甚至没有一个ImageReader
。Iterator
甚至没有一个元素。但这意味着,javax.imageio.ImageIO
无法找到声称能够解码所提供的ImageInputStream
的当前注册的ImageReader
。这意味着给定的InputStream
不是来自jpeg
、png
或bmp
图片的InputStream
,或者当前没有注册的ImageReader
声称能够正确解码jpeg
、png
或bmp
图片。
由于它只在其他环境中不一致才会失败,并且在OP的本地环境中永远不会失败,因此第一个选项是不适用的。因此,我怀疑,如果它失败了,目前没有注册的ImageReader
声称能够正确解码jpeg
,png
或bmp
图片。所以我要做的是:
首先:确定失败的图片类型(jpeg
、png
或bmp
)。
第二:确定它在哪种环境下出现故障(操作系统、Java
版本、使用的框架等)。
apache poi
版本无关紧要,因为即使apache poi 4.0.1
也会在没有首先检查Iterator.next
的情况下对Iterator.hasNext
执行相同的错误调用:org.apache.poi.ss.util.ImageUtils.getImageDimension。
https://stackoverflow.com/questions/55060533
复制相似问题