|
@@ -586,6 +586,117 @@ public class ExcelUtil<T>
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
|
|
+ * 多 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 导出 —— 将多个不同类型的数据集合写入同一 Excel,生成文件并返回下载地址
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param sheets Sheet 描述列表
|
|
|
|
|
+ * @return AjaxResult(含文件下载地址)
|
|
|
|
|
+ */
|
|
|
|
|
+ @SuppressWarnings({ "unchecked", "rawtypes" })
|
|
|
|
|
+ public static AjaxResult exportMultiSheet(List<ExcelSheet<?>> 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<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表单
|
|
* 对list数据源将其里面的数据导入到excel表单
|
|
|
*
|
|
*
|
|
|
* @param sheetName 工作表的名称
|
|
* @param sheetName 工作表的名称
|