????????上一篇博客已经基本介绍了EasyExcel的配置与基本使用方法。现在准备使用EasyExcel将Excel文件保存至数据库。
1.由于我们想每读取Excel中的N条记录后将这些记录全部写入数据库中。所以首先我们在Mybatis文件内先要写一个批量保存Excel文件中的记录的sql语句。
<insert id="insertBatch">
insert into dict (
id ,
parent_id ,
name ,
value ,
dict_code
) values
<foreach collection="list" item="item" index="index" separator=",">
(
#{item.id} ,
#{item.parentId} ,
#{item.name} ,
#{item.value} ,
#{item.dictCode}
)
</foreach>
</insert>
随后在Mapper接口中定义insertBatch方法。
public interface DictMapper extends BaseMapper<Dict> {
void insertBatch(List<ExcelDictDTO> list);
}
2. 首先创建相应的实体类(对应Excel表中一个记录)的监听器。
@Slf4j
public class ExcelDictDTOListener extends AnalysisEventListener<ExcelDictDTO> {
private List<ExcelDictDTO> excelDictDTOList=new ArrayList<>();
private static final int BATCH_COUNT=10;
private DictMapper dictMapper;
@Override
public void invoke(ExcelDictDTO excelDictDTO, AnalysisContext analysisContext) {
log.info("data:{}",excelDictDTO);
excelDictDTOList.add(excelDictDTO);
if(excelDictDTOList.size()>=BATCH_COUNT){
// saveData();
excelDictDTOList.clear();
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
// 不足BATCH_COUNT数的记录在这里存储
saveData();
log.info("所有数据解析完成!");
}
private void saveData() {
log.info("{}条数据,开始存储数据库!", excelDictDTOList.size());
// 批量插入
dictMapper.insertBatch(excelDictDTOList);
log.info("存储数据库成功!");
}
}
3.创建相关的服务类,读取Excel数据流的内容。
@Service
public class DictServiceImpl extends ServiceImpl<DictMapper, Dict> implements DictService {
@Transactional
@Override
public void importDictDataByExcel(InputStream inputStream){
EasyExcel.read(inputStream, ExcelDictDTO.class,new ExcelDictDTOListener()).sheet().doRead();
}
}
4.创建相关Controller,通过getInputStream方法获取excel文件的数据流。
@Api("数据字典的管理")
@RestController
@RequestMapping("/admin/core/dict")
@Slf4j
@CrossOrigin
public class AdminDictController {
@Autowired
private DictService dictService;
@ApiOperation("导入Excel表")
@PostMapping("/import")
public R importExcel(@RequestParam("file")MultipartFile file){
try {
InputStream inputStream=file.getInputStream();
dictService.importDictDataByExcel(inputStream);
return R.ok().message("导入成功");
}catch (Exception e){
throw new BusinessException(ResponseEnum.UPLOAD_ERROR,e);
}
}
}
在编写代码时,逻辑顺序为步骤1-2-3-4,但在实际调用时逻辑顺序为步骤4-3-2-1。