EasyExcel 不写对象读取表格数据得到Map类型数据

EasyExcel 不写对象读取表格数据得到Map类型数据

EasyExcel监听器部分

package com.qxnw.digit.scm.adm.handler;

import cn.hutool.core.convert.Convert;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSONObject;
import com.qxnw.digit.scm.adm.controller.vo.ImportUtilParam;
import com.qxnw.digit.scm.adm.service.IGsTaskConfigService;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

@Slf4j
public class ImportMapHandler extends AnalysisEventListener<Map<String, Object>> {

    /**
     * 数据库字段名和表格表头名称对应关系 对应config表template值  构造handler对象时时赋值
     */
    private JSONObject headMapDB;

	// 最后被真正用来作为数据处理的结果集
    private List<Map<String, Object>> dataList = new ArrayList<>();
    
    //用于存储表头的信息 其中integer值是表头对应的索引值从 0 开始 String是对应的表头的名称
    private Map<Integer, String> headMap;

    // 记录从表格中读取的数据总条数
    private Long totalCount = 0L;

    // 记录读取表格数据失败条数
    private Long totalErroCount = 0L;

    // 导入成功条数
    private Long successCount = 0L;
    
    // excel表格读取成功后,返回信息
    private String totalMsg = "本次共导入%d条,导入成功%d条,导入失败%d条";


	// 监听器的构造方法
    public ImportMapHandler(JSONObject fieldsJsonObject) {
        headMapDB = fieldsJsonObject;
    }

	// 读取表头的方法,得到表头的一个map集合 key是0为下标的索引 vaule是excel表格表头的名称
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        this.headMap=headMap;
        log.info("表头信息:{}" ,headMap);
    }

    /**
     *	EasyExcel 读取数据是一行一行的进行读取
     *	下面重写的方法可以理解为是对读取到的每一行的数据的处理方式
     * @param valueData excel中读取的数据的集合 结构为 map 其中key为从0开始的索引
     * @param context
     */
    @Override
    public void invoke(Map<String, Object> valueData, AnalysisContext context) {
        // 总条数
        totalCount++;
        //把表头和值放入Map
        HashMap<String, Object> paramsMap = new HashMap<>();
        for(int i=0;i<valueData.size();i++){
        	//得到该行对应的表头名称
            String key=headMap.get(i);
            //得到该行第一列的数据。
            Object  value=valueData.get(i);
            //这里是手写了一个方法来判断该值是否符合要求 如果校验不成功,则该行数据不会加入到结果集之中。
            Boolean islegalValue = islegalValue(value);
            if(!islegalValue){
                 totalErroCount++;
                 return;
            }
            //将表头作为map的key,每行每个单元格的数据作为map的value
            String keyDB = getFieldsKey(headMapDB,key);
            paramsMap.put(keyDB,value);
        }
        dataList.add(paramsMap);
        successCount++;
    }

    private String getFieldsKey(JSONObject headMapDB, String key) {
        for (String s : headMapDB.keySet()) {
            if(key.equals(Convert.toStr(headMapDB.get(s)))){
                return s;

            }
        }
        return null;
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        String totalMsg = String.format(this.totalMsg,this.totalCount,this.successCount,this.totalErroCount);
        log.info(totalMsg);
        this.totalMsg = totalMsg;
    }

    public List<Map<String, Object>>  getResultList() {
        return dataList;
    }

    public String getTotalMsg() {
        return totalMsg;
    }

    public Long getTotalErroCount(){
        return totalErroCount;
    }

    public Long getTotalSucesscount(){
        return successCount;
    }


    /**
     * 判断表格填写内容是否合法
     * @param value
     * @return
     */
    private Boolean islegalValue(Object  value){
        // 正则表达式,表示字符串只能包含数字、字母和小数点和汉字
        String regex = "^[\\u4e00-\\u9fa5a-zA-Z0-9.]+$";
        String columnValue = Convert.toStr(value);
        return Pattern.matches(regex, columnValue);
    }
}

下面是读取表格的代码参考,此代码配合上述的监听器执行之后 我们就能从listener中拿到我们的表格中读取到的数据

private ImportMapHandler importMapModel(ImportTaskVo param, JSONObject fieldsJsonObject) {
        // 根据前端传入的文件路径 构建一个file对象
        File file = new File(param.getImportUtilParam().getFilePath());
        if (!file.exists()) {
            throw new BusinessException("500", "读取文件异常,请重新导入文件");
        }
        // 生成了继承 AnalysisEventListener的监听器
        ImportMapHandler listener = new ImportMapHandler(fieldsJsonObject);
        // 生成 excelReader对象 指定需要读取的文件为 file
        ExcelReader excelReader = EasyExcel.read(file).build();
        ReadSheet build = EasyExcel.readSheet(0).registerReadListener(listener).build();
        excelReader.read(build);
        excelReader.finish();
        file.delete();
        return listener;
    }

最后在记录一下Mybatis将参数类型为Map的数据 insert 存入数据库,其中map的key为数据库对应的字段,key为数据库表对应的字段 ,value为数据库字段对应的值

private void commonMapImplement(ImportMapHandler listener, Long taskId, ImportTaskVo param, Set<String> columnList,Set<String> pageFiledList) {
        List<Map<String, Object>> resultList = listener.getResultList();
        // 拿到表格所有的数据
        for (Map<String, Object> stringObjectMap : resultList) {
            gsTaskConfigMapper.inserMap(stringObjectMap);
        }
    }

Mapper接口

 int inserMap(@Param("param") Map<String, Object> data);

对应xml语句

		INSERT INTO your_table
        (
        <foreach collection="param" item="value" index="key" separator=",">
            ${key}
        </foreach>
        )
        values
        (
        <foreach collection="param" item="value" index="key" separator=",">
            #{value}
        </foreach>
        )
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用阿里巴巴的 EasyExcel读取 Excel 并转换为 List<Map> 的示例代码: ```java // 定义 Excel 文件路径 String filePath = "example.xlsx"; // 定义 Excel 表格数据开始行数(从0开始计数) int startRow = 1; // 定义 Excel 表格数据的列信息(key为列名,value为该列对应的 Java 对象属性名) Map<String, String> columnMap = new HashMap<>(); columnMap.put("姓名", "name"); columnMap.put("年龄", "age"); columnMap.put("性别", "gender"); // 使用 EasyExcel 读取 Excel 并将数据转换为 List<Map> 结构 List<Map<String, Object>> dataList = new ArrayList<>(); EasyExcel.read(filePath, new ExcelListener(dataList, columnMap)) .sheet() .headRowNumber(startRow) .doRead(); ``` 其中,`ExcelListener` 是一个实现了 EasyExcel 的 `AnalysisEventListener` 接口的类,用于读取 Excel 数据并将其转换为 Map 结构。以下是 `ExcelListener` 类的示例代码: ```java public class ExcelListener extends AnalysisEventListener<Map<Integer, String>> { private List<Map<String, Object>> dataList; private Map<String, String> columnMap; public ExcelListener(List<Map<String, Object>> dataList, Map<String, String> columnMap) { this.dataList = dataList; this.columnMap = columnMap; } @Override public void invoke(Map<Integer, String> rowData, AnalysisContext context) { // 将 Excel 行数据转换为 Map 结构 Map<String, Object> dataMap = new HashMap<>(); for (Map.Entry<Integer, String> entry : rowData.entrySet()) { String columnName = context.readSheetHolder().getCellDataList().get(entry.getKey()).getStringValue(); String propertyName = columnMap.get(columnName); if (StringUtils.isNotEmpty(propertyName)) { dataMap.put(propertyName, entry.getValue()); } } // 将 Map 结构的数据添加到列表中 dataList.add(dataMap); } @Override public void doAfterAllAnalysed(AnalysisContext context) { // 数据解析结束后的处理 } } ``` 在上面的代码中,`invoke` 方法会在每读取一行 Excel 数据时被调用。在该方法中,我们需要将 Excel 数据转换为 Map 结构,并将其添加到 `dataList` 列表中。最终,`dataList` 列表中的数据就是以 List<Map> 结构存储的 Excel 数据了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值