这几天修改公司系统里的导出功能,因而接触到了easyExcel,也在easyExcel的官方文档里浅看了两天,但也是一知半解,不过经主管的指点,也完成了导出功能的修改,这里做个完整的记录:
pom配置文件
com.alibaba easyexcel2.2.6
实体类:
实体类不引用了,就是正常写,无需特殊照顾
controller层:
@ResponseBody @RequestMapping(value = "/export", method = RequestMethod.POST) public ResponseData export(@RequestParam Mapparams) { String fileName = "服装信息"; fileName = UUID.randomUUID().toString() + "_" + fileName + ".xlsx"; String folder = Global.getTempPath() + File.separator + "pio" + File.separator; FileUtil.touch(folder + fileName); List listData = businessClothingService.export(params); List excels = new ArrayList<>(); for (BusinessClothingEntity number : listData) { ClothingExcel clothingExcel = new ClothingExcel(); BeanUtil.copyBeanProp(clothingExcel, number); excels.add(clothingExcel); } EasyExcel.write(folder + fileName, ClothingExcel.class).sheet("模板").doWrite(excels); return success(fileName); }
这里需注意
EasyExcel.write(folder + fileName, ClothingExcel.class).sheet("模板").doWrite(excels);
这行代码,这是关键,我们点击进入 ClothingExcel类:
package com.rutong.business.pojo;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
public class ClothingExcel {
@ExcelProperty(index = 0,value = "点位名称")
private String tsName;
@ExcelProperty(index = 1,value = "点位编号")
private String tsNumber;
@ExcelProperty(index = 2,value = "姓名")
private String name;
@ExcelProperty(index = 3,value = "服装编码")
private String cloCode;
@ExcelProperty(index = 4,value = "性别")
private String sex;
@ExcelProperty(index = 5,value = "职务")
private String job;
@ExcelProperty(index = 6,value = "手机号")
private String phone;
@ExcelProperty(index = 7,value = "芯片标签号")
private String cloRfid;
@ExcelProperty(index = 8,value = "配置服装")
private String cloDesc;
@ExcelIgnore
private String cloColor;
@ExcelProperty(index = 9,value = "服装规格")
private String cloSize;
@ExcelProperty(index = 10,value = "物资领取次数")
private Integer receive;
@ExcelProperty(index = 11,value = "最后领取时间")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date receiveTime;
@ExcelIgnore
private String areaName;
}
上面就是ClothingExcel类里面的代码,如果在这之前你有去官方文档里看过,或者查阅过其他的资料,那么你可能会认为这不就是写在实体类里面的吗,这样想也是对的,我前期也查过很多demo,就是这样写的实体类,但因为我要用到系统里面,使用步骤就会有所不同
实现类:
public Listexport(Map params) { QueryWrapper queryWrapper = new QueryWrapper (); String cloCode = (String) params.get("cloCode"); queryWrapper.eq(ToolUtil.isNotEmpty(cloCode), "clo_code", cloCode); String cloDesc = (String) params.get("cloDesc"); queryWrapper.eq(ToolUtil.isNotEmpty(cloDesc), "clo_desc", cloDesc); String cloColor = (String) params.get("cloColor"); queryWrapper.eq(ToolUtil.isNotEmpty(cloColor), "clo_color", cloColor); String cloSize = (String) params.get("cloSize"); queryWrapper.eq(ToolUtil.isNotEmpty(cloSize), "clo_size", cloSize); String cloRfid = (String) params.get("cloRfid"); queryWrapper.eq(ToolUtil.isNotEmpty(cloRfid), "clo_rfid", cloRfid); String areaId = (String) params.get("areaId"); if (StringUtils.isEmpty(areaId)) { LoginUserEntity userInfo = ShiroUtils.getUserInfo(); areaId = String.valueOf(userInfo.getAreaId()); } SysAreaEntity area = sysAreaService.getById(areaId); if (area.getLevel() == 2) { // 查询所有 } else if (area.getLevel() == 3) { // 区级 QueryWrapper ew = new QueryWrapper (); ew.eq("parent_id", area.getId()); List citys = sysAreaService.list(ew); List areaIds = citys.stream().map(c -> c.getId()).collect(Collectors.toList()); areaIds.add(area.getId()); queryWrapper.in(ToolUtil.isNotEmpty(areaId), "area_id", areaIds); } else if (area.getLevel() == 4) { // 街道 queryWrapper.eq(ToolUtil.isNotEmpty(areaId), "area_id", area.getId()); } List list = businessClothingMapper.selectList(queryWrapper); return list; }
前端:
导出Excel
function exportExcel(){
$.table.exportExcel('clothing-form')
}
本人也是二次开发,在原有的代码上面修改,这差不多就是整个流程,导出之后长这样:
文档的字段顺序,是根据前面 ClothingExcel类中,@ExcelProperty注解里index值的顺序来的,更改index属性的值便可更改文档中字段的顺序
知识点补充:
@ExcelProperty
必要的一个注解,注解中有三个参数value,index,converter分别代表列明,列序号,数据转换方式
1.value 通过标题文本对应
2.index 通过文本行号对应
3.converter 转换器,通常入库和出库转换使用,如性别入库0和1,出库男和女
@ExcelIgnore
不将该字段转换成Excel,加上此注解,该字段将不会在文档中显示
@ExcelIgnoreUnannotated
没有注解的字段都不转换
@ColumnWith
设置列宽度,只有一个参数value,value的单位是字符长度,最大可以设置255个字符,因为一个excel单元格最大可以写入的字符个数就是255个字符。
示例:
public class ImeiEncrypt {
@ColumnWidth(value = 18)
private String imei;
}



