在Java中使用Apache Poi 3.8在Excel文件上写入图像时出现java.util.NoSuchElementException

时间:2019-03-08 09:46:05

标签: 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.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();

1 个答案:

答案 0 :(得分:0)

因为问题是该异常的根本原因,所以答案是:

org.apache.poi.ss.util.ImageUtils.getImageDimension执行以下操作:

如果给定类型是Workbook.PICTURE_TYPE_JPEGWorkbook.PICTURE_TYPE_PNGWorkbook.PICTURE_TYPE_DIB,则它使用javax.imageio.ImageIO从给定{{1} }。然后,它为该ImageInputStream获得了InputStream个可能的Iterator s。然后它做错了。它调用ImageReader来获得第一个可能的ImageInputStream而不检查Iterator.next是否根本没有下一个元素。如果ImageReader中没有下一个元素,则抛出Iterator

但是为什么java.util.NoSuchElementException中没有下一个元素?由于根本只有一个呼叫Iterator,因此Iterator中甚至没有一个呼叫Iterator.nextImageReader甚至没有一个元素。但这意味着Iterator无法找到声称可以解码提供的Iterator的当前注册javax.imageio.ImageIO。这意味着给定的ImageReader不是ImageInputStreamInputStreamInputStream图片中的jpeg或当前没有注册的png声称能够正确解码bmpImageReaderjpeg图片。

由于它只会在其他环境中不一致而失败,并且在OP的本地环境中永远不会失败,因此第一个选项不适用。因此,我怀疑如果失败,则当前没有注册的png声称能够正确解码bmpImageReaderjpeg图片。所以我要做的是:

首先:确定使用哪种图片类型失败(pngbmpjpeg)。

第二:确定在什么环境下失败(操作系统,png版本,使用的框架,...)。

bmp版本无关紧要,因为即使Java都对apache poi进行了相同的错误调用,而没有先检查apache poi 4.0.1org.apache.poi.ss.util.ImageUtils.getImageDimension