最近遇到了一个excel简单的导入导出的需求,因此就对easyexcel第三方插件的使用做一点总结,大家可以看一看,可能会对你有点帮助。
目录
前言:
1、引入easyexcel相关依赖
2、创建对应excel的实体类
3、导入excel,并保存到数据库表中
4、导入excel的服务操作
5、得到结果,保存数据到数据库
6、读取数据库数据写入excel
7、总结
项目是一个springboot 项目,使用maven对依赖进行管理,需求有两个是:
①导入的excel有模板,即表头是明确的(简单)
②导入的excel没有模板,即表头是不明确的
此篇博客主要讲述easyexcel对于需求①的开发,关于需求②会在下一篇博客中进行讲解,地址(二)easyexcel 的使用(读取数据到map集合中)_网恋褙骗八万的博客-CSDN博客
com.alibaba easyexcel 2.1.1
excel模板如下:
对应的实体类:(注解 @ExcelProperty是easyexcel自带的注解,可以通过value绑定值即绑定到表头的方式,让每个属性对应到表头,当然也可以使用index进行索引的绑定。)
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import lombok.ToString;/*** @Author 不要有情绪的 ljy* @Date 2022/11/4 19:01* @Description:*/
@Data
@ToString
public class FaultInfoData {@ExcelProperty(value = "产品专业")private String productSpeacialty;@ExcelProperty(value = "产品类别")private String productCategory;@ExcelProperty(value = "产品规格")private String productSpecification;@ExcelProperty(value = "故障时间")private String faultTimeString;@ExcelProperty(value = "故障型号")private String faultModel;@ExcelProperty(value = "故障原因")private String faultReason;@ExcelProperty(value = "解决方案")private String faultSolution;}
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.bjsasc.productksys.exceptionHandler.SelfDefinitionException;
import com.bjsasc.productksys.faultinfoservice.entity.FaultInfo;
import com.bjsasc.productksys.faultinfoservice.entity.excel.FaultInfoData;
import com.bjsasc.productksys.faultinfoservice.service.FaultInfoService;
import com.bjsasc.productksys.utils.StringToDateUtil;
import org.springframework.beans.BeanUtils;import java.util.Date;
import java.util.Map;/*** @Author 不要有情绪的 ljy* @Date 2022/11/4 19:20* @Description:*/
public class FaultExcelListener extends AnalysisEventListener {private FaultInfoService faultInfoService;private int treeNodeId;public FaultExcelListener(FaultInfoService faultInfoService) {this.faultInfoService = faultInfoService;}public FaultExcelListener() {}public FaultExcelListener(FaultInfoService faultInfoService, int treeNodeId) {this.faultInfoService = faultInfoService;this.treeNodeId = treeNodeId;}//一行一行读取,然后使用new FaultInfo,把faultInfoData 使用copy的一个工具类复制过去,然后使用service直接save函数进行保存到数据库@Overridepublic void invoke(FaultInfoData faultInfoData, AnalysisContext analysisContext) {//表示excel中没有数据,就不需要读取了if (faultInfoData == null) {throw new SelfDefinitionException(20001, "故障信息导入失败!");}
// System.out.println(faultInfoData);//用于临时的一个对象,保存到数据库中的实例FaultInfo faultInfo = new FaultInfo();//使用工具类将FaultInfoData类拷贝给FaultInfo类BeanUtils.copyProperties(faultInfoData, faultInfo); //这儿是将faultInfoData拷贝到faultInfo//设置树的节点,此时的树节点应该为前端传递过来的树节点idfaultInfo.setSysTreeId(treeNodeId);faultInfoService.save(faultInfo);}//读取excel表头信息@Overridepublic void invokeHeadMap(Map headMap, AnalysisContextcontext) {System.out.println("表头信息:" + headMap);}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {System.out.println("表格读取完成!");}}
对以上代码进行解读,其中
@Overridepublic void saveFaultInfos(MultipartFile file, FaultInfoService faultInfoService, int treeNodeId) {try {//文件输入流InputStream is = file.getInputStream();//调用方法进行读取EasyExcel.read(is, FaultInfoData.class, new FaultExcelListener(faultInfoService, treeNodeId)).sheet().doRead();} catch (Exception e) {e.printStackTrace();throw new SelfDefinitionException(20001, "导入故障信息excel失败,添加失败");}}
访问controller的链接地址,进行服务调用,将数据保存到数据库,数据库表结果如下图:
以上是读取excel保存到数据库的操作
@ApiOperation(value = "选择一个路径,将当前的列表导出到excel")@GetMapping("/xxxxx/{treeNodeId}")public R xxxxx(@ApiParam(name = "treeNodeId", value = "当前树节点id", required = true) @PathVariable Integer treeNodeId) {SysTree treeNode = sysTreeService.getById(treeNodeId);String treeNodeName = treeNode.getNodeName();String fileName = treeNodeName + "_故障信息.xlsx";List list = faultInfoService.list(new QueryWrapper().eq("sys_tree_id", treeNodeId));//将FaultInfo类型转化成FaultInfoData类型List faultInfoDataList = list.stream().map(info -> {FaultInfoData faultInfoData = new FaultInfoData();BeanUtils.copyProperties(info, faultInfoData);return faultInfoData;}).collect(Collectors.toList());EasyExcel.write(fileName, FaultInfoData.class).sheet(treeNodeName).doWrite(faultInfoDataList);return R.ok();}
以上就是使用第三方插件easyexcel读取excel,写入excel的过程,本来想的挺清晰的,结果写着写着就有点乱了,不知道你们能不能看懂,通过绑定实体类的方式读取写入操作是比较简单的,仔细看看应该能够读懂,嘻嘻嘻!
学习之所以会想睡觉,是因为那是梦开始的地方。
ଘ(੭ˊᵕˋ)੭ (开心) ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)
------不写代码不会凸的小刘