这几天修改公司系统里的导出功能,因而接触到了easyExcel,也在easyExcel的官方文档里浅看了两天,但也是一知半解,不过经主管的指点,也完成了导出功能的修改,这里做个完整的记录:
pom配置文件
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.6</version>
</dependency>
实体类:
实体类不引用了,就是正常写,无需特殊照顾
controller层:
@ResponseBody
@RequestMapping(value = "/export", method = RequestMethod.POST)
public ResponseData export(@RequestParam Map<String, Object> params) {
String fileName = "服装信息";
fileName = UUID.randomUUID().toString() + "_" + fileName + ".xlsx";
String folder = Global.getTempPath() + File.separator + "pio" + File.separator;
FileUtil.touch(folder + fileName);
List<BusinessClothingEntity> listData = businessClothingService.export(params);
List<ClothingExcel> 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;
/** 服装RFID */
@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 List<BusinessClothingEntity> export(Map<String, Object> params) {
QueryWrapper<BusinessClothingEntity> queryWrapper = new QueryWrapper<BusinessClothingEntity>();
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<SysAreaEntity> ew = new QueryWrapper<SysAreaEntity>();
ew.eq("parent_id", area.getId());
List<SysAreaEntity> citys = sysAreaService.list(ew);
List<Long> 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<BusinessClothingEntity> list = businessClothingMapper.selectList(queryWrapper);
return list;
}
前端:
<a class="btn btn-success" onclick="exportExcel()">
<i class="fa fa-download"></i> 导出Excel
</a>
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;
}