EasyExcel获取多sheet多实体类信息工具类实现

2 篇文章 0 订阅

引用pom内容:

<properties>
     <easyexcel.version>2.2.6</easyexcel.version>
</properties>
<dependencies>
<dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>easyexcel</artifactId>
     <version>${easyexcel.version}</version>
</dependency>
</dependencies>

1.监听

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

/**
 * @Author FangYN
 * @Date 2020/8/7 17:21
 * @Description 表格监听处理
 **/
public class ExcelListener extends AnalysisEventListener {
    private static final Logger LOGGER = LoggerFactory.getLogger(ExcelListener.class);
    /**
     * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
     */
    private static final int BATCH_COUNT = 5;

    private List<Object> data = Lists.newArrayList();

    @Override
    public void invoke(Object o, AnalysisContext analysisContext) {
        LOGGER.info("解析到一条数据:{}", JSON.toJSONString(o));
        //数据存储到list,
        data.add(o);
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (data.size() >= BATCH_COUNT) {
            saveData();
            // 存储完成清理 list
            data.clear();
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        saveData();
        LOGGER.info("所有数据解析完成!");
    }

    /**
     * 入库
     */
    private void saveData() {
        LOGGER.info("{}条数据,开始存储数据库!", data.size());
        //这个方法自己实现  能完成保存数据入库即可
        LOGGER.info("存储数据库成功!");
    }

    public List<Object> getData() {
        return data;
    }

    public void setData(List<Object> data) {
        this.data = data;
    }

}

2.实现工具类

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.read.metadata.ReadSheet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @Author FangYN
 * @Date 2020/8/11 13:55
 * @Description 表格工具类实现
 **/
public class ExcelUtil {
    private static Logger log = LoggerFactory.getLogger(WorkBookUtil.class);

    /**
     * @param inStr 文件流
     * @param cls   类数组
     * @return 构建各个sheet对象返回
     */
    public static Map<Integer, Object> repeatedRead(InputStream inStr, List<Class> cls) {
        Map<Integer, Object> map = new HashMap<>();
        ExcelReader excelReader = null;
        ExcelListener excelListener = new ExcelListener();
        excelReader = EasyExcel.read(inStr, cls.get(0), excelListener).build();// 获取部分sheet信息
        for (int i = 0; i < cls.size(); i++) map.put(i, buildList(cls.get(i), i, excelListener, excelReader));
        // 这里一定别忘记关闭,读的时候会创建临时文件,到时磁盘会崩
        if (excelReader != null)
            excelReader.finish();
        return map;
    }

    private static <T> List<T> buildList(Class<T> cls, int sheetNo, ExcelListener excelListener, ExcelReader excelReader) {
        ReadSheet readSheet = EasyExcel.readSheet(sheetNo).head(cls).build();//获取指定sheet对象
        excelReader.read(readSheet);//读取数据
        List<T> resultList = excelListener.getData().stream().map(dto -> {
            T vo = null;
            try {
                vo = (T) cls.newInstance();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            SpringUtil.copyPropertiesIgnoreNull(dto, vo);
            return vo;
        }).collect(Collectors.toList());
        excelListener.getData().clear();//清空list数据
        return resultList;
    }
}

3.实体类举例

@Data
public class StudentInfoDTO implements Serializable {
    private static final long serialVersionUID = 1L;

    @ExcelProperty(value = {"班级"})
    private String className;
    @ExcelProperty(value = {"姓名"})
    private String studentName;
    @ExcelProperty(value = {"学籍号"})
    private String studentCode;
    @ExcelProperty(value = {"性别"}, converter = SexConverter.class)
    private String sex;
}

@Data
public class StudentInfoDTO2 implements Serializable {
    private static final long serialVersionUID = 1L;

    @ExcelProperty(value = {"班级"})
    private String className;
    @ExcelProperty(value = {"姓名"})
    private String studentName;
    @ExcelProperty(value = {"学籍号"})
    private String studentCode;
    @ExcelProperty(value = {"性别"}, converter = SexConverter.class)
    private String sex;
    @ExcelProperty(value = {"生日"})
    private String birthday;
}

4.调用实现

@RestController
@RequestMapping("/dock")
public class ApiController {
    private static Logger log = LoggerFactory.getLogger(ApiController.class);

    @PostMapping
    public void save(@RequestParam("file") MultipartFile file) throws IOException {
        Map<Integer, Object> map;
        InputStream inputStream = null;
        try {
            inputStream = file.getInputStream();
            List<Class> cls = new ArrayList<>();
            cls.add(StudentInfoDTO.class);// 根据实际需求定义实体类
            cls.add(StudentInfoDTO2.class);
            map = ExcelUtil.repeatedRead(inputStream, cls);
            if (inputStream != null)
                inputStream.close();
            // TODO 具体需求具体逻辑实现

        } catch (IOException ex) {
            ex.printStackTrace();
            System.out.println("数据上传解析失败");
            return;
        } finally {
            if (inputStream != null)
                inputStream.close();
        }
       
    }
}

 

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
EasyExcel是一款基于Java的开源Excel操作工具,它提供了简单易用的API,可以方便地进行Excel文件的读写操作。要导出多个sheet,可以按照以下步骤进行操作: 1. 创建一个ExcelWriter对象:使用`EasyExcel.write()`方法创建一个ExcelWriter对象,指定要导出的文件路径和文件名。 2. 定义数据源:准备好要导出的数据源,可以是一个List集合或者一个数据库查询结果集。 3. 创建Sheet对象:使用`ExcelWriter.write()`方法创建一个Sheet对象,并指定sheet名称和对应的实体类。 4. 写入数据:使用`Sheet.write()`方法将数据写入到Sheet中,可以一次性写入整个数据源,也可以分批次写入。 5. 创建下一个Sheet:如果还有其他需要导出的sheet,重复步骤3和步骤4。 6. 完成导出:使用`ExcelWriter.finish()`方法完成导出操作,将数据写入到Excel文件中,并关闭ExcelWriter对象。 下面是一个示例代码,演示了如何使用EasyExcel导出多个sheet: ```java // 创建ExcelWriter对象 String fileName = "path/to/output.xlsx"; ExcelWriter excelWriter = EasyExcel.write(fileName).build(); // 定义数据源 List<User> userList = getUserList(); List<Order> orderList = getOrderList(); // 创建第一个Sheet并写入数据 Sheet sheet1 = new Sheet(1, 0, User.class, "用户信息"); excelWriter.write(userList, sheet1); // 创建第二个Sheet并写入数据 Sheet sheet2 = new Sheet(2, 0, Order.class, "订单信息"); excelWriter.write(orderList, sheet2); // 完成导出 excelWriter.finish(); ``` 这样就可以将`userList`导出到第一个sheet,将`orderList`导出到第二个sheet。你可以根据实际需求,创建更多的Sheet对象并写入数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值