diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelSheet.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelSheet.java new file mode 100644 index 00000000..20ca22c1 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelSheet.java @@ -0,0 +1,85 @@ +package com.ruoyi.common.utils.poi; + +import java.util.ArrayList; +import java.util.List; + +/** + * 多 Sheet 导出时的数据信息 + * + * 使用示例: + *
+ *   List> sheets = new ArrayList<>();
+ *   sheets.add(new ExcelSheet<>("参数数据", configList, Config.class, "参数信息"));
+ *   sheets.add(new ExcelSheet<>("岗位数据", postList, Post.class, "岗位信息"));
+ *   return ExcelUtil.exportMultiSheet(sheets);
+ * 
+ * + * @author ruoyi + */ +public class ExcelSheet +{ + /** Sheet 名称 */ + private String sheetName; + + /** 导出数据集合 */ + private List list; + + /** 数据对应的实体 Class */ + private Class clazz; + + /** Sheet 顶部大标题(可为空) */ + private String title; + + public ExcelSheet(String sheetName, List list, Class clazz) + { + this(sheetName, list, clazz, ""); + } + + public ExcelSheet(String sheetName, List list, Class 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 getList() + { + return list; + } + + public Class getClazz() + { + return clazz; + } + + public String getTitle() + { + return title; + } + + public void setSheetName(String sheetName) + { + this.sheetName = sheetName; + } + + public void setList(List list) + { + this.list = list; + } + + public void setClazz(Class clazz) + { + this.clazz = clazz; + } + + public void setTitle(String title) + { + this.title = title; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java index ce11e028..48c91f93 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java @@ -585,6 +585,117 @@ public class ExcelUtil exportExcel(response); } + /** + * 多 Sheet 导出 —— 将多个不同类型的数据集合写入同一 Excel,直接输出到 HttpServletResponse + * + * @param response HTTP 响应 + * @param sheets Sheet 描述列表 + */ + public static void exportMultiSheet(HttpServletResponse response, List> 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 导出 —— 将多个不同类型的数据集合写入同一 Excel,生成文件并返回下载地址 + * + * @param sheets Sheet 描述列表 + * @return AjaxResult(含文件下载地址) + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + public static AjaxResult exportMultiSheet(List> sheets) + { + if (sheets == null || sheets.isEmpty()) + { + return AjaxResult.error("导出数据不能为空"); + } + SXSSFWorkbook wb = buildWorkbook(sheets); + OutputStream out = null; + try + { + ExcelUtil firstUtil = new ExcelUtil(sheets.get(0).getClazz()); + String filename = firstUtil.encodingFilename(sheets.get(0).getSheetName()); + out = new FileOutputStream(firstUtil.getAbsoluteFile(filename)); + wb.write(out); + return AjaxResult.success(filename); + } + catch (Exception e) + { + log.error("多Sheet导出Excel异常{}", e.getMessage()); + throw new UtilException("导出Excel失败,请联系网站管理员!"); + } + finally + { + IOUtils.closeQuietly(wb); + IOUtils.closeQuietly(out); + } + } + + /** + * 构建多 Sheet Workbook —— 创建 SXSSFWorkbook 并将所有 Sheet 数据写入 + * + * @param sheets Sheet 描述列表 + * @return 已写入所有 Sheet 数据的 SXSSFWorkbook + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + private static SXSSFWorkbook buildWorkbook(List> 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 list, String sheetName, String title) + { + if (list == null) + { + list = new ArrayList(); + } + 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表单 *