<dependency>
<groupId>com.alibabagroupId>
<artifactId>easyexcelartifactId>
<version>3.0.5version>
dependency>
@ExcelProperty(value = "合同编号")
value中的值对应导出excel表的表头
@JsonFormat
处理Date 类型
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
/**
* 供应商导出信息
* author: 哒不溜
*/
@Data
public class SuppliersExportDto {
@ExcelProperty(value = "合同编号")
private String supplierCode;
@ExcelProperty(value = "供应商ID")
private Long supplierId;
@ExcelProperty(value = "公司名称")
private String companyName;
@ExcelProperty(value = "店铺")
private String supplierName;
@ExcelProperty(value = "地址")
private String address;
@ExcelProperty(value = "绑定手机号")
private String mobile;
@ExcelProperty(value = "客服电话")
private String tel;
@ExcelProperty(value = "供应商分类")
private String taxType;
@ExcelProperty(value = "供应商状态")
private String supplierStatus;
@ExcelProperty(value = "审核状态")
private String aduitingStatus;
@JsonFormat(
pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8"
)
@ExcelProperty(value = "申请时间")
private Date aduitingCreateTime;
@ExcelProperty(value = "银行名称")
private String bank;
@ExcelProperty(value = "账户名字")
private String bankName;
@ExcelProperty(value = "银行账号")
private String bankCode;
@ExcelProperty(value = "开户银行网点")
private String bankOutlets;
}
实现方法:具体可看:easyExcel官方文档
// 这里的 ContentType 要和前端请求携带的 ContentType 相对应
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setCharacterEncoding("utf-8");
// DownloadData 是实体类,sheet 里面是 sheet 名称,doWrite 里面放要写入的数据,类型为 List
EasyExcel.write(response.getOutputStream(), SuppliersExportDto.class)
.autoCloseStream(Boolean.FALSE)
.sheet("供应商信息")
.doWrite(exportSuppliers);
在类的最上方加上@ExcelIgnoreUnannotated
注解即可;
这个注解的意思是:忽略不加@ExcelProperty
的字段进行输出
@ExcelIgnoreUnannotated
public class HsbSettlementDto {
// 加了@ExcelProperty注解的字段就导出,没加的不会导出
private String none;
@ExcelProperty(value = "会导出")
private String outStr;
...
}
写一个内部类或者新建一个类 以下导入的包都是com.alibaba.excel.里的
/**
* 导出 状态转换
*/
@Data
public static class statusConverter implements Converter<Integer> {
public statusConverter() {}
@Override
public Class supportJavaTypeKey() {
return Integer.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
@Override
public Integer convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
// 将excel的数据类型转为java数据类型
//我这里没用到就没写了,之后用到再记录
return null;
}
// 转换值
@Override
public WriteCellData<String> convertToExcelData(Integer value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
String str = "未知";
if (value.equals(0)) {
str = "待支付";
} else if (value.equals(1)) {
str = "待分账";
} else if (value.equals(2)) {
str = "已分账";
}
return new WriteCellData<>(str);
}
}
然后再在字段上引用: converter = 新建类类名.class
/**
* 分账状态
*/
@ExcelProperty(value = "结算状态", converter = statusConverter.class)
private Integer status;
写个导出按钮绑定点击事件就不展示代码了
this.$http({
// 调用后台路径
url: '/supplier/supplierAuditing/exportSupplierData',
method: 'POST',
data:{ //data传入你需要的数据,不用管我的个人行为
supplierIds: ids.join(","),
param: this.searchForm
},
responseType: 'blob' // 解决文件下载乱码问题
}).then(({ data }) => {
let objectUrl = data
// 这里的type和后端请求携带的 ContentType 相对应
const blob = new Blob([data], {type:'application/vnd.ms-excel;charset=utf-8'});
objectUrl = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = objectUrl;
// 定义文件名
a.download = "供应商列表.xlsx";
a.click();
a.remove();
URL.revokeObjectURL(objectUrl)
})
使用EasyExcel导出CSV格式的文件时,仅用在write的时候指定一下excelType即可。
具体看图
EasyExcel.write(fileName, DemoData.class)
// 指定导出类型为csv 有乱码情况可以设置一下编码格式
.excelType(ExcelTypeEnum.CSV).charset(Charset.forName("GBK"))
.sheet("模板")
.doWrite(() -> {
// 分页查询数据
return data();
});
兼容性问题 读取文件务必使用
2.0.5+
2.0.0-beta1到2.0.2有小概率会丢失数字。
具体可看:easyExcel必读