java导入excel数据,使用map的方式进行映射

controller层接收文件信息,其中dataset参数为我的关联信息,实际情况自行修改

@PostMapping("/importExcel/{dataset}")
    public AjaxResult importExcel(MultipartFile file, @PathVariable("dataset") String dataset) {
        return sysDataService.importExcel(file, dataset);
    }

sevince层,业务代码

@Override
    public AjaxResult importExcel(MultipartFile file,String dataset) {
        try{
            //属性项
            InputStream fileInputStream = file.getInputStream();
            byte[] stream = IoUtils.toByteArray(fileInputStream);
            List<Map<String, String>> dataList = DynamicEasyExcelImportUtils.parseExcelToView(stream, 1,dataset);//获取提交的数据,并转成list
            List<String> keys = new ArrayList<>();//数据库中对应的表字段,exel模板的表头必须与数据库表字段对应
            for(int i=0;i<dataList.size();i++){
                Map<String,String> map = dataList.get(i);
                map.forEach((key,value)-> {
                    keys.add(key);
                });
                break;
            }
            //解析数据插入数据库,业务代码自行修改
            int batchSize =1000;
            if(dataList.size()>1000){
                for(int i= 0;i < dataList.size() / batchSize;i++){
                    sysDataMapper.insertSysDataByExcel(dataList.subList(i*batchSize, (i+1)*batchSize),keys);
                }
                if(dataList.size() % batchSize != 0){
                    sysDataMapper.insertSysDataByExcel(dataList.subList((dataList.size() / batchSize) * batchSize, dataList.size()),keys);
                }else{
                    System.out.println("正好整批处理成功");
                }
            }else {
                sysDataMapper.insertSysDataByExcel(dataList,keys);
            }
            fileInputStream.close();
        }catch (Exception e){
            e.printStackTrace();
        }
        return AjaxResult.success();
    }

DynamicEasyExcelImportUtils.java

import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.util.IoUtils;
import com.google.common.collect.Lists;
import com.kiz.common.Listener.DynamicEasyExcelListener;
import com.kiz.common.utils.uuid.UUID;
import org.apache.commons.collections4.CollectionUtils;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;

public class DynamicEasyExcelImportUtils {
    /**
     * 动态获取全部列和数据体,默认从第一行开始解析数据
     *
     * @param stream
     * @return
     */
    /*public static List<Map<String, String>> parseExcelToView(byte[] stream) {
        return parseExcelToView(stream, 1);
    }*/

    /**
     * 动态获取全部列和数据体
     *
     * @param stream         excel文件流
     * @param parseRowNumber 指定读取行
     * @return
     */
    public static List<Map<String, String>> parseExcelToView(byte[] stream, Integer parseRowNumber,String dataset) {
        DynamicEasyExcelListener readListener = new DynamicEasyExcelListener();
        EasyExcelFactory.read(new ByteArrayInputStream(stream)).registerReadListener(readListener).headRowNumber(parseRowNumber).sheet(0).doRead();
        List<Map<Integer, String>> headList = readListener.getHeadList();
        if (CollectionUtils.isEmpty(headList)) {
            throw new RuntimeException("Excel未包含表头");
        }
        List<Map<Integer, String>> dataList = readListener.getDataList();
        if (CollectionUtils.isEmpty(dataList)) {
            throw new RuntimeException("Excel未包含数据");
        }
        //获取头部,取最后一次解析的列头数据
        Map<Integer, String> excelHeadIdxNameMap = headList.get(headList.size() - 1);
        //封装数据体
        List<Map<String, String>> excelDataList = Lists.newArrayList();
        for (Map<Integer, String> dataRow : dataList) {
            Map<String, String> rowData = new LinkedHashMap<>();
            excelHeadIdxNameMap.entrySet().forEach(columnHead -> {
                if(columnHead.getValue().equals("species")){
                    rowData.put("\""+columnHead.getValue()+"\"", LatinNameUtils.getLatinShort(dataRow.get(columnHead.getKey())));
                }else {
                    rowData.put("\""+columnHead.getValue()+"\"", dataRow.get(columnHead.getKey()));
                }
            });
            rowData.put("\""+"id"+"\"", UUID.getUUID());
            rowData.put("\""+"del_flag"+"\"", "0");
            rowData.put("\""+"mate_data_id"+"\"", dataset);
            rowData.put("\""+"create_time"+"\"", new SimpleDateFormat("YYYY-MM-dd").format(new Date()));
            rowData.put("\""+"create_by"+"\"", SecurityUtils.getUsername());
            excelDataList.add(rowData);
        }
        return excelDataList;
    }

    /**
     * 文件导入测试
     *
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        //属性项
        /*FileInputStream inputStream = new FileInputStream(new File("C:/Users/lenovo/Desktop/data_1690421686799.xlsx"));
        byte[] stream = IoUtils.toByteArray(inputStream);
        List<Map<String, String>> dataList = parseExcelToView(stream, 1);
        List<String> objects = new ArrayList<>();
        dataList.forEach(d -> {
            objects.addAll(d.keySet());
        });
        System.out.println("属性项:" + objects);
        System.out.println("值:" + dataList);
        inputStream.close();*/
    }
}

DynamicEasyExcelListener.java


import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

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

    /**
     * 这里会一行行的返回头
     *
     * @param headMap
     * @param context
     */
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        //存储全部表头数据
        headList.add(headMap);
    }

    /**
     * 这个每一条数据解析都会来调用
     *
     * @param data
     * @param context
     */
    @Override
    public void invoke(Map<Integer, String> data, AnalysisContext context) {
        dataList.add(data);
    }

    /**
     * 所有数据解析完成了 都会来调用
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 这里也要保存数据,确保最后遗留的数据也存储到数据库
    }

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

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

mapper.xml

<insert id="insertSysDataByExcel" >
        insert into sys_data
        <foreach item="key" collection="keys" open="(" separator="," close=")">
            ${key}
        </foreach>
        values
        <foreach item="item" index="index" collection="dataList" open="" separator="," close="">
            <foreach collection="item" index="key" item="value" open="(" separator="," close=")">
                 #{value}
            </foreach>
        </foreach>
    </insert>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值