package com.gome.gop.util;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.read.listener.ReadListener;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;
/**
* 基于EasyExcel的导入导出工具类, 在使用时需要先将excel实体类中的字段使用@ExcelProperty来指定表头
* {@link com.alibaba.excel.annotation.ExcelProperty}
* {@link com.alibaba.excel.annotation.write.style.ColumnWidth}
* {@link com.alibaba.excel.annotation.format.DateTimeFormat}
*/
public class EasyExcelAlibabaUtil {
private static Log logger = LogFactory.getLog("EasyExcelAlibabaUtil");
/**
* 将excel文件转化成javaList集合,
* 需要在传入的class的字段中加入EasyExcel的专用注解来指定表名
* @param excelFile 前端传入的文件
* @param clazz 一个Class对象
* @param <T>
* @return 可以直接转成传入的Class的List集合
*/
public static <T> List<T> excelToList(MultipartFile excelFile, Class<T> clazz) {
List<T> objects = null;
try {
InputStream inputStream = excelFile.getInputStream();
objects = EasyExcel.read(inputStream).head(clazz).sheet().doReadSync();
} catch (Exception e) {
logger.error("excelToList-exception", e);
} finally {
return objects;
}
}
/**
* 读取excel,这个相当于一个高性能模式。
* 比上面的方法多了一个readListener接口, 需要传一个实现这个接口的实现类
* 其中invoke方法是每读取一行都会调用, 所以可以读取一行处理一行, 性能比较高。
* @param excelFile
* @param clazz
* @param readListener
*/
public static void readExcelHighPerformance(MultipartFile excelFile, Class<T> clazz, ReadListener readListener) {
try {
InputStream inputStream = excelFile.getInputStream();
EasyExcel.read(inputStream, clazz, readListener).sheet().doRead();
} catch (Exception e) {
logger.error("excelToList-readExcelHighPerformance", e);
}
}
/**
* 下载excel
* @param response web项目中response对象
* @param clazz Class对象, 需要读取这个Class中的字段注解的名称, 用于生成表头
* @param list java的List集合,需要与传入的Class匹配
* @param excelName 需要生成的excel名称
*/
public static void download(HttpServletResponse response, Class<?> clazz, List<?> list, String excelName) {
try {
ServletOutputStream outputStream = response.getOutputStream();
response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type", "application/vnd.ms-excel");
response.setHeader("Content-Disposition",
"attachment;filename=" + URLEncoder.encode(excelName, "UTF-8"));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
EasyExcel.write(baos, clazz).sheet("sheet1").doWrite(list);
response.setHeader("Content-Length", String.valueOf(baos.size()));
outputStream.write(baos.toByteArray());
response.flushBuffer();
} catch(Exception e){
logger.error("excelToList-download", e);
}
}
}