指定包:import com.opencloud.kamaitachi.server.utils.EasyExcelUtil;
EasyExcelUtil.writeSingleExcel("文件名","表名","要写的内容集合","要写的内容类")
例如:
EasyExcelUtil.writeSingleExcel(
PostedPositionExcelConvert.getFileNmae(query.getType()), PostedPositionExcelConvert.getFileNmae(query.getType()),
kamaitachiPositedWorkerExcel,
KamaitachiPositedWorkerExcelVO.class);
源码:
public static <T> String writeSingleExcel(
String fileName, String sheetName, List<T> tList, Class tClass
)
1.1 工作中的操作
@ApiOperation(value = "导出已浏览、已收藏、已投递职位列表", notes = "导出已浏览、已收藏、已投递职位列表")
@PostMapping(value = "/exportPostedPositionExcel")
public ResultBody<String> exportWorkerInfoExcel(@RequestBody KamaitachiPostedPositionConditionDTO query) throws IOException {
if(query.getChoseDateRange() != null && query.getChoseDateRange() != 0){
query.setBeginAndEndDate();
}
if(Objects.nonNull(query.getMinAge())){
query.setMinAgeTime(ageToDate(query.getMinAge()));
}
if(Objects.nonNull(query.getMaxAge())){
query.setMaxAgeTime(ageToDate(query.getMaxAge()));
}
List<KamaitachiPositedWorkerExcelVO> kamaitachiPositedWorkerExcel = new ArrayList<>();
List<KamaitachiPositedWorkerVO> list = kamaitachiPostedPositionService.listKamaitachiPositedWorkerVO(query);
if(list != null && list.size() >0){
for (KamaitachiPositedWorkerVO kamaitachiPositedWorkerVO:list) {
KamaitachiPositedWorkerExcelVO kamaitachiPositedWorkerExcelVO = new KamaitachiPositedWorkerExcelVO();
BeanUtils.copyProperties(kamaitachiPositedWorkerVO, kamaitachiPositedWorkerExcelVO);
kamaitachiPositedWorkerExcel.add(kamaitachiPositedWorkerExcelVO);
}
}
PostedPositionExcelConvert.getFileNmae(query.getType());
String downLoadFileName = EasyExcelUtil.writeSingleExcel(PostedPositionExcelConvert.getFileNmae(query.getType()), PostedPositionExcelConvert.getFileNmae(query.getType()), kamaitachiPositedWorkerExcel, KamaitachiPositedWorkerExcelVO.class);
return ResultBody.ok(downLoadFileName);
}
最近完成任务的时候遇到此类数据报表导出问题,因为是前面离职大佬写的,我接手了他的任务。一开始这个任务比较重要且繁多复杂,他在离职前并没有把他全部写好完善好,以至于后面留了很多的bug需要更正修改,同时没做太多的注释说明。刚接手他代码的会比较吃力,但他的思考角度是值得我学习的,他不足的地方也在学习中完善。
1.1.1、前提准备:Excel报表类
为了利用列表数据对Excel数据报表进行赋值,所以务必保证属性和列表类的属性一致,利用BeanUtils.copyProperties(a,b)进行复制赋值,报表类中的属性在数据列表属性中有的话就会覆盖赋值。
利用注解@ExcelProperty("昵称")
示例:Excel报表类中属性
@ExcelProperty("昵称")
private String nickName;
@ExcelProperty("姓名")
private String name;
1.1.2、利用先前列表数据对Excel报表类进行逐一赋值
他是利用先前的列表数据,对iPageResultBody(数据列表)将值进行逐一遍历赋值给Excel报表类属性
ResultBody<Page<KamaitachiWorkerInfoDTO>> iPageResultBody = this.list(query);
List<Object> poList = iPageResultBody.getData().getRecords().stream()
.map(kamaitachiWorkerInfoDTO -> {
WorkerInfoPO workerInfoPO = new WorkerInfoPO();
BeanUtils.copyProperties(kamaitachiWorkerInfoDTO,workerInfoPO);
......//(1.1.3)
return workerInfoPO;
})
.collect(Collectors.toList());
1.1.3、对于列表中没有的数据进行设置赋值
对于Excel报表类中特别的数据属性,比如性别,列表给的是1男2女,但在给报表赋值的时候需要变成男女,这时候需要对这些值进行设置赋值
//性别
workerInfoPO.setSex(SexEnum.getSexName(kamaitachiWorkerInfoDTO.getSex()));
//拥有证件
List<KamaitachiWorkerFiles> personalCardFilesList = kamaitachiWorkerInfoDTO.getPersonalCardFilesList();
if(personalCardFilesList != null && personalCardFilesList.size()>0){
StringBuilder sbWorkerFiles = new StringBuilder();
for (KamaitachiWorkerFiles kamaitachiWorkerFiles : personalCardFilesList) {
if(StringUtil.isNotEmpty(kamaitachiWorkerFiles.getFileUrl())){
sbWorkerFiles.append(kamaitachiWorkerFiles.getCredentialsName()).append('、');
}
}
workerInfoPO.setPersonalCardFiles(sbWorkerFiles.toString());
}
//实名认证
workerInfoPO.setIsRealname(RealnameStatusEnum.getName(kamaitachiWorkerInfoDTO.getIsRealname()));
//利用字典转换学历,须+1
Integer highestEducationCode = kamaitachiWorkerInfoDTO.getHighestEducationCode();
if(highestEducationCode != null && highestEducationCode >0){
if(StringUtil.isNotEmpty(SysDictParseUtil.parseSingleDictValue("KAMA_EDUCATION_REQUIRE",highestEducationCode+1))){ workerInfoPO.setHighestEducationName(SysDictParseUtil.parseSingleDictValue("KAMA_EDUCATION_REQUIRE",highestEducationCode+1));
}else{
workerInfoPO.setHighestEducationName("");
}
}
①这里利用了枚举类进行转换
public enum RealnameStatusEnum {
NO_REALNAME(0, "未实名"),
YES_REALNAME(1, "已实名"),
;
private Integer code;
private String msg;
RealnameStatusEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public Integer getCode() {
return code;
}
public String getMsg() {
return msg;
}
public static String getName(Integer code) {
for (RealnameStatusEnum type : RealnameStatusEnum.values()) {
if (type.getCode().equals(code)) {
return type.msg;
}
}
return "";
}
}
②利用数据字典进行转换
前提系统存在这个字典"KAMA_EDUCATION_REQUIRE"
示例:SysDictParseUtil.parseSingleDictValue("KAMA_EDUCATION_REQUIRE",highestEducationCode);
源码:SysDictParseUtil.parseSingleDictValue(dictType,dictCode);
1.1.4 利用EasyExcelUtil导出数据
String downLoadFileName = EasyExcelUtil.writeSingleExcel("服务人员导出", "服务人员导出", poList, WorkerInfoPO.class);
return ResultBody.ok(downLoadFileName);
1.1.5 总体示例
@ApiOperation(value = "服务人员导出", notes = "服务人员导出")
@PostMapping(value = "/exportWorkerInfoExcel")
public ResultBody<String> exportWorkerInfoExcel(@RequestBody WorkerInfoPageDto query) throws IOException {
// ResultBody<Page<KamaitachiWorkerInfoDTO>> iPageResultBody = this.list(query);
ResultBody<Page<KamaitachiWorkerInfoDTO>> iPageResultBody = this.list(query);
List<Object> poList = iPageResultBody.getData().getRecords().stream()
.map(kamaitachiWorkerInfoDTO -> {
WorkerInfoPO workerInfoPO = new WorkerInfoPO();
BeanUtils.copyProperties(kamaitachiWorkerInfoDTO,workerInfoPO);
//拥有证件
List<KamaitachiWorkerFiles> personalCardFilesList = kamaitachiWorkerInfoDTO.getPersonalCardFilesList();
if(personalCardFilesList != null && personalCardFilesList.size()>0){
StringBuilder sbWorkerFiles = new StringBuilder();
for (KamaitachiWorkerFiles kamaitachiWorkerFiles : personalCardFilesList) {
if(StringUtil.isNotEmpty(kamaitachiWorkerFiles.getFileUrl())){
sbWorkerFiles.append(kamaitachiWorkerFiles.getCredentialsName()).append('、');
}
}
workerInfoPO.setPersonalCardFiles(sbWorkerFiles.toString());
}
//性别
workerInfoPO.setSex(SexEnum.getSexName(kamaitachiWorkerInfoDTO.getSex()));
//实名认证
workerInfoPO.setIsRealname(RealnameStatusEnum.getName(kamaitachiWorkerInfoDTO.getIsRealname()));
//利用字典转换学历,须+1
Integer highestEducationCode = kamaitachiWorkerInfoDTO.getHighestEducationCode();
/* Map<String, String> highestEducationMap = sysdictUtil.getSysdict("KAMA_EDUCATION_REQUIRE","")
.entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey));*/
if(highestEducationCode != null && highestEducationCode >0){
if(StringUtil.isNotEmpty(SysDictParseUtil.parseSingleDictValue("KAMA_EDUCATION_REQUIRE",highestEducationCode+1))){
workerInfoPO.setHighestEducationName(SysDictParseUtil.parseSingleDictValue("KAMA_EDUCATION_REQUIRE",highestEducationCode+1));
}else{
workerInfoPO.setHighestEducationName("");
}
}
return workerInfoPO;
})
.collect(Collectors.toList());
String downLoadFileName = EasyExcelUtil.writeSingleExcel("服务人员导出", "服务人员导出", poList, WorkerInfoPO.class);
return ResultBody.ok(downLoadFileName);
}