背景
- 开发一个通用的数据规则模板
界面上的字段标头,使用template的映射,所有数据,都存在data表,通过ruleId区分所属业务
2.需求
根据不同的业务导入导出数据
要点:
- data表数据字段在不同的业务中表述的含义不一样,不能直接在实体中指定注解
@ExcelProperty(value = "xxx")
- 导入导出,都要使用模板表的映射
- 自动生成导入模板
/**
* 根据规则ID,下载导入数据模板
*
* @return
* @author zhutantan
* @date 2022/9/23 13:47
*/
@GetMapping("/exportTemplate/{ruleId}")
public void exportTemplate(@PathVariable int ruleId, HttpServletResponse response) {
try {
//获取规则表名
BmsRuleMain ruleMain = bmsRuleMainService.getById(ruleId);
//根据ruleid,动态生成EXCEL模板
List list = bmsRuleTemplateService.lambdaQuery()
.eq(BmsRuleTemplate::getRuleId, ruleId)
.orderByAsc(BmsRuleTemplate::getLineNo)
.list();
List> lists = list.stream().map((item) -> {
List temp = new ArrayList<>();
temp.add(item.getFieldName());
return temp;
}).collect(Collectors.toList());
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode(ruleMain.getRuleName() + "导入模板", "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
EasyExcel.write(response.getOutputStream())
.head(lists).sheet("导入模板")
.doWrite(new ArrayList());
} catch (Exception e) {
e.printStackTrace();
// R.fail();
}
// return R.ok();
}
- 导入数据时,根据template表,进行字段对照,使用表格的下标来确定字段
/**
* 导根据规则ID,导入数据
*
* @return com.kunzhi.common.core.domain.R
* @author wanghongliang
* @date 2023-07-07 15:40
*/
@PostMapping("/imported/{ruleId}")
public R importData(MultipartFile file, @PathVariable int ruleId) {
try {
List templates = bmsRuleTemplateService.lambdaQuery()
.eq(BmsRuleTemplate::getRuleId, ruleId)
.orderByAsc(BmsRuleTemplate::getLineNo)
.list();
EasyExcel.read(file.getInputStream(), new RuleDataListener(bmsRuleDataService, templates)).sheet().doRead();
return R.ok(null, "导入成功");
} catch (Exception e) {
e.printStackTrace();
return R.fail("导入失败,原因:" + e.getMessage());
}
}
RuleDataListener 类
package com.kunzhi.bms.listener;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import com.kunzhi.bms.domain.BmsRuleData;
import com.kunzhi.bms.domain.BmsRuleTemplate;
import com.kunzhi.bms.service.BmsRuleDataService;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
//@Component
public class RuleDataListener extends AnalysisEventListener
- 导出数据 标头和内容对应
/**
* 根据规则ID.导出数据
*
* @return
* @author zhutantan
* @date 2022/9/23 13:47
*/
@GetMapping("/export")
public void exportData(BmsRuleData bmsRuleData, HttpServletResponse response) {
try {
//获取规则表名
BmsRuleMain ruleMain = bmsRuleMainService.getById(bmsRuleData.getRuleId());
//重点,这里根据映射字段排序去生成标头,也是迎合导出时,默认和实体类的字段位置对应。
List templateList = bmsRuleTemplateService.lambdaQuery()
.eq(BmsRuleTemplate::getRuleId, bmsRuleData.getRuleId())
.groupBy(BmsRuleTemplate::getMappingField)
.orderByAsc(BmsRuleTemplate::getMappingField)
.list();
String cloms = templateList.stream().map(BmsRuleTemplate::getMappingField).collect(Collectors.joining(","));
System.out.println(cloms);
List list = bmsRuleDataService.list(new QueryWrapper<>(bmsRuleData).select(cloms));
// 定义表标题头字段
List> heade = new ArrayList>();
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode(ruleMain.getRuleName(), "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
// 根据用户传入字段 假设我们只要导出 date
Set includeColumnFiledNames = new HashSet();
for (BmsRuleTemplate clom :templateList){
List temp = new ArrayList<>();
temp.add(clom.getFieldName());
heade.add(temp);
includeColumnFiledNames.add(clom.getMappingField());
}
// 写入
EasyExcel.write(response.getOutputStream())
.head(heade)
.includeColumnFiledNames(includeColumnFiledNames)
.autoCloseStream(Boolean.FALSE)
.sheet("数据表")
.doWrite(list);
} catch (Exception e) {
e.printStackTrace();
}
}
实体类
package com.kunzhi.bms.domain;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.kunzhi.common.core.web.domain.BaseEntity;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.Date;
/**
* 规则数据表
* @TableName bms_rule_data
*/
@TableName(value ="bms_rule_data")
@Data
public class BmsRuleData extends BaseEntity {
/**
* 主键
*/
@ExcelIgnore
@TableId
private Long id;
/**
* 规则表ID
*/
@ExcelIgnore
@NotNull(message = "规则表ID不能为空")
private Long ruleId;
/**
* 版本号
*/
@ExcelIgnore
private String version;
/**
* 所属组织
*/
@ExcelIgnore
private String orgCode;
/**
* 日期值1
*/
private Date date1;
/**
* 日期值2
*/
private Date date2;
/**
* 日期值3
*/
private Date date3;
/**
* 日期值4
*/
private Date date4;
/**
* 日期值5
*/
private Date date5;
/**
* 日期值6
*/
private Date date6;
/**
* 日期值7
*/
private Date date7;
/**
* 日期值8
*/
private Date date8;
/**
* 日期值9
*/
private Date date9;
/**
* 日期值10
*/
private Date date10;
/**
* 日期值11
*/
private Date date11;
/**
* 日期值12
*/
private Date date12;
/**
* 日期值13
*/
private Date date13;
/**
* 日期值14
*/
private Date date14;
/**
* 日期值15
*/
private Date date15;
/**
* 数值1
*/
private Double double1;
/**
* 数值2
*/
private Double double2;
/**
* 数值3
*/
private Double double3;
/**
* 数值4
*/
private Double double4;
/**
* 数值5
*/
private Double double5;
/**
* 数值6
*/
private Double double6;
/**
* 数值7
*/
private Double double7;
/**
* 数值8
*/
private Double double8;
/**
* 数值9
*/
private Double double9;
/**
* 数值10
*/
private Double double10;
/**
* 数值11
*/
private Double double11;
/**
* 数值12
*/
private Double double12;
/**
* 数值13
*/
private Double double13;
/**
* 数值14
*/
private Double double14;
/**
* 数值15
*/
private Double double15;
/**
* 整数1
*/
private Integer integer1;
/**
* 整数2
*/
private Integer integer2;
/**
* 整数3
*/
private Integer integer3;
/**
* 整数4
*/
private Integer integer4;
/**
* 整数5
*/
private Integer integer5;
/**
* 整数6
*/
private Integer integer6;
/**
* 整数7
*/
private Integer integer7;
/**
* 整数8
*/
private Integer integer8;
/**
* 整数9
*/
private Integer integer9;
/**
* 整数10
*/
private Integer integer10;
/**
* 整数11
*/
private Integer integer11;
/**
* 整数12
*/
private Integer integer12;
/**
* 整数13
*/
private Integer integer13;
/**
* 整数14
*/
private Integer integer14;
/**
* 整数15
*/
private Integer integer15;
/**
* 值1
*/
private String value1;
/**
* 值2
*/
private String value2;
/**
* 值3
*/
private String value3;
/**
* 值4
*/
private String value4;
/**
* 值5
*/
private String value5;
/**
* 值6
*/
private String value6;
/**
* 值7
*/
private String value7;
/**
* 值8
*/
private String value8;
/**
* 值9
*/
private String value9;
/**
* 值10
*/
private String value10;
/**
* 值11
*/
private String value11;
/**
* 值12
*/
private String value12;
/**
* 值13
*/
private String value13;
/**
* 值14
*/
private String value14;
/**
* 值15
*/
private String value15;
}