使用EasyExcel3.x导出带图片的Excel文件,支持一个单元格带多张图片

使用EasyExcel3.x导出带图片的Excel文件,支持一个单元格带多张图片

官方网站

  • 官方网站:https://easyexcel.opensource.alibaba.com/
  • github地址:https://github.com/alibaba/easyexcel
  • gitee地址:https://gitee.com/easyexcel/easyexcel

导入依赖

easyexcel一定要使用3.x以上版本,2.x和更低的版本都不支持多张图片写入在一个单元格中

 <developer>    
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.1.2</version>
 </developer>

创建需要导出的对象

参考官方文档

@Getter
@Setter
@EqualsAndHashCode
public class DemoData {
    @ExcelProperty("标题名称", index = 0)
    private String string;
    @ExcelProperty("日期标题")
    private Date date;
    @ExcelProperty("数字标题")
    private Double doubleData;
    @ExcelProperty("图片或图片组")
    private WriteCellData<Void> writeCellDataFile;
    /**
     * 忽略这个字段
     */
    @ExcelIgnore
    private String ignore;
}

响应对象的设置

设置导出的文件类型为excel

    /**
     * 配置Response
     * @param response      HttpServletResponse
     * @param fileName      导出文件名称
     * @throws IOException  IO异常
     */
    private static void setResponse(HttpServletResponse response, String fileName) throws IOException {
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding(StandardCharsets.UTF_8.name());
        fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.name());
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
    }

导入图片

创建图片对象

参考官方文档

        // 从图片文件所在路径读取图片
        String imagePath = TestFileUtil.getPath() + "converter" + File.separator + "img.jpg";
        InputStream inputStream = FileUtils.openInputStream(new File(imagePath));

        // 创建图片列表,支持多张图片的导出
        List<ImageData> imageDataList = new ArrayList<>();

        // 放入第一张图片
        ImageData imageData = new ImageData();
        imageData.setImage(FileUtils.readFileToByteArray(new File(imagePath))); // 将图片转换为二进制格式
        imageData.setImageType(ImageData.ImageType.PICTURE_TYPE_PNG);
        imageDataList.add(imageData);

        // 放入第二个图片
        ImageData imageTwo = new ImageData();
        imageTwo.setImage(FileUtils.readFileToByteArray(new File(imagePath)));
        imageTwo.setImageType(ImageData.ImageType.PICTURE_TYPE_PNG);
        // 上 右 下 左 需要留空
        // 这个类似于 css 的 margin
        // 这里实测 不能设置太大 超过单元格原始大小后 打开会提示修复。暂时未找到很好的解法。
        imageTwo.setTop(5);
        imageTwo.setRight(5);
        imageTwo.setBottom(5);
        imageTwo.setLeft(50);
        // 设置图片的位置 假设 现在目标 是 覆盖 当前单元格 和当前单元格右边的单元格
        // 起点相对于当前单元格为0 当然可以不写
        imageTwo.setRelativeFirstRowIndex(0);
        imageTwo.setRelativeFirstColumnIndex(0);
        imageTwo.setRelativeLastRowIndex(0);
        // 前面3个可以不写  下面这个需要写 也就是 结尾 需要相对当前单元格 往右移动一格
        // 也就是说 这个图片会覆盖当前单元格和 后面的那一格
        imageTwo.setRelativeLastColumnIndex(1);
        imageDataList.add(imageTwo);

        // 向Excel中写入图片数据
        DemoData imageDemoData = new DemoData();
        WriteCellData<Void> writeCellData = new WriteCellData<>();

导出Excel

最简单的导出

    /**
     * 导出
     * @param response      HttpServletResponse
     * @param fileName      文件名称
     * @param sheetName     表单名称
     * @param dataList      数据列表
     * @param clazz         数据类型
     * @param <T>           泛型
     * @throws IOException  IO异常
     */
    public static <T> void export(HttpServletResponse response, String fileName, String sheetName, List<T> dataList, Class<T> clazz) throws IOException {
        setResponse(response, fileName);
        EasyExcel.write(response.getOutputStream(), clazz).sheet(sheetName).doWrite(dataList);
    }

指定列导出

    /**
     * 指定字段导出
     * @param response          HttpServletResponse
     * @param fileName          文件名称
     * @param sheetName         表单名称
     * @param dataList          数据列表
     * @param clazz             数据类型
     * @param includeColumns    待导出字段
     * @param <T>               泛型
     * @throws IOException      IO异常
     */
    public static <T> void export(HttpServletResponse response, String fileName, String sheetName, List<T> dataList, Class<T> clazz, List<String> includeColumns) throws IOException {
        setResponse(response, fileName);
        EasyExcel.write(response.getOutputStream(), clazz).includeColumnFieldNames(includeColumns).sheet(sheetName).doWrite(dataList);
    }
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
easyexcel2.x 版本中,可以通过实现 `WriteHandler` 接口来实现导出多张图片。 具体步骤如下: 1. 创建一个实现了 `WriteHandler` 接口的类,例如 `ImageHandler`。在该类中,需要实现 `cell` 方法和 `afterSheetCreate` 方法。 2. 在 `cell` 方法中,判断当前单元格是否是图片类型,如果是图片类型,则将图片导出到指定目录,并记录图片路径。 3. 在 `afterSheetCreate` 方法中,将记录的图片路径插入到 Excel 中。 以下是示例代码: ```java public class ImageHandler implements WriteHandler { private Map<String, String> imagePathMap = new HashMap<>(); private String imageDir = "D:/images/"; @Override public void cell(CellWriteHandlerContext context) { CellData cellData = context.getCellData(); if (cellData instanceof ImageData) { ImageData imageData = (ImageData) cellData; String imageName = imageData.getImageName(); String imagePath = imageDir + imageName; try { File imageFile = new File(imagePath); if (!imageFile.exists()) { FileOutputStream fos = new FileOutputStream(imageFile); fos.write(imageData.getData()); fos.close(); } imagePathMap.put(imageName, imagePath); } catch (Exception e) { e.printStackTrace(); } } } @Override public void afterSheetCreate(AfterSheetWriteHandlerContext context) { Sheet sheet = context.getSheet(); Drawing<?> drawing = sheet.createDrawingPatriarch(); imagePathMap.forEach((imageName, imagePath) -> { try { // 设置图片位置和大小 int pictureIdx = sheet.getWorkbook().addPicture(new FileInputStream(imagePath), Workbook.PICTURE_TYPE_PNG); CreationHelper helper = sheet.getWorkbook().getCreationHelper(); ClientAnchor anchor = helper.createClientAnchor(); anchor.setCol1(0); anchor.setRow1(0); anchor.setCol2(5); anchor.setRow2(5); Picture pict = drawing.createPicture(anchor, pictureIdx); pict.resize(); } catch (Exception e) { e.printStackTrace(); } }); } } ``` 然后在导出 Excel 的代码中,通过 `EasyExcel.write()` 方法的 `registerWriteHandler()` 方法将 `ImageHandler` 注册到写操作中,即可实现导出多张图片。 ```java EasyExcel.write("D:/test.xlsx") .registerWriteHandler(new ImageHandler()) .sheet("Sheet1") .doWrite(data); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值