java.util.NoSuchElementException при записи изображения в файл Excel с использованием Apache poi 3.8 в Java - PullRequest
1 голос
/ 08 марта 2019

Я получаю ниже противоречивого исключения, когда я вызываю метод изменения размера. Это терпит неудачу 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 голосов
/ 09 марта 2019

Поскольку вопрос касался основной причины этого исключения, вот ответ:

org.apache.poi.ss.util.ImageUtils.getImageDimension делает следующее:

Если данный тип имеет тип Workbook.PICTURE_TYPE_JPEG или Workbook.PICTURE_TYPE_PNG или Workbook.PICTURE_TYPE_DIB, то он использует javax.imageio.ImageIO для создания ImageInputStream из заданного InputStream.Затем он получает Iterator возможных ImageReader с для этого ImageInputStream.И тогда это делает неправильно.Он вызывает Iterator.next, чтобы получить первый возможный ImageReader, не проверяя, есть ли у Iterator следующий элемент вообще.Это выдает java.util.NoSuchElementException, если в Iterator нет следующего элемента.

Но почему в Iterator нет следующего элемента?Поскольку существует только один вызов Iterator.next, в Iterator нет даже одного ImageReaderIterator нет даже одного элемента.Но это означает, что javax.imageio.ImageIO не смог найти зарегистрированный в настоящее время ImageReader, который утверждает, что может декодировать поставленный ImageInputStream.И это означает, что либо данный InputStream не был InputStream из jpeg, png или bmp изображения, либо в настоящее время не зарегистрировано 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 .

...