调整工作簿工作表上的图像大小在 apache poi 中不起作用

问题描述 投票:0回答:2

我正在使用最新的 apache poi 依赖项,并且想要调整图像大小(工作簿打开后不要让它那么大):

    <dependencies>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.2.3</version>
        </dependency>
    </dependencies>
  1. 我创建了新的工作簿作为.xlsm,并且没有根据文档更改默认字体(它是Calibri 11 px)。
  2. 从 Pexels 下载的图像:链接到 Pexels 图像
  3. 使用如下代码:
import org.apache.commons.compress.utils.IOUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.*;

public class ImageResizer {

    public static  void main (String[] args) throws IOException {
        ImageResizer resizer = new ImageResizer();
    }
    public ImageResizer() throws IOException {
        InputStream inputStream;
        XSSFWorkbook workbook = null;
        XSSFSheet sheet = null;
        Cell cell = null;
        XSSFRow sheetRow = null;

        try {
            File myFile = new File("C:\\Users\\Luke\\Downloads\\TestWorkbook_AddingImage.xlsm");
            FileInputStream fis = new FileInputStream(myFile);
            workbook = new XSSFWorkbook (fis);
            fis.close();
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }

        sheet = workbook.getSheetAt(0);

        FileInputStream stream = null;
        try {
            stream = new FileInputStream( "C:\\Users\\Luke\\Downloads\\pexels-yura-forrat-12850802.jpg" );
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }
        CreationHelper helper = workbook.getCreationHelper();
        Drawing drawing = sheet.createDrawingPatriarch();

        ClientAnchor anchor = helper.createClientAnchor();
        final int pictureIndex = workbook.addPicture( stream, Workbook.PICTURE_TYPE_JPEG);
        stream.close();

        anchor.setCol1( 0 );
        anchor.setRow1( 0);
        final Picture pict = drawing.createPicture( anchor, pictureIndex );
        pict.resize(0.1,0.1);

        FileOutputStream os = new FileOutputStream("C:\\Users\\Luke\\Downloads\\TestWorkbook_AddingImage_Saved.xlsm");
        workbook.write(os);
        os.close();
        System.out.println("Done!");

        }

    }

pict.resize(0.1, 0.1) 方法使我的图片非常非常小(单元格内几乎看不到点)。我也尝试过 0.5、0.9 甚至 2.0,但结果都是一样的。 为什么?我可以做什么来调整图片大小?

最好的, 米哈尔

java excel apache-poi
2个回答
0
投票

ClientAnchor.Col1ClientAnchor.Row1或两者都为0时,这似乎是

Picture.resize(doublescaleX, doublescaleY)
Picture.resize(doublescale)
中的错误。当两个都为0时,它会起作用。左上角锚单元索引大于 0。

解决方法是先使用

Picture.resize()
,然后再按比例调整大小。
Picture.resize()
首先计算右下锚点位置以适应完整的原生图片尺寸。之后
Picture.resize(double scaleX, double scaleY)
就可以正常工作了。

...
        anchor.setCol1(0);
        anchor.setRow1(0);
        final Picture pict = drawing.createPicture( anchor, pictureIndex );
        pict.resize();
        pict.resize(0.1, 0.1);
...

0
投票

pict.resize(); 图片. 调整大小(0.1, 0.1); 问题: 当图片的左上角位于第一行(Row1 = 0)或第一列(Col1 = 0)时,调整大小逻辑会变得混乱,无法正确计算图片的大小。

为什么 Picture.resize() 可以修复它? 当您首先调用 Picture.resize() 时,它会确保图片正确放置在其单元格中并正确计算右下位置。此步骤“修复”了有关图片位置的任何混乱。

为什么缩放(调整大小(双倍scaleX,双倍scaleY))之后起作用? 一旦图片具有正确的起始位置和右下角,缩放逻辑就有正确的参考点来调整图片的大小。

© www.soinside.com 2019 - 2024. All rights reserved.