From ff76df9ae0f2383db903bab3efc6ef1223d0d071 Mon Sep 17 00:00:00 2001 From: liyang <liyang1987jay@163.com> Date: 星期三, 18 十二月 2024 17:27:16 +0800 Subject: [PATCH] 增加导出模板必填、备注 增加单独的导出模板 方法 --- ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java | 230 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 216 insertions(+), 14 deletions(-) diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java index 3605cf2..fa1fb90 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java @@ -10,22 +10,26 @@ import com.alibaba.excel.write.metadata.fill.FillConfig; import com.alibaba.excel.write.metadata.fill.FillWrapper; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.core.utils.file.FileUtils; -import org.dromara.common.excel.convert.ExcelBigNumberConvert; -import org.dromara.common.excel.core.CellMergeStrategy; -import org.dromara.common.excel.core.DefaultExcelListener; -import org.dromara.common.excel.core.ExcelListener; -import org.dromara.common.excel.core.ExcelResult; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletResponse; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.FileUtils; +import org.dromara.common.core.utils.reflect.ReflectUtils; +import org.dromara.common.excel.annotation.ExcelNotation; +import org.dromara.common.excel.annotation.ExcelRequired; +import org.dromara.common.excel.convert.ExcelBigNumberConvert; +import org.dromara.common.excel.core.*; +import org.dromara.common.excel.handler.DataWriteHandler; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.lang.reflect.Field; import java.util.Collection; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -87,7 +91,26 @@ try { resetResponse(sheetName, response); ServletOutputStream os = response.getOutputStream(); - exportExcel(list, sheetName, clazz, false, os); + exportExcel(list, sheetName, clazz, false, os, null); + } catch (IOException e) { + throw new RuntimeException("瀵煎嚭Excel寮傚父"); + } + } + + /** + * 瀵煎嚭excel + * + * @param list 瀵煎嚭鏁版嵁闆嗗悎 + * @param sheetName 宸ヤ綔琛ㄧ殑鍚嶇О + * @param clazz 瀹炰綋绫� + * @param response 鍝嶅簲浣� + * @param options 绾ц仈涓嬫媺閫� + */ + public static <T> void exportExcel(List<T> list, String sheetName, Class<T> clazz, HttpServletResponse response, List<DropDownOptions> options) { + try { + resetResponse(sheetName, response); + ServletOutputStream os = response.getOutputStream(); + exportExcel(list, sheetName, clazz, false, os, options); } catch (IOException e) { throw new RuntimeException("瀵煎嚭Excel寮傚父"); } @@ -106,7 +129,27 @@ try { resetResponse(sheetName, response); ServletOutputStream os = response.getOutputStream(); - exportExcel(list, sheetName, clazz, merge, os); + exportExcel(list, sheetName, clazz, merge, os, null); + } catch (IOException e) { + throw new RuntimeException("瀵煎嚭Excel寮傚父"); + } + } + + /** + * 瀵煎嚭excel + * + * @param list 瀵煎嚭鏁版嵁闆嗗悎 + * @param sheetName 宸ヤ綔琛ㄧ殑鍚嶇О + * @param clazz 瀹炰綋绫� + * @param merge 鏄惁鍚堝苟鍗曞厓鏍� + * @param response 鍝嶅簲浣� + * @param options 绾ц仈涓嬫媺閫� + */ + public static <T> void exportExcel(List<T> list, String sheetName, Class<T> clazz, boolean merge, HttpServletResponse response, List<DropDownOptions> options) { + try { + resetResponse(sheetName, response); + ServletOutputStream os = response.getOutputStream(); + exportExcel(list, sheetName, clazz, merge, os, options); } catch (IOException e) { throw new RuntimeException("瀵煎嚭Excel寮傚父"); } @@ -121,7 +164,20 @@ * @param os 杈撳嚭娴� */ public static <T> void exportExcel(List<T> list, String sheetName, Class<T> clazz, OutputStream os) { - exportExcel(list, sheetName, clazz, false, os); + exportExcel(list, sheetName, clazz, false, os, null); + } + + /** + * 瀵煎嚭excel + * + * @param list 瀵煎嚭鏁版嵁闆嗗悎 + * @param sheetName 宸ヤ綔琛ㄧ殑鍚嶇О + * @param clazz 瀹炰綋绫� + * @param os 杈撳嚭娴� + * @param options 绾ц仈涓嬫媺閫夊唴瀹� + */ + public static <T> void exportExcel(List<T> list, String sheetName, Class<T> clazz, OutputStream os, List<DropDownOptions> options) { + exportExcel(list, sheetName, clazz, false, os, options); } /** @@ -133,7 +189,8 @@ * @param merge 鏄惁鍚堝苟鍗曞厓鏍� * @param os 杈撳嚭娴� */ - public static <T> void exportExcel(List<T> list, String sheetName, Class<T> clazz, boolean merge, OutputStream os) { + public static <T> void exportExcel(List<T> list, String sheetName, Class<T> clazz, boolean merge, + OutputStream os, List<DropDownOptions> options) { ExcelWriterSheetBuilder builder = EasyExcel.write(os, clazz) .autoCloseStream(false) // 鑷姩閫傞厤 @@ -145,6 +202,8 @@ // 鍚堝苟澶勭悊鍣� builder.registerWriteHandler(new CellMergeStrategy(list, true)); } + // 娣诲姞涓嬫媺妗嗘搷浣� + builder.registerWriteHandler(new ExcelDownHandler(options)); builder.doWrite(list); } @@ -217,6 +276,26 @@ } /** + * 澶歴heet妯℃澘瀵煎嚭 妯℃澘鏍煎紡涓� {key.灞炴� + * + * @param filename 鏂囦欢鍚� + * @param templatePath 妯℃澘璺緞 resource 鐩綍涓嬬殑璺緞鍖呮嫭妯℃澘鏂囦欢鍚� + * 渚嬪: excel/temp.xlsx + * 閲嶇偣: 妯℃澘鏂囦欢蹇呴』鏀剧疆鍒板惎鍔ㄧ被瀵瑰簲鐨� resource 鐩綍涓� + * @param data 妯℃澘闇�瑕佺殑鏁版嵁 + * @param response 鍝嶅簲浣� + */ + public static void exportTemplateMultiSheet(List<Map<String, Object>> data, String filename, String templatePath, HttpServletResponse response) { + try { + resetResponse(filename, response); + ServletOutputStream os = response.getOutputStream(); + exportTemplateMultiSheet(data, templatePath, os); + } catch (IOException e) { + throw new RuntimeException("瀵煎嚭Excel寮傚父"); + } + } + + /** * 澶氳〃澶氭暟鎹ā鏉垮鍑� 妯℃澘鏍煎紡涓� {key.灞炴� * * @param templatePath 妯℃澘璺緞 resource 鐩綍涓嬬殑璺緞鍖呮嫭妯℃澘鏂囦欢鍚� @@ -251,9 +330,45 @@ } /** + * 澶歴heet妯℃澘瀵煎嚭 妯℃澘鏍煎紡涓� {key.灞炴� + * + * @param templatePath 妯℃澘璺緞 resource 鐩綍涓嬬殑璺緞鍖呮嫭妯℃澘鏂囦欢鍚� + * 渚嬪: excel/temp.xlsx + * 閲嶇偣: 妯℃澘鏂囦欢蹇呴』鏀剧疆鍒板惎鍔ㄧ被瀵瑰簲鐨� resource 鐩綍涓� + * @param data 妯℃澘闇�瑕佺殑鏁版嵁 + * @param os 杈撳嚭娴� + */ + public static void exportTemplateMultiSheet(List<Map<String, Object>> data, String templatePath, OutputStream os) { + ClassPathResource templateResource = new ClassPathResource(templatePath); + ExcelWriter excelWriter = EasyExcel.write(os) + .withTemplate(templateResource.getStream()) + .autoCloseStream(false) + // 澶ф暟鍊艰嚜鍔ㄨ浆鎹� 闃叉澶辩湡 + .registerConverter(new ExcelBigNumberConvert()) + .build(); + if (CollUtil.isEmpty(data)) { + throw new IllegalArgumentException("鏁版嵁涓虹┖"); + } + for (int i = 0; i < data.size(); i++) { + WriteSheet writeSheet = EasyExcel.writerSheet(i).build(); + for (Map.Entry<String, Object> map : data.get(i).entrySet()) { + // 璁剧疆鍒楄〃鍚庣画杩樻湁鏁版嵁 + FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); + if (map.getValue() instanceof Collection) { + // 澶氳〃瀵煎嚭蹇呴』浣跨敤 FillWrapper + excelWriter.fill(new FillWrapper(map.getKey(), (Collection<?>) map.getValue()), fillConfig, writeSheet); + } else { + excelWriter.fill(map.getValue(), writeSheet); + } + } + } + excelWriter.finish(); + } + + /** * 閲嶇疆鍝嶅簲浣� */ - private static void resetResponse(String sheetName, HttpServletResponse response) { + private static void resetResponse(String sheetName, HttpServletResponse response) throws UnsupportedEncodingException { String filename = encodingFilename(sheetName); FileUtils.setAttachmentResponseHeader(response, filename); response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8"); @@ -275,7 +390,7 @@ if (StringUtils.containsAny(propertyValue, separator)) { for (String value : propertyValue.split(separator)) { if (itemArray[0].equals(value)) { - propertyString.append(itemArray[1]).append(separator); + propertyString.append(itemArray[1] + separator); break; } } @@ -304,7 +419,7 @@ if (StringUtils.containsAny(propertyValue, separator)) { for (String value : propertyValue.split(separator)) { if (itemArray[1].equals(value)) { - propertyString.append(itemArray[0]).append(separator); + propertyString.append(itemArray[0] + separator); break; } } @@ -324,4 +439,91 @@ return IdUtil.fastSimpleUUID() + "_" + filename + ".xlsx"; } + /** + * 鑾峰彇蹇呭~鍒桵ap + * + * @param clazz 绫籧lass + * @return java.util.Map<java.lang.Integer, java.lang.Short> + * @author SunLingDa + * @date 2022/11/3 13:23 + */ + private static Map<Integer, Short> getRequiredMap(Class<?> clazz) { + Map<Integer, Short> requiredMap = new HashMap<>(); + Field[] fields = clazz.getDeclaredFields(); + // 妫�鏌� fields 鏁扮粍鏄惁涓虹┖ + if (fields.length == 0) { + return requiredMap; + } + Field[] filteredFields = ReflectUtils.getFields(clazz, field -> !"serialVersionUID".equals(field.getName())); + + for (int i = 0; i < filteredFields.length; i++) { + Field field = filteredFields[i]; + if (!field.isAnnotationPresent(ExcelRequired.class)) { + continue; + } + ExcelRequired excelRequired = field.getAnnotation(ExcelRequired.class); + int columnIndex = excelRequired.index() == -1 ? i : excelRequired.index(); + requiredMap.put(columnIndex, excelRequired.fontColor().getIndex()); + } + return requiredMap; + } + + /** + * 鑾峰彇鎵规敞Map + * + * @param clazz 绫籧lass + * @return java.util.Map<java.lang.Integer, java.lang.String> + * @author SunLingDa + * @date 2022/11/3 13:24 + */ + private static Map<Integer, String> getNotationMap(Class<?> clazz) { + Map<Integer, String> notationMap = new HashMap<>(); + Field[] fields = clazz.getDeclaredFields(); + // 妫�鏌� fields 鏁扮粍鏄惁涓虹┖ + if (fields.length == 0) { + return notationMap; + } + Field[] filteredFields = ReflectUtils.getFields(clazz, field -> !"serialVersionUID".equals(field.getName())); + for (int i = 0; i < filteredFields.length; i++) { + Field field = filteredFields[i]; + if (!field.isAnnotationPresent(ExcelNotation.class)) { + continue; + } + ExcelNotation excelNotation = field.getAnnotation(ExcelNotation.class); + int columnIndex = excelNotation.index() == -1 ? i : excelNotation.index(); + notationMap.put(columnIndex, excelNotation.value()); + } + return notationMap; + } + public static <T> void exportExcelRequire(List<T> list, String sheetName, Class<T> clazz,HttpServletResponse response) { + exportExcelTemplate(list,sheetName,clazz,response); + } + /** + * 瀵煎嚭excel妯℃澘 + * + * @param list 瀵煎嚭鏁版嵁闆嗗悎 + * @param sheetName 宸ヤ綔琛ㄧ殑鍚嶇О + * @param clazz 瀹炰綋绫� + * @param response 鍝嶅簲浣� + */ + public static <T> void exportExcelTemplate(List<T> list, String sheetName, Class<T> clazz, HttpServletResponse response) { + try { + Map<Integer, Short> requiredMap = getRequiredMap(clazz); + Map<Integer, String> notationMap = getNotationMap(clazz); + resetResponse(sheetName, response); + ServletOutputStream os = response.getOutputStream(); + DataWriteHandler writeHandler = new DataWriteHandler(notationMap, requiredMap); + ExcelWriterSheetBuilder builder = EasyExcel.write(os, clazz) + .autoCloseStream(false) + // 鑷姩閫傞厤 + .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) + .registerWriteHandler(writeHandler) + // 澶ф暟鍊艰嚜鍔ㄨ浆鎹� 闃叉澶辩湡 + .registerConverter(new ExcelBigNumberConvert()) + .sheet(sheetName); + builder.doWrite(list); + } catch (IOException e) { + throw new RuntimeException("瀵煎嚭Excel寮傚父"); + } + } } -- Gitblit v1.9.3