为了简化easyexcel的使用,进行一些扩展,只需要通过一个注解做到导出excel
基于easyexcel的基础上扩展,
建议在类上都标注@ExcelIgnoreUnannotated注解,作用为忽略没有标注ExcelProperty的字段,如果所有字段都要导出,可以不标注
@ExcelIgnoreUnannotated // 忽略没有标注@ExcelProperty的字段导出
public class FamilyMemberDTO {
@ExcelProperty("户主")
private String hzmc;
@ExcelProperty("成员姓名")
private String cyxm;
@ExcelProperty("证件号码")
private String cyzjhm;
@ExcelProperty("家庭关系")
private String yhzgx;
@ExcelProperty("电话")
private String lxdh;
@ExcelProperty("时间")
private LocalDateTime time;
@ExcelProperty("时间2")
private Date date;
}
方法标注**@ResponseExcel**注解,
name:文件名 必填
sheetName:sheet名称 必填
suffix:文件后缀 非必填,默认XLSX
方法正常返回List就可以
注意返回值必须是List,并且list的元素不能时list
@GetMapping("/export")
@ResponseExcel(name = "测试",sheetName = "测试sheet")
public List<FamilyMemberDTO> exportTest(){
List<FamilyMemberDTO> dtoList = getData();
return dtoList;
}
实现ExcelEnum接口提供泛型,泛型为实体类字段的类型,一般为Integer或者String,并实现 getByCode方法 提供根据 字典值返回字典描述
@AllArgsConstructor
@Getter
public enum SexEunm implements ExcelEnum<Integer> {
/**
* 男
*/
MAN(1,"男"),
/**
* 女
*/
WOMAN(2,"女");
Integer code;
String desc;
@Override
public String getByCode(Integer code) {
for (SexEunm value : SexEunm.values()) {
if (value.getCode().equals(code)){
return value.getDesc();
}
}
return code.toString();
}
}
public interface DictService extends IService<Dict>, ExcelDictService{
}
@Service
public class DictServiceImpl extends ServiceImpl<DictMapper, Dict> implements DictService {
@Override
public Map<String, String> getValueByCode(String dictCode) {
List<Dict> dictList = baseMapper.selectList(Wrappers.lambdaQuery(Dict.class).eq(Dict::getDictCode, dictCode));
return dictList.stream().collect(Collectors.toMap(Dict::getValuee, Dict::getName));
}
}
@Data
@ExcelIgnoreUnannotated
public class FamilyMemberDTO{
@ExcelProperty("户主")
private String hzmc;
@ExcelProperty("成员姓名")
private String cyxm;
@ExcelProperty(value = "成员性别", converter = ExcelEnumValueConverter.class)
@ExcelEnumValue(SexEunm.class)
private Integer cyxb;
......
}
@Data
@ExcelIgnoreUnannotated
public class FamilyMemberDTO{
@ExcelProperty("户主")
private String hzmc;
@ExcelProperty("成员姓名")
private String cyxm;
@ExcelProperty(value = "成员性别", converter = ExcelDictValueConverter.class)
@ExcelDictValue("f_sex")
private Integer cyxb;
......
}
@GetMapping("/export")
@ResponseExcel(name = "测试",sheetName = "测试sheet")
public List<FamilyMemberDTO> exportTest(){
List<FamilyMemberDTO> dtoList = getData();
return dtoList;
}
合并列导出功能目前是根据对象中 指定列分组,在ResponseExcel注解里指定要合并哪些列
ExcelProperty注解value值为一个数组,可以提供多个列名,默认自动合并head相近同名列
在分组字段上标注ExcelMergeColumn注解,会根据这个字段分组
@Data
@ExcelIgnoreUnannotated
public class FamilyMemberMergeDTO {
@ExcelProperty(value = {"自定义合并", "户主", "户主"})
@ExcelMergeColumn
private String hzmc;
@ExcelProperty(value = {"自定义合并", "家庭成员情况", "成员姓名"})
private String cyxm;
@ExcelProperty(value = {"自定义合并", "家庭成员情况", "成员性别"}, converter = ExcelEnumValueConverter.class)
@ExcelEnumValue(SexEunm.class)
private Integer cyxb;
@ExcelProperty(value = {"自定义合并", "家庭成员情况", "证件号码"})
private String cyzjhm;
@ExcelProperty(value = {"自定义合并", "家庭成员情况", "家庭关系"})
private String yhzgx;
@ExcelProperty(value = {"自定义合并", "家庭成员情况", "电话"})
private String lxdh;
@ExcelProperty(value = {"自定义合并", "家庭成员情况", "时间"})
private LocalDateTime time;
}
ResponseExcel注解
isMerge属性设为true
mergeColumn属性指定要合并的列
headNumber sheet头的行数 可以不传,不传则取ExcelProperty注解value长度
@GetMapping("/export/merge")
@ResponseExcel(name = "测试", sheetName = "测试sheet",isMerge = true,mergeColumn = {0},headNumber = 3)
public List<FamilyMemberMergeDTO> exportMergeTest() {
List<FamilyMemberMergeDTO> dtoList = getMergeData();
return dtoList;
}
@Data
@ExcelIgnoreUnannotated
public class FamilyMemberDTO{
@ExcelProperty("户主")
private String hzmc;
@ExcelProperty("成员姓名")
private String cyxm;
@ExcelProperty(value = "成员性别", converter = ExcelEnumValueConverter.class)
@ExcelEnumValue(SexEunm.class)
private Integer cyxb;
@ExcelProperty("证件号码")
private String cyzjhm;
@ExcelProperty("家庭关系")
private String yhzgx;
@ExcelProperty("电话")
private String lxdh;
@ExcelProperty("时间")
private LocalDateTime time;
@ExcelProperty("时间2")
private Date date;
}
@AllArgsConstructor
@Getter
public enum SexEunm implements ExcelEnum<Integer> {
/**
* 男
*/
MAN(1, "男"),
/**
* 女
*/
WOMAN(2, "女");
Integer code;
String desc;
@Override
public String getByCode(Integer code) {
for (SexEunm value : SexEunm.values()) {
if (value.getCode().equals(code)) {
return value.getDesc();
}
}
return code.toString();
}
@Override
public Integer getCode(String desc) {
for (SexEunm value : SexEunm.values()) {
if (value.getDesc().equals(desc)) {
return value.getCode();
}
}
return null;
}
}
RequestExcel 注解 fileName 属性为前端传参文件属性名称
readListener 读excel监听器,非必填,有默认读监听器
headNumber excel头的行数,非必填,有默认值
不指定默认-1
则取一个ExcelProperty注解 value有值时 取value的长度
如value没有数值则 head 取值为 1
@PostMapping("/import")
public List<FamilyMemberDTO> importData(@RequestExcel(fileName = "file") List<FamilyMemberDTO> list) {
return list;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。