| ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelSheet.java | ●●●●● patch | view | raw | blame | history | |
| ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelUtil.java | ●●●●● patch | view | raw | blame | history |
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelSheet.java
New file @@ -0,0 +1,85 @@ package com.ruoyi.common.core.utils.poi; import java.util.ArrayList; import java.util.List; /** * 多 Sheet 导出时的数据信息 * * 使用示例: * <pre> * List<ExcelSheet<?>> sheets = new ArrayList<>(); * sheets.add(new ExcelSheet<>("参数数据", configList, Config.class, "参数信息")); * sheets.add(new ExcelSheet<>("岗位数据", postList, Post.class, "岗位信息")); * return ExcelUtil.exportMultiSheet(sheets); * </pre> * * @author ruoyi */ public class ExcelSheet<T> { /** Sheet 名称 */ private String sheetName; /** 导出数据集合 */ private List<T> list; /** 数据对应的实体 Class */ private Class<T> clazz; /** Sheet 顶部大标题(可为空) */ private String title; public ExcelSheet(String sheetName, List<T> list, Class<T> clazz) { this(sheetName, list, clazz, ""); } public ExcelSheet(String sheetName, List<T> list, Class<T> clazz, String title) { this.sheetName = sheetName; this.list = list != null ? list : new ArrayList<>(); this.clazz = clazz; this.title = title != null ? title : ""; } public String getSheetName() { return sheetName; } public List<T> getList() { return list; } public Class<T> getClazz() { return clazz; } public String getTitle() { return title; } public void setSheetName(String sheetName) { this.sheetName = sheetName; } public void setList(List<T> list) { this.list = list; } public void setClazz(Class<T> clazz) { this.clazz = clazz; } public void setTitle(String title) { this.title = title; } } ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelUtil.java
@@ -503,6 +503,82 @@ } /** * 多 Sheet 导出 —— 将多个不同类型的数据集合写入同一 Excel,直接输出到 HttpServletResponse * * @param response HTTP 响应 * @param sheets Sheet 描述列表 */ public static void exportMultiSheet(HttpServletResponse response, List<ExcelSheet<?>> sheets) { if (sheets == null || sheets.isEmpty()) { return; } SXSSFWorkbook wb = buildWorkbook(sheets); try { response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); wb.write(response.getOutputStream()); } catch (Exception e) { log.error("多Sheet导出Excel异常{}", e.getMessage()); } finally { IOUtils.closeQuietly(wb); } } /** * 构建多 Sheet Workbook —— 创建 SXSSFWorkbook 并将所有 Sheet 数据写入 * * @param sheets Sheet 描述列表 * @return 已写入所有 Sheet 数据的 SXSSFWorkbook */ @SuppressWarnings({ "rawtypes", "unchecked" }) private static SXSSFWorkbook buildWorkbook(List<ExcelSheet<?>> sheets) { SXSSFWorkbook wb = new SXSSFWorkbook(500); for (ExcelSheet<?> excelSheet : sheets) { ExcelUtil util = new ExcelUtil(excelSheet.getClazz()); util.initWithWorkbook(wb, excelSheet.getList(), excelSheet.getSheetName(), excelSheet.getTitle()); util.writeSheet(); } return wb; } /** * 使用外部传入的 Workbook 初始化(多 Sheet 导出专用) * 与 init() 的区别:不新建 Workbook,而是在已有 wb 上追加新 Sheet * * @param wb 已有工作簿 * @param list 数据集合 * @param sheetName Sheet 名称 * @param title 大标题(可为空) */ public void initWithWorkbook(SXSSFWorkbook wb, List<T> list, String sheetName, String title) { if (list == null) { list = new ArrayList<T>(); } this.list = list; this.sheetName = sheetName; this.title = title != null ? title : ""; this.type = Type.EXPORT; this.rownum = 0; this.wb = wb; this.sheet = wb.createSheet(sheetName); createExcelField(); this.styles = createStyles(wb); createTitle(); createSubHead(); } /** * 对list数据源将其里面的数据导入到excel表单 * * @param sheetName 工作表的名称