Apache POI禁用图片的自动调整大小

时间:2019-11-08 13:31:28

标签: java apache-poi

我正在使用Apache POI将图像放入Excel工作表中。 当我使用Excel打开文件并手动调整包含图像的单元格的大小时,图像也将重新调整大小。

如何将图片插入不根据单元格大小调整大小的单元格中?

我的代码:

private void addImageToExcelReport(InputStream is, OutputStream os, File image) {
    try (BufferedReader br = new BufferedReader(new FileReader(image))) {
        if (br.readLine() != null) {
            XSSFWorkbook wb = new XSSFWorkbook(is);
            XSSFSheet sheet = wb.getSheetAt(0);

            InputStream inputStream = new FileInputStream(image);
            byte[] bytes = IOUtils.toByteArray(inputStream);

            int pictureIdx = wb.addPicture(bytes, Workbook.PICTURE_TYPE_PNG);
            inputStream.close();

            CreationHelper helper = wb.getCreationHelper();
            Drawing drawing = sheet.createDrawingPatriarch();
            ClientAnchor anchor = helper.createClientAnchor();
            sheet.createRow(1).createCell(0);

            anchor.setRow1(0);
            anchor.setRow2(1);
            anchor.setCol1(0);
            anchor.setCol2(1);

            drawing.createPicture(anchor, pictureIdx);

            wb.write(os);
            wb.close();
        }
    } catch (IOException e) {
        loggerService.traceError(e.getMessage(), e);
    }
}

1 个答案:

答案 0 :(得分:1)

正如Alex Richter所建议的那样,答案是设置锚点类型。 以下代码对我有用:

private void addImageToExcelReport(InputStream is, OutputStream os, File image) {
    if (image != null) {
        try {
            Workbook wb = new XSSFWorkbook(is);
            Sheet sheet = wb.getSheetAt(0);

            InputStream inputStream = new FileInputStream(image);
            byte[] bytes = IOUtils.toByteArray(inputStream);

            int pictureIdx = wb.addPicture(bytes, Workbook.PICTURE_TYPE_PNG);
            inputStream.close();

            CreationHelper helper = wb.getCreationHelper();
            Drawing<?> drawing = sheet.createDrawingPatriarch();
            ClientAnchor anchor = helper.createClientAnchor();
            anchor.setAnchorType(AnchorType.DONT_MOVE_AND_RESIZE);
            sheet.createRow(1).createCell(0);

            anchor.setRow1(0);
            anchor.setRow2(1);
            anchor.setCol1(0);
            anchor.setCol2(1);

            drawing.createPicture(anchor, pictureIdx);

            wb.write(os);
            wb.close();

        } catch (IOException e) {
            loggerService.traceError(e.getMessage(), e);
        }
    }
}

此外,请确保具有正确的库。我的pom.xml包含以下库:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.0.1</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.0.1</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml-schemas</artifactId>
    <version>4.0.1</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>ooxml-schemas</artifactId>
    <version>1.4</version>
</dependency>