1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
| @Slf4j public class ExcelUtil {
/** * 导出Excel * * @param response HttpServletResponse * @param data 数据列表 * @param fileName 文件名 * @param sheetName sheet名 * @param clazz 数据类型 * @param <T> 泛型 */ public static <T> void export(HttpServletResponse response, List<T> data, String fileName, String sheetName, Class<T> clazz) { try { // 设置响应头 setExcelResponseHeader(response, fileName); // 导出Excel EasyExcel.write(response.getOutputStream(), clazz) .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) .sheet(sheetName) .doWrite(data); log.info("Excel导出成功,文件名:{},数据量:{}", fileName, data.size()); } catch (IOException e) { log.error("Excel导出失败", e); throw new RuntimeException("Excel导出失败", e); } }
/** * 导出Excel(带自定义处理器) * * @param response HttpServletResponse * @param data 数据列表 * @param fileName 文件名 * @param sheetName sheet名 * @param clazz 数据类型 * @param handlers 自定义处理器列表 * @param <T> 泛型 */ public static <T> void exportWithHandlers(HttpServletResponse response, List<T> data, String fileName, String sheetName, Class<T> clazz, List<?> handlers) { try { // 设置响应头 setExcelResponseHeader(response, fileName); // 创建ExcelWriter ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), clazz) .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) .build(); // 注册自定义处理器 WriteSheet writeSheet = EasyExcel.writerSheet(sheetName).build(); for (Object handler : handlers) { //writeSheet.(handler); } // 写入数据 excelWriter.write(data, writeSheet); excelWriter.finish(); log.info("Excel导出成功(带自定义处理器),文件名:{},数据量:{}", fileName, data.size()); } catch (IOException e) { log.error("Excel导出失败", e); throw new RuntimeException("Excel导出失败", e); } }
/** * 使用模板导出Excel * * @param response HttpServletResponse * @param templatePath 模板路径 * @param data 数据 * @param fileName 文件名 */ public static void exportWithTemplate(HttpServletResponse response, String templatePath, Map<String, Object> data, String fileName) { try { // 设置响应头 setExcelResponseHeader(response, fileName); // 获取模板输入流 InputStream templateInputStream = ExcelUtil.class.getClassLoader().getResourceAsStream(templatePath); if (templateInputStream == null) { throw new RuntimeException("模板文件不存在:" + templatePath); } // 填充模板 ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(templateInputStream).build(); WriteSheet writeSheet = EasyExcel.writerSheet().build(); // 设置填充配置 FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); // 填充数据 excelWriter.fill(data, fillConfig, writeSheet); excelWriter.finish(); log.info("Excel模板导出成功,文件名:{}", fileName); } catch (IOException e) { log.error("Excel模板导出失败", e); throw new RuntimeException("Excel模板导出失败", e); } }
/** * 设置Excel响应头 * * @param response HttpServletResponse * @param fileName 文件名 * @throws UnsupportedEncodingException 不支持的编码异常 */ private static void setExcelResponseHeader(HttpServletResponse response, String fileName) throws UnsupportedEncodingException { response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); // 防止中文乱码 String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + encodedFileName + ".xlsx"); } }
|