Easyexcel 实现批量插入图片

目录

1 Maven依赖

2 PictureModel

3 CustomPictureHandler

4 调试代码

5 调试结果

 注:


1 Maven依赖

        <!--hutool工具包-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.5.1</version>
        </dependency>
        <!--easyexcel文档处理工具-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.8</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

2 PictureModel

图片信息。

package com.xudongbase.easyexcel.model;

import com.xudongbase.easyexcel.model.builder.PictureModelBuilder;
import com.xudongbase.easyexcel.model.common.SheetRangeModel;
import lombok.Getter;

/**
 * 图片信息
 *
 * @author xudongmaster
 */
@Getter
public class PictureModel extends SheetRangeModel {
    /**
     * 图片数据
     */
    private byte[] pictureBytes;
    /**
     * 图片类型
     */
    private Integer pictureType;

    public PictureModel(PictureModelBuilder builder) {
        this.sheetName = builder.getSheetName();
        this.startRowIndex = builder.getStartRowIndex();
        this.endRowIndex = builder.getEndRowIndex();
        this.startColumnIndex = builder.getStartColumnIndex();
        this.endColumnIndex = builder.getEndColumnIndex();
        this.pictureBytes = builder.getPictureBytes();
        this.pictureType = builder.getPictureType();
    }

    /**
     * 生成图片信息
     *
     * @param sheetName        sheet页名称
     * @param startRowIndex    开始行号
     * @param endRowIndex      结束行号
     * @param startColumnIndex 开始列号
     * @param endColumnIndex   结束列号
     * @param pictureBytes     图片数据
     * @return
     */
    public static PictureModel createPictureModel(String sheetName, int startRowIndex, int endRowIndex, int startColumnIndex, int endColumnIndex
            , byte[] pictureBytes) {
        return createPictureModel(sheetName, startRowIndex, endRowIndex, startColumnIndex, endColumnIndex, pictureBytes, null);
    }


    /**
     * 生成图片信息
     *
     * @param sheetName        sheet页名称
     * @param startRowIndex    开始行号
     * @param endRowIndex      结束行号
     * @param startColumnIndex 开始列号
     * @param endColumnIndex   结束列号
     * @param pictureBytes     图片数据
     * @param pictureType      图片类型
     * @return
     */
    public static PictureModel createPictureModel(String sheetName, int startRowIndex, int endRowIndex, int startColumnIndex, int endColumnIndex
            , byte[] pictureBytes, Integer pictureType) {
        return new PictureModelBuilder(sheetName, startRowIndex, endRowIndex, startColumnIndex, endColumnIndex, pictureBytes)
                //图片类型
                .pictureType(pictureType)
                .build();
    }
}

3 CustomPictureHandler

自定义图片处理器。

package com.xudongbase.easyexcel.handler;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import com.xudongbase.common.poi.util.POIExcelUtil;
import com.xudongbase.easyexcel.model.PictureModel;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 自定义图片处理器
 *
 * @author xudongmaster
 */
public class CustomPictureHandler implements SheetWriteHandler {

    /**
     * sheet页名称列表
     */
    private List<String> sheetNameList;
    /**
     * 图片信息
     */
    private List<PictureModel> pictureList = new ArrayList<>();


    public CustomPictureHandler(List<PictureModel> pictureList) {
        if (CollUtil.isEmpty(pictureList)) {
            return;
        }
        this.pictureList = pictureList.stream().filter(x ->
                StrUtil.isNotBlank(x.getSheetName()) && x.getPictureBytes() != null && x.getPictureBytes().length > 0)
                .collect(Collectors.toList());
        sheetNameList = this.pictureList.stream().map(x -> x.getSheetName()).distinct().collect(Collectors.toList());
    }

    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {

    }

    /**
     * sheet页创建之后调用
     *
     * @param writeWorkbookHolder
     * @param writeSheetHolder
     */
    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        Sheet sheet = writeSheetHolder.getSheet();
        //不需要添加图片,或者当前sheet页不需要添加图片
        if (CollUtil.isEmpty(pictureList) || sheetNameList.contains(sheet.getSheetName()) == false) {
            return;
        }
        //获取当前sheet的图片
        List<PictureModel> sheetPictureList = pictureList.stream().filter(x ->
                StrUtil.equals(x.getSheetName(), sheet.getSheetName())
        ).collect(Collectors.toList());
        //当前sheet页不需要图片
        if (CollUtil.isEmpty(sheetPictureList)) {
            return;
        }
        for (PictureModel pictureModel : sheetPictureList) {
            //图片数据
            byte[] pictureBytes = pictureModel.getPictureBytes();
            //插入图片
            POIExcelUtil.insertImg(writeWorkbookHolder.getWorkbook(), sheet, pictureBytes, pictureModel.getStartRowIndex()
                    , pictureModel.getEndRowIndex(), pictureModel.getStartColumnIndex(), pictureModel.getEndColumnIndex()
                    , (pictureModel.getPictureType() == null ? Workbook.PICTURE_TYPE_JPEG : pictureModel.getPictureType()));
        }
        //删除图片信息
        pictureList.removeAll(sheetPictureList);
        sheetNameList = pictureList.stream().map(x -> x.getSheetName()).distinct().collect(Collectors.toList());
    }
}

4 调试代码

     /**
     * 测试设置图片
     */
    @Test
    public void testPicture() {
        try {
            File file = new File("D:/easyexcel/testPicture.xlsx");
            FileUtil.createNewFile(file);
            //生成表格数据
            List<List<Object>> dataList = new ArrayList<>();
            dataList.add(new ArrayList<>(Arrays.asList(new Object[]{"表头11", "表头2", "表头3", "表头4"})));
            dataList.add(new ArrayList<>(Arrays.asList(new Object[]{"表头17777777777", "表头2", "表头3", "表头4444"})));
            dataList.add(new ArrayList<>(Arrays.asList(new Object[]{"表头31", "表头2", "表头3", "表头4"})));
            dataList.add(new ArrayList<>(Arrays.asList(new Object[]{11.111, 11.111, "11.111", "表头4"})));
            //导出文件
            List<PictureModel> pictureModelList = new ArrayList<>();
            String imgUrl = "https://profile.csdnimg.cn/9/5/B/1_qq_38974638";
            byte[] bytes = HttpUtil.downloadBytes(imgUrl);
            String sheetName="模板";
            pictureModelList.add(PictureModel.createPictureModel(sheetName,0,10,0,4,bytes));
            pictureModelList.add(PictureModel.createPictureModel(sheetName,11,22,0,4,bytes));
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            ExcelWriter excelWriter = EasyExcel.write(fileOutputStream)
                    .inMemory(Boolean.TRUE).registerWriteHandler(new CustomPictureHandler(pictureModelList)).build();
            WriteSheet writeSheet = EasyExcel.writerSheet(sheetName).build();
            excelWriter.write(dataList, writeSheet);
            //千万别忘记finish 会帮忙关闭流
            excelWriter.finish();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

5 调试结果

 注:

1、 注册自定义处理器之前必须调用inMemory(Boolean.TRUE)方法。

2、觉得这篇博客写的不错的可以前往Gitee点个Star,源码请查看Gitee的xudongbase项目easyexcel分支。

xudongbase: 主要是项目中可以用到的共通方法,现有easyexcel分支在持续更新中。欢迎大家Star和提交Issues。easyexcel分支:批量设置样式,批量添加批注,批量合并单元格,设置冻结行和列,设置行高列宽,隐藏行和列,绑定下拉框数据,设置水印 - Gitee.com

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: EasyExcel是一个Java语言开发的开源框架,可以帮助开发人员快速读写Excel文件。如果你想使用EasyExcel实现批量导入,你可以使用以下步骤: 1. 引入EasyExcel依赖:在项目的pom.xml文件中加入如下代码: ``` <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.8</version> </dependency> ``` 2. 定义Excel数据模型:定义一个Java Bean类,表示Excel中的一行数据,如: ``` @Data public class ImportData { @ExcelProperty(value = "姓名", index = 0) private String name; @ExcelProperty(value = "年龄", index = 1) private Integer age; @ExcelProperty(value = "邮箱", index = 2) private String email; } ``` 3. 实现批量导入:编写代码读取Excel文件,并将每行数据映射到ImportData对象中,如: ``` InputStream inputStream = new FileInputStream(file); EasyExcel.read(inputStream, ImportData.class, new DataListener()).sheet().doRead(); ``` 以上代码可以实现从Excel文件批量导入数据的功能。更详细的使用方法可以参考EasyExcel的官方文档。 ### 回答2: 使用easyExcel实现批量导入需要以下步骤: 1. 引入easyExcel库:通过在项目的依赖中添加easyExcel库的引用。 2. 创建实体类:根据需要导入的Excel数据结构,创建对应的实体类,每个字段要与Excel中的列一一对应。 3. 创建解析监听器:创建一个类实现AnalysisEventListener接口,并重写相应的方法,用于处理解析后的每一行数据。可以在process方法中进行业务逻辑的处理,比如将数据存入数据库或者其他操作。 4. 创建导入任务:在需要进行批量导入的地方,创建导入任务。可以通过指定实体类和解析监听器,调用EasyExcel的read方法来进行导入。 5. 配置导入参数:可以通过使用ReadSheet对象的setHeadRowNumber方法指定Excel中的表头所在的行数。还可以通过使用ReadSheet对象的setClazz方法指定导入数据的实体类。 6. 执行导入:调用EasyExcel的read方法,并传入导入任务、解析监听器和导入参数,开始执行导入操作。 7. 处理解析结果:在解析监听器中,可以重写doAfterAllAnalysed方法,在导入完成后进行一些后续操作,比如进行结果统计和提示。 以上是使用easyExcel实现批量导入的基本步骤。根据不同的业务需求,可能还需要进行一些额外的配置和处理。总的来说,easyExcel提供了简单易用的API,使得批量导入数据变得更加方便和高效。 ### 回答3: 使用easyExcel实现批量导入可以分为以下几个步骤: 1. 引入依赖:首先,在项目的pom.xml文件中引入easyExcel的依赖。例如: ``` <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.3.4</version> </dependency> ``` 2. 创建Excel读取监听器:通过继承`AnalysisEventListener`类,创建一个自定义的监听器类,用于处理导入的Excel数据。可以重写其中的`invoke()`方法,在该方法中对每一行数据进行处理。例如: ```java public class ExcelListener extends AnalysisEventListener<User> { private List<User> userList = new ArrayList<>(); @Override public void invoke(User data, AnalysisContext context) { userList.add(data); } @Override public void doAfterAllAnalysed(AnalysisContext context) { // 导入完成后的操作 } public List<User> getUserList() { return userList; } public void setUserList(List<User> userList) { this.userList = userList; } } ``` 3. 执行导入操作:通过`EasyExcel.read()`方法,将导入的Excel文件解析成一个个对象。可以指定读取的起始位置、监听器等。例如: ```java String fileName = "导入文件.xlsx"; InputStream inputStream = new FileInputStream(fileName); ExcelListener listener = new ExcelListener(); EasyExcel.read(inputStream, User.class, listener).sheet().headRowNumber(2).doRead(); List<User> userList = listener.getUserList(); // 对导入的数据进行处理或保存到数据库等操作 ``` 4. 处理导入的数据:获取到导入的数据后,可以根据业务需求进行进一步的处理,比如验证数据的有效性、保存到数据库等。例如: ```java for (User user : userList) { // 验证数据的有效性 if (user.getName() != null && user.getAge() != null) { // 保存到数据库或其他操作 } else { // 忽略无效数据或进行错误提示 } } ``` 通过以上步骤,就可以使用easyExcel实现批量导入功能。这个库提供了很多灵活的配置选项,可以根据具体需求进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值