最近遇到了一个excel简单的导入导出的需求,因此就对easyexcel第三方插件的使用做一点总结,大家可以看一看,可能会对你有点帮助。
目录
前言:
项目是一个springboot 项目,使用maven对依赖进行管理,需求有两个是:
①导入的excel有模板,即表头是明确的(简单)
②导入的excel没有模板,即表头是不明确的
此篇博客主要讲述easyexcel对于需求①的开发,关于需求②会在下一篇博客中进行讲解,地址(二)easyexcel 的使用(读取数据到map集合中)_网恋褙骗八万的博客-CSDN博客
1、引入easyexcel相关依赖
<!-- easyexcel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.1</version>
</dependency>
2、创建对应excel的实体类
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;
}
3、导入excel,并保存到数据库表中
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<FaultInfoData> {
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函数进行保存到数据库
@Override
public 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
//设置树的节点,此时的树节点应该为前端传递过来的树节点id
faultInfo.setSysTreeId(treeNodeId);
faultInfoService.save(faultInfo);
}
//读取excel表头信息
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext
context) {
System.out.println("表头信息:" + headMap);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("表格读取完成!");
}
}
对以上代码进行解读,其中
- invoke()函数是进行一行行读取excel数据的函数,并且每行数据会被保存到 FaultInfoData 类中,然后将FaultInfoData转化成数据库对应的实体类 FaultInfo ,使用mybatis进行保存数据。
- invokeHeadMap()函数能够打印输出表头
- doAfterAllAnalysed()函数是表格读取后进行的操作
- FaultInfoService是进行服务操作的,由于没有在spring容器中进行注册,所以要通过传递参数的形式传递过来。
4、导入excel的服务操作
@Override
public 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失败,添加失败");
}
}
5、得到结果,保存数据到数据库
访问controller的链接地址,进行服务调用,将数据保存到数据库,数据库表结果如下图:
以上是读取excel保存到数据库的操作
6、读取数据库数据写入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<FaultInfo> list = faultInfoService.list(new QueryWrapper<FaultInfo>().eq("sys_tree_id", treeNodeId));
//将FaultInfo类型转化成FaultInfoData类型
List<FaultInfoData> 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();
}
7、总结
以上就是使用第三方插件easyexcel读取excel,写入excel的过程,本来想的挺清晰的,结果写着写着就有点乱了,不知道你们能不能看懂,通过绑定实体类的方式读取写入操作是比较简单的,仔细看看应该能够读懂,嘻嘻嘻!
学习之所以会想睡觉,是因为那是梦开始的地方。
ଘ(੭ˊᵕˋ)੭ (开心) ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)
------不写代码不会凸的小刘