原文:https://www.jianshu.com/p/d1d264c817ef
官網:https://www.yuque.com/easyexcel
API:https://alibaba-easyexcel.github.io/
GitHub:https://github.com/alibaba/easyexcel
package com.gdda.archives.platform.qc.checker.util; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.excel.read.listener.ReadListener; import com.alibaba.excel.support.ExcelTypeEnum; import com.alibaba.excel.write.builder.ExcelWriterBuilder; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import org.springframework.util.CollectionUtils; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.Set; public class ExcelUtil { /** * 寫出一個 excel 文件到本地 * <br /> * 將類型所有加了 @ExcelProperty 注解的屬性全部寫出 * * @param fileName 文件名 不要后綴 * @param sheetName sheet名 * @param data 寫出的數據 * @param clazz 要寫出數據類的Class類型對象 * @param <T> 寫出的數據類型 */ public static <T> void writeExcel(String fileName, String sheetName, List<T> data, Class<T> clazz) { writeExcel(null, fileName, sheetName, data, clazz); } /** * 按照指定的屬性名進行寫出 一個 excel * * @param attrName 指定的屬性名 必須與數據類型的屬性名一致 * @param fileName 文件名 不要后綴 * @param sheetName sheet名 * @param data 要寫出的數據 * @param clazz 要寫出數據類的Class類型對象 * @param <T> 要寫出的數據類型 */ public static <T> void writeExcel(Set<String> attrName, String fileName, String sheetName, List<T> data, Class<T> clazz) { try(FileOutputStream fos = new FileOutputStream(fileName)) { write(fos,attrName,sheetName,data,clazz); } catch (Exception exception) { exception.printStackTrace(); } } /** * 讀取 指定格式的 excel文檔 * * @param fileName 文件名 * @param clazz 數據類型的class對象 * @param <T> 數據類型 * @return */ public static <T> List<T> readExcel(String fileName, Class<T> clazz) { return readExcel(fileName, clazz, null); } /** * 取 指定格式的 excel文檔 * 注意一旦傳入自定義監聽器,則返回的list為空,數據需要在自定義監聽器里面獲取 * * @param fileName 文件名 * @param clazz 數據類型的class對象 * @param readListener 自定義監聽器 * @param <T> 數據類型 * @return */ public static <T> List<T> readExcel(String fileName, Class<T> clazz, ReadListener<T> readListener) { try(FileInputStream fis = new FileInputStream(fileName)) { return read(fis,clazz,readListener); } catch (Exception exception) { exception.printStackTrace(); } return null; } /** * 導出 一個 excel * 導出excel所有數據 * @param response * @param fileName 件名 最好為英文,不要后綴名 * @param sheetName sheet名 * @param data 要寫出的數據 * @param clazz 要寫出數據類的Class類型對象 * @param <T> 要寫出的數據類型 */ public static <T> void export(HttpServletResponse response, String fileName, String sheetName, List<T> data, Class<T> clazz) { export(response, null, fileName, sheetName, data, clazz); } /** * 按照指定的屬性名進行寫出 一個 excel * * @param response * @param attrName 指定的屬性名 必須與數據類型的屬性名一致 * @param fileName 文件名 最好為英文,不要后綴名 * @param sheetName sheet名 * @param data 要寫出的數據 * @param clazz 要寫出數據類的Class類型對象 * @param <T> 要寫出的數據類型 */ public static <T> void export(HttpServletResponse response, Set<String> attrName, String fileName, String sheetName, List<T> data, Class<T> clazz) { response.setContentType("application/vnd.ms-excel;charset=utf-8"); response.setCharacterEncoding("utf-8"); response.addHeader("Content-disposition", "attachment;filename=" + fileName + ExcelTypeEnum.XLSX.getValue()); try(OutputStream os = response.getOutputStream()) { write(os,attrName,sheetName,data,clazz); } catch (IOException e) { e.printStackTrace(); } } /** * 接收一個excel文件,並且進行解析 * 注意一旦傳入自定義監聽器,則返回的list為空,數據需要在自定義監聽器里面獲取 * @param multipartFile excel文件 * @param clazz 數據類型的class對象 * @param readListener 監聽器 * @param <T> * @return */ public static <T> List<T> importExcel(MultipartFile multipartFile,Class<T> clazz,ReadListener<T> readListener) { try(InputStream inputStream = multipartFile.getInputStream()) { return read(inputStream,clazz,readListener); } catch (IOException e) { e.printStackTrace(); } return null; } private static <T> void write(OutputStream os, Set<String> attrName, String sheetName, List<T> data, Class<T> clazz) { ExcelWriterBuilder write = EasyExcel.write(os, clazz); // 如果沒有指定要寫出那些屬性數據,則寫出全部 if (!CollectionUtils.isEmpty(attrName)) { write.includeColumnFiledNames(attrName); } write.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).sheet(sheetName).doWrite(data); } private static <T> List<T> read(InputStream in,Class<T> clazz, ReadListener<T> readListener) { List<T> list = new ArrayList<>(); Optional<ReadListener> optional = Optional.ofNullable(readListener); EasyExcel.read(in, clazz, optional.orElse(new AnalysisEventListener<T>() { @Override public void invoke(T data, AnalysisContext context) { list.add(data); } @Override public void doAfterAllAnalysed(AnalysisContext context) { System.out.println("解析完成"); } })).sheet().doRead(); return list; } }