springboot EasyExcel 导入带多个sheet的表格到数据库


依赖

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
                        <version>2.2.7</version>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-api</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
<dependency>
            <groupId>com.github.dozermapper</groupId>
            <artifactId>dozer-spring-boot-starter</artifactId>
            <version>6.5.0</version>
        </dependency>

工具类

import com.github.dozermapper.core.Mapper;

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

public class DozerUtils {
    public static <T,S> List<T> mapList(final Mapper mapper, List<S> sourceList, Class<T> targetObjectClass){
        List<T> targetList=new ArrayList<T>();
        for(S s:sourceList){
            targetList.add(mapper.map(s,targetObjectClass));
        }
        return targetList;
    }
}

控制器写法

@Resource
    private Mapper dozerMapper;
    @Override
    public RestResponse importBaseDataExcel(@RequestParam("file") MultipartFile file) {
        try {
            InputStream inputStream = file.getInputStream();
            ExcelReader excelReader = EasyExcel.read(inputStream).build();

            ReadSheet sheet = EasyExcel.readSheet("绩效打分领导").head(JxLeader.class)
                    .registerReadListener(new JxLeaderListener(iJxLeaderService,dozerMapper))
                    .build();

            ReadSheet sheet2 = EasyExcel.readSheet("岗位级别系数人员分组").head(JxPostLevel.class)
                    .registerReadListener(new JxPostLevelListener(iJxPostLevelService,dozerMapper))
                    .build();

            ReadSheet sheet3 = EasyExcel.readSheet("绩效岗位条线").head(JxPostLine.class)
                    .registerReadListener(new JxPostLineListener(iJxPostLineService,dozerMapper))
                    .build();

            ReadSheet sheet4 = EasyExcel.readSheet("部门系数").head(JxInstCoef.class)
                    .registerReadListener(new JxInstCoefListener(iJxInstCoefService,dozerMapper))
                    .build();

            ReadSheet sheet5 = EasyExcel.readSheet("领导部门系数").head(JxLeaderInstCoef.class)
                    .registerReadListener(new JxLeaderInstCoefListener(iJxLeaderInstCoefService,dozerMapper))
                    .build();

            ReadSheet sheet6 = EasyExcel.readSheet("身份证号对应工号").head(JxIdCardToEmp.class)
                    .registerReadListener(new JxIdCardToEmpListener(iJxIdCardToEmpService,dozerMapper))
                    .build();

            excelReader.read(sheet);
            excelReader.read(sheet2);
            excelReader.read(sheet3);
            excelReader.read(sheet4);
            excelReader.read(sheet5);
            excelReader.read(sheet6);

            excelReader.finish();
        }catch (Exception e){
            e.printStackTrace();
        }
        return RestResponse.ok("导入成功");
    }

监听器写法

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.github.dozermapper.core.Mapper;
import com.pfpj.entity.JxIdCardToEmp;
import com.pfpj.service.IJxIdCardToEmpService;
import com.pfpj.utils.DozerUtils;
import lombok.*;

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

@Data
@AllArgsConstructor
@NoArgsConstructor
@RequiredArgsConstructor
public class JxIdCardToEmpListener extends AnalysisEventListener<JxIdCardToEmp> {
    /**
     *单次缓存量为1000
     */
    private final int BATCH_SIZE = 1000;

    /**
     * 临时存储List
     */
    private List<JxIdCardToEmp> cacheData = new ArrayList<>();
    @NonNull
    private IJxIdCardToEmpService iJxIdCardToEmpService;
    @NonNull
    private Mapper dozerMapper;


    @Override
    public void invoke(JxIdCardToEmp data, AnalysisContext analysisContext) {
        cacheData.add(data);
        if (cacheData.size() >= BATCH_SIZE){
            saveData();
            //每批存储完成后清空list
            cacheData.clear();
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        if (cacheData.size() > 0){
            saveData();
        }
    }

    private void saveData(){
        List<JxIdCardToEmp> teachers = DozerUtils.mapList(dozerMapper,cacheData,JxIdCardToEmp.class);
        iJxIdCardToEmpService.saveOrUpdateBatch(teachers);
    }
}

声明:大熊要飞翔|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - springboot EasyExcel 导入带多个sheet的表格到数据库


开心每一天