使用easy excel需要先引入对应的依赖包:
gradle依赖:
//easy excel
compile('com.alibaba:easyexcel:2.1.6')
maven依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.6</version>
</dependency>
这里展示导出byte[]的实现:
首先定义返回实体:
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@HeadRowHeight(20)
public class RefundOrderExportModel {
@ExcelProperty("编号")
@ColumnWidth(18)
private Integer orderTaskId;
@ExcelProperty(“单号")
@ColumnWidth(20)
private String orderNumber;
@ExcelProperty("生成时间")
@ColumnWidth(18)
private String createTime;
@ExcelProperty("备注")
@ColumnWidth(25)
private String remark;
}
其中@HeadRowHeigh注解是指定excel头的行高
@ExcelProperty注解是指定本字段对应的excel列名
@ColumnWidth注解是指定本列的列宽
定义一个通用的载体类:
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
@Data
@NoArgsConstructor
public class ExcelWriterModel implements Serializable {
private static final long serialVersionUID = -6335872074189617219L;
/**
* 导出数据
*/
private List<?> list;
/**
* 导出对象对于空list来说Java中是伪范型无法获取bean
*/
private Class<?> clazz;
/**
* 自定义导出列
*/
private List<List<String>> column;
/**
* sheet名称
*/
private String sheetName;
}
导出byte[]实现逻辑:
public byte[] generateExcelByte(ExcelWriterModel model){
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ExcelWriter excelWriter =
EasyExcel.write(outputStream).autoCloseStream(Boolean.TRUE).build();
ExcelWriterSheetBuilder excelWriterSheetBuilder = EasyExcel.writerSheet(model.getSheetName());
WriteSheet writeSheet;
if (null != model.getClazz()) {
writeSheet = excelWriterSheetBuilder.head(model.getClazz()).build();
} else {
writeSheet = excelWriterSheetBuilder.head(model.getColumn()).build();
}
excelWriter.write(model.getList(), writeSheet);
excelWriter.finish();
byte[] bytes = outputStream.toByteArray();
}
直接生成流并通过Controller返回的例子如下:
// 导出
@GetMapping("download”)
public void download(HttpServletResponse response) throws IOException {
// 直接用浏览器或者用postman
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("测试", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
// XXXX.class 是按导出类 data()应为数据库查询数据,这里只是模拟
EasyExcel.write(response.getOutputStream(), XXXX.class).sheet("模板").doWrite(data());
}