集成EasyExcel自定义封装读取解析Excel文件流数据

1、读取Excel,暂只支持读取文件流方式,之后按需扩展

使用说明:现封装读取excel方法只支持读取业务规定的模版结构,第一列为中文表头,第二列是数据库字段,模版由前端提供,用户下载后填充数据。
        默认读取第二列作为key(数据字段)。

实现方式:以行维度读取数据后组装集合,使用反射装配数据结构,返回泛型集合List<T>

2、代码

      <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>easyexcel</artifactId>
          <version>3.1.2</version>
      </dependency>
      <dependency>
		<groupId>cn.hutool</groupId>
		<artifactId>hutool-all</artifactId>
		<version>5.8.0</version>
		<scope>compile</scope>
	</dependency>
/**
 * excelReader监听器
 *
 * @author smallNorth_Lee
 * @date 2022/12/1
 */
public class ExcelReadListener extends AnalysisEventListener<Map<Integer, String>> {

    /**
     * 表头数据(存储所有的表头数据)
     */
    private final List<Map<Integer, String>> headList = new ArrayList<>();
    /**
     * 数据体
     */
    private final List<Map<Integer, String>> dataList = new ArrayList<>();

    /**
     * 默认invoke从excel第二行开始读数据,第一行为中文表头,第二行为字段名称
     * 如只需要从第一行读取,请使用invokeHeadMap方法
     */
    @Override
    public void invoke(Map<Integer, String> data, AnalysisContext analysisContext) {
        if (1 == analysisContext.readRowHolder().getRowIndex()) {
            headList.add(data);
        } else {
            dataList.add(data);
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    }

    public List<Map<Integer, String>> getHeadList() {
        return headList;
    }

    public List<Map<Integer, String>> getDataList() {
        return dataList;
    }

}
/**
 * 导出excel,支持全字段导入以及自定义字段导出
 *
 * @author smallNorth_Lee
 * @date 2022/8/10
 */
public class EasyExcelUtil {
/**
     * 读取excel模版数据
     *
     * @param file   文件流
     * @param target 转换对象
     * @param <T>    泛型结构
     * @return List<T>
     */
    public static <T> List<T> readExcel(MultipartFile file, Class<T> target) {
        try {
            ExcelReadListener excelReadListener = new ExcelReadListener();
            EasyExcelFactory.read(file.getInputStream(), excelReadListener).sheet().doRead();
            List<Map<Integer, String>> headList = excelReadListener.getHeadList();
            if (CollectionUtils.isEmpty(headList)) {
                throw new RuntimeException("表格中未包含表头信息!");
            }
            List<Map<Integer, String>> dataList = excelReadListener.getDataList();
            if (CollectionUtils.isEmpty(dataList)) {
                throw new RuntimeException("表格中包含错误数据,请调整后上传!");
            }
            //封装数据体
            List<Map<String, Object>> excelDataList = new ArrayList<>();
            for (Map<Integer, String> headMap : headList) {
                for (Map<Integer, String> dataRow : dataList) {
                    Map<String, Object> rowData = new LinkedHashMap<>();
                    headMap.forEach((key, value) -> rowData.put(value, dataRow.get(key)));
                    excelDataList.add(rowData);
                }
            }
            //字段转驼峰
            excelDataList = excelDataList.stream().map(MapUtil::toCamelCaseMap).collect(Collectors.toList());
            return ConvertUtils.setList(excelDataList, target);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Collections.emptyList();
    }
 }
/**
 * 类型转换器
 *
 */
public class ConvertUtils {
/**
     * List<Map<String, Object>> 到 List<T> 数据转换
     */
    public static <T> List<T> setList(List<Map<String, Object>> srcList, Class<T> clazz) {
        List<T> list = new ArrayList<>();
        srcList.forEach(x -> {
            try {
                T t = clazz.newInstance();
                Field[] fields = t.getClass().getDeclaredFields();
                for (Field field : fields) {
                    if (!"serialVersionUID".equals(field.getName())) {
                        //设置对象的访问权限,保证对private的属性的访问
                        field.setAccessible(true);
                        //读取配置转换字段名,并从map中取出数据
                        Object v = x.get(field.getName());
                        field.set(t, convert(v, field.getType()));
                    }
                }
                list.add(t);
            } catch (Exception e) {

            }
        });
        return list;
    }
 }

后端使用方式

@ApiOperation(value = "读取excel")
@PostMapping("/reader/excel")
public ResultVo<List<ExcelFieldDemo>> readExcel(@RequestBody MultipartFile file) {
    List<ExcelFieldDemo> readExcelList = EasyExcelUtil.readExcel(file, ExcelFieldDemo.class);
    //入库或其它业务操作
    return new ResultVo<>(readExcelList);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EasyExcel是一款基于Java的开源工具,用于读取和写入Excel文件。它提供了简单易用的API,可以方便地进行Excel文件的读写操作。 使用EasyExcel读取Excel文件非常简单,只需按照以下步骤进行操作: 1. 引入EasyExcel的依赖包。 2. 创建一个Java类,作为数据模型,用于存储读取到的Excel数据。 3. 使用EasyExcel提供的API,打开Excel文件读取数据。 4. 将读取到的数据存储到数据模型中。 5. 关闭Excel文件。 以下是使用EasyExcel读取Excel文件的示例代码: ```java // 引入EasyExcel的依赖包 import com.alibaba.excel.EasyExcel; // 创建数据模型类 public class ExcelData { private String name; private int age; // 其他属性... // getter和setter方法... } // 读取Excel文件 public class ReadExcel { public static void main(String[] args) { // Excel文件路径 String filePath = "path/to/excel/file.xlsx"; // 使用EasyExcel提供的API,打开Excel文件读取数据 EasyExcel.read(filePath, ExcelData.class, new ExcelDataListener()).sheet().doRead(); } } // 自定义监听器类,用于处理读取到的数据 public class ExcelDataListener extends AnalysisEventListener<ExcelData> { // 重写父类的方法,处理每一行读取到的数据 @Override public void invoke(ExcelData data, AnalysisContext context) { // 将读取到的数据存储到数据模型中,可以进行自定义操作 System.out.println("Name: " + data.getName()); System.out.println("Age: " + data.getAge()); // 其他操作... } // 重写父类的方法,读取完成后的操作 @Override public void doAfterAllAnalysed(AnalysisContext context) { // 关闭Excel文件等资源 } } ``` 以上就是使用EasyExcel读取Excel文件的简单介绍和示例代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值