基于EasyExcel的导入导出工具类
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); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步