首页 > 解决方案 > apache-poi excel生成:多张纸上的不同图像大小

问题描述

我正在研究生成带有 2 张工作表的 Excel (*.xlsx) 工作簿的代码。在两者上,我将在左上角放置相同的logo.png图片(151x90px)。第一张纸仅在第一列宽度上与第二张不同。它在第一张纸上更宽。

生成 excel 文件后,第一张纸上的图片看起来不错,但第二张纸上的图片更宽(110%)

如何使图片在两张纸上都具有原始尺寸?

我正在使用 apache-poi 3.17

这是我的示例代码:

package mchodun.excel;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Picture;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.junit.Test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Paths;

public class ExcelFileTest {

    @Test
    public void testImage() throws IOException {
        Workbook workbook = new SXSSFWorkbook(100);
        InputStream is = new FileInputStream(
                "/Users/mchodun/Desktop/logo.png");
        byte[] pictureBytes = IOUtils.toByteArray(is);
        createSheet(workbook, pictureBytes, true);
        createSheet(workbook, pictureBytes, false);

        final File fileDest = Paths.get("/Users/mchodun/Desktop", "test.xlsx")
                .toFile();
        // gets output stream
        final OutputStream out = new FileOutputStream(fileDest);
        workbook.write(out);
        out.flush();
        out.close();
    }

    private void createSheet(Workbook workbook, byte[] pictureBytes,
                             boolean changeColumnWidth) {
        final int pictureIdx = workbook.addPicture(pictureBytes,
                Workbook.PICTURE_TYPE_PNG);
        Sheet sheet = workbook.createSheet();
        if (changeColumnWidth) {
            sheet.setColumnWidth(0, 16000);
        }
        final CreationHelper helper = workbook.getCreationHelper();
        final Drawing drawing = sheet.createDrawingPatriarch();
        final ClientAnchor anchor = helper.createClientAnchor();

        // create an anchor with upper left cell and bottom right cell
        anchor.setCol1(0);
        anchor.setRow1(0);
        anchor.setCol2(0);
        anchor.setRow2(0);

        Picture picture = drawing.createPicture(anchor, pictureIdx);
        Row row0 = sheet.createRow(0);
        row0.setHeight((short) (picture.getImageDimension().getHeight() * 15));

        Row row1 = sheet.createRow(1);
        Cell cell10 = row1.createCell(0);
        cell10.setCellValue("Value");

        picture.resize();
    }

}

标签: javaapache-poiexport-to-excel

解决方案


推荐阅读