easyexcel 3.x多张图片写入单个单元格,建议使用多个单元格合并

uqjltbpv  于 2个月前  发布在  其他
关注(0)|答案(1)|浏览(29)

3.x后提供了多张图片写入单个单元格的功能,但正如官方文档所说
// 这里实测 不能设置太大 超过单元格原始大小后 打开会提示修复。暂时未找到很好的解法。 imageData.setTop(5); imageData.setRight(40); imageData.setBottom(5); imageData.setLeft(5);
最近刚好有用到这个功能 因为图片个数不确定,还需要横着排列,确实出现了上述问题,如果图片过多,还得考虑单个单元格宽度最大不能超过255的问题。

我这边最后通过每个单元格放一张图片,最后把所有图片的单元格合并,同样实现了上述功能,且因为是每个单元格放一张图片,所以那几个值并不需要设置很大,不存在上述问题,而且不受限于单个单元格最大宽度的限制。单元格合并并不会合并图片,因为图片并不是真正的写入单元格,而是通过锚点定位,所以我觉得这样可能更好一些

s2j5cfk0

s2j5cfk01#

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class MergeImagesInCell {

    public static void main(String[] args) throws IOException {
        String fileName = "images.xlsx";

        // 准备数据
        String[] imagePaths = {"image1.png", "image2.png", "image3.png"}; // 假设有三张图片

        // 创建 Excel 工作簿
        try (Workbook workbook = new XSSFWorkbook()) {
            Sheet sheet = workbook.createSheet("Images");

            int rownum = 0;
            for (String imagePath : imagePaths) {
                BufferedImage bufferedImage = ImageIO.read(new File(imagePath));

                // 将图片转换为字节数组
                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                ImageIO.write(bufferedImage, "png", byteArrayOutputStream);
                byte[] bytes = byteArrayOutputStream.toByteArray();
                byteArrayOutputStream.close();

                // 将图片插入到单元格
                CreationHelper creationHelper = workbook.getCreationHelper();
                Drawing drawing = sheet.createDrawingPatriarch();
                ClientAnchor anchor = creationHelper.createClientAnchor();
                anchor.setCol1(rownum); // 设置单元格起始列
                anchor.setRow1(0); // 设置单元格起始行
                anchor.setCol2(rownum + 1); // 设置单元格结束列
                anchor.setRow2(1); // 设置单元格结束行
                Picture picture = drawing.createPicture(anchor, workbook.addPicture(bytes, Workbook.PICTURE_TYPE_PNG));
                picture.resize(); // 调整图片大小以适应单元格

                // 合并单元格
                sheet.addMergedRegion(new CellRangeAddress(0, 0, rownum, rownum + 1));

                rownum += 2; // 每个图片占用两列
            }

            // 保存 Excel 文件
            try (FileOutputStream fileOut = new FileOutputStream(fileName)) {
                workbook.write(fileOut);
            }
        }
    }
}

相关问题