1. 程式人生 > 其它 >好用的 easyExcel 工具類

好用的 easyExcel 工具類

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.alibaba.excel.write.handler.WriteHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.*; @Slf4j public class ExcelUtils { private static final String FILE_SUFFIX = ".xlsx";
/** * 匯出excel * @param response * @param fileName 檔名 * @param sheetName sheet名 * @param list 資料 list為空返回 空Excel */ public static void export(HttpServletResponse response, String fileName, String sheetName, List<?> list, Class<?> zlass) throws Exception { response.setContentType(
"application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); String fileNameCode = URLEncoder.encode(fileName, StandardCharsets.UTF_8); response.setHeader("Content-disposition", "attachment;filename=" + fileNameCode + FILE_SUFFIX); EasyExcel.write(response.getOutputStream(), zlass) .sheet(sheetName).doWrite(list); } /** * excel匯出 批註 * @param response * @param fileName 檔名 * @param list 匯出資料 * @param writeHandler 批註攔截器 */ public static void export(HttpServletResponse response, String fileName, List list, WriteHandler writeHandler, Class zlass) throws Exception { response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); String fileNameCode = URLEncoder.encode(fileName, StandardCharsets.UTF_8); response.setHeader("Content-disposition", "attachment;filename=" + fileNameCode + FILE_SUFFIX); EasyExcel.write(response.getOutputStream(), zlass) .inMemory(Boolean.TRUE).registerWriteHandler(writeHandler) .sheet(fileName).doWrite(list); } /** * 匯出Excel * @param response * @param fileName 檔名 * @param list 匯出資料 * @return void */ public static void export(HttpServletResponse response, String fileName, List<?> list, Class<?> zlass) throws Exception { export(response, fileName, fileName, list, zlass); } /** * 讀取excel檔案 * @param file 檔案 * @param clazz 模板類 * @return java.util.List */ public static <T> List<T> read(MultipartFile file, Class<T> clazz) { try { return EasyExcel.read(new BufferedInputStream(file.getInputStream())).head(clazz).sheet() .doReadSync(); } catch (IOException e) { e.printStackTrace(); } return null; } public static List<LinkedHashMap<Integer, Object>> readExcel(InputStream inputStream) { return EasyExcel.read(inputStream).headRowNumber(0).autoCloseStream(true).doReadAllSync(); } public static List<LinkedHashMap<Integer, Object>> readExcel(InputStream inputStream, String sheetName) { return EasyExcel.read(inputStream).headRowNumber(0).autoCloseStream(true).sheet(sheetName).doReadSync(); } public static List<LinkedHashMap<Integer, Object>> readExcel(InputStream inputStream, Integer sheetIndex) { return EasyExcel.read(inputStream).headRowNumber(0).autoCloseStream(true).sheet(sheetIndex).doReadSync(); } public static Map<String, List<LinkedHashMap<Integer, Object>>> readNameExcel(InputStream inputStream, List<ReadSheet> readSheets) { SyncManySheetNameReadListener syncReadListener = new SyncManySheetNameReadListener(); EasyExcel.read(inputStream).registerReadListener(syncReadListener).autoCloseStream(true) .build().read(readSheets).finish(); return syncReadListener.getMap(); } public static Map<Integer, List<LinkedHashMap<Integer, Object>>> readIndexExcel(InputStream inputStream, List<ReadSheet> readSheets) { SyncManySheetIndexReadListener syncReadListener = new SyncManySheetIndexReadListener(); EasyExcel.read(inputStream).registerReadListener(syncReadListener).autoCloseStream(true) .build().read(readSheets).finish(); return syncReadListener.getMap(); } public static Map<String, List<LinkedHashMap<Integer, Object>>> readExcel(List<String> sheetNames, InputStream is) { Map<String, List<LinkedHashMap<Integer, Object>>> data; if(DataUtils.isEmpty(sheetNames)) { data = new HashMap<>(); data.put("", ExcelUtils.readExcel(is)); } else { List<ReadSheet> list = new ArrayList<>(); for(String name : sheetNames) { list.add(new ReadSheet(null, name)); } data = readNameExcel(is, list); } return data; } public static String getAsString(LinkedHashMap<Integer, Object> cell, int i) { Object o = cell.get(i); if(o == null) { return null; } return o.toString(); } private static class SyncManySheetNameReadListener extends AnalysisEventListener<Object> { private Map<String, List<LinkedHashMap<Integer, Object>>> map = new HashMap<>(); public SyncManySheetNameReadListener() { } public void invoke(Object object, AnalysisContext context) { map.computeIfAbsent(context.readSheetHolder().getSheetName(), a -> new ArrayList<>()).add((LinkedHashMap<Integer, Object>) object); } public void doAfterAllAnalysed(AnalysisContext context) { } public Map<String, List<LinkedHashMap<Integer, Object>>> getMap() { return this.map; } } private static class SyncManySheetIndexReadListener extends AnalysisEventListener<Object> { private Map<Integer, List<LinkedHashMap<Integer, Object>>> map = new HashMap<>(); public SyncManySheetIndexReadListener() { } public void invoke(Object object, AnalysisContext context) { map.computeIfAbsent(context.readSheetHolder().getSheetNo(), a -> new ArrayList<>()).add((LinkedHashMap<Integer, Object>) object); } public void doAfterAllAnalysed(AnalysisContext context) { } public Map<Integer, List<LinkedHashMap<Integer, Object>>> getMap() { return this.map; } } }