diff --git a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/controller/KhGatherController.java b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/controller/KhGatherController.java index 0309a22..526f60d 100644 --- a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/controller/KhGatherController.java +++ b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/controller/KhGatherController.java @@ -2,6 +2,7 @@ package com.ruoyi.kaohe.controller; import java.io.IOException; import java.math.BigDecimal; +import java.net.URLEncoder; import java.util.*; import javax.servlet.http.HttpServletResponse; @@ -334,9 +335,12 @@ public class KhGatherController extends BaseController { @Log(title = "生成汇总", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, Long id) throws Exception { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("汇总数据.xlsx", "UTF-8")); KhGather gather = khGatherService.selectKhGatherById(id); String tableHeader = gather.getTableHeader(); - // EnhancedJsonExporter.export(tableHeader,"生成汇总数据.xlsx"); + String tableData = gather.getTableData(); + EnhancedJsonExporter.exportWithMergedHeader(tableHeader,tableData,response); } /** diff --git a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/util/EnhancedJsonExporter.java b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/util/EnhancedJsonExporter.java index e173900..bb395ed 100644 --- a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/util/EnhancedJsonExporter.java +++ b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/util/EnhancedJsonExporter.java @@ -4,12 +4,16 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import java.io.FileOutputStream; +import javax.servlet.http.HttpServletResponse; import java.util.*; public class EnhancedJsonExporter { + private static final Logger log = LoggerFactory.getLogger(EnhancedJsonExporter.class); private static final ObjectMapper mapper = new ObjectMapper(); static class HeaderNode { @@ -21,7 +25,8 @@ public class EnhancedJsonExporter { List children = new ArrayList<>(); } - public static void exportWithMergedHeader(String jsonStr,String jsonData, String outputPath) throws Exception { + //public static void exportWithMergedHeader(String jsonStr,String jsonData, String outputPath) throws Exception { + public static void exportWithMergedHeader(String jsonStr,String jsonData, HttpServletResponse response) throws Exception { JsonNode rootNode = mapper.readTree(jsonStr); JsonNode dataNode = mapper.readTree(jsonData); Workbook workbook = new XSSFWorkbook(); @@ -40,7 +45,7 @@ public class EnhancedJsonExporter { createMergedHeaderRows(sheet, rootHeader, headStyle); // 填充数据 - fillDataRows(sheet, dataNode, rootHeader,headStyle);//rootNode改为实际数据dataNode + fillDataRows(sheet, dataNode, rootHeader,headStyle); // 自适应列宽 autoSizeColumns(sheet, rootHeader.span); @@ -48,9 +53,23 @@ public class EnhancedJsonExporter { // 添加边框 addBordersWithMergedRegions(sheet); - // 输出文件 - try (FileOutputStream fos = new FileOutputStream(outputPath)) { + // 输出文件 ——main方法测试该工具类时使用 + /*try (FileOutputStream fos = new FileOutputStream(outputPath)) { workbook.write(fos); + }*/ + + //导出数据 + try + { + workbook.write(response.getOutputStream()); + } + catch (Exception e) + { + log.error("导出Excel异常{}", e.getMessage()); + } + finally + { + IOUtils.closeQuietly(workbook); } } @@ -270,7 +289,8 @@ public class EnhancedJsonExporter { // String jsonHead ="[{\"name\":\"khdx\",\"label\":\"单位\"},{\"name\":\"tscx\",\"label\":\"特色创新\",\"children\":[{\"name\":\"khx1\",\"label\":\"分数 (满分10分)\"}]},{\"name\":\"tscx_df\",\"label\":\"得分\"}]"; // String jsonData ="[{\"khdx\":\"生命科学系\",\"tscx\":{\"khx1\":7.5000},\"tscx_df\":7.5000},{\"khdx\":\"海洋学院\",\"tscx\":{\"khx1\":10.0000},\"tscx_df\":10.0000},{\"khdx\":\"历史文化与法学系\",\"tscx\":{\"khx1\":5.0000},\"tscx_df\":5.0000},{\"khdx\":\"物理科学与技术学院\",\"tscx\":{\"khx1\":10.0000},\"tscx_df\":10.0000},{\"khdx\":\"教育学院\",\"tscx\":{\"khx1\":10.0000},\"tscx_df\":10.0000},{\"khdx\":\"资源管理系\",\"tscx\":{\"khx1\":10.0000},\"tscx_df\":10.0000},{\"khdx\":\"马克思主义学院\",\"tscx\":{\"khx1\":10.0000},\"tscx_df\":10.0000},{\"khdx\":\"美术学院\",\"tscx\":{\"khx1\":10.0000},\"tscx_df\":10.0000},{\"khdx\":\"计算机科学技术系\",\"tscx\":{\"khx1\":10.0000},\"tscx_df\":10.0000},{\"khdx\":\"化学系\",\"tscx\":{\"khx1\":10.0000},\"tscx_df\":10.0000},{\"khdx\":\"数学与计算科学学院\",\"tscx\":{\"khx1\":10.0000},\"tscx_df\":10.0000},{\"khdx\":\"继续教育学院\",\"tscx\":{\"khx1\":10.0000},\"tscx_df\":10.0000},{\"khdx\":\"外国语学院\",\"tscx\":{\"khx1\":10.0000},\"tscx_df\":10.0000},{\"khdx\":\"体育系\",\"tscx\":{\"khx1\":10.0000},\"tscx_df\":10.0000},{\"khdx\":\"文学院\",\"tscx\":{\"khx1\":7.5000},\"tscx_df\":7.5000},{\"khdx\":\"音乐系\",\"tscx\":{\"khx1\":9.0000},\"tscx_df\":9.0000}]"; try { - exportWithMergedHeader(jsonHead,jsonData, "考核结果.xlsx"); + //main方法测试时去掉方法中的response参数,使用本地导出测试 + // exportWithMergedHeader(jsonHead,jsonData, "考核结果.xlsx"); System.out.println("导出成功"); } catch (Exception e) { e.printStackTrace(); diff --git a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/util/JsonToExcelExporter.java b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/util/JsonToExcelExporter.java deleted file mode 100644 index 4ca2777..0000000 --- a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/util/JsonToExcelExporter.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.ruoyi.kaohe.util; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.poi.ss.usermodel.*; -import org.apache.poi.ss.util.CellRangeAddress; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.*; - -public class JsonToExcelExporter { - public static Workbook export(JsonNode jsonData) throws IOException { - Workbook workbook = new XSSFWorkbook(); - Sheet sheet = workbook.createSheet("Sheet1"); - - // 计算最大深度 - int maxDepth = calculateMaxDepth(jsonData); - - // 创建标题行 - for (int i = 0; i <= maxDepth; i++) { - sheet.createRow(i); - } - - // 递归构建表头 - int[] currentCol = {0}; - for (JsonNode node : jsonData) { - buildHeader(sheet, node, 0, currentCol); - } - return workbook; - } - - private static int calculateMaxDepth(JsonNode nodes) { - int maxDepth = 0; - for (JsonNode node : nodes) { - if (node.has("children")) { - int childDepth = calculateMaxDepth(node.get("children")); - maxDepth = Math.max(maxDepth, childDepth + 1); - } - } - return maxDepth; - } - - private static void buildHeader(Sheet sheet, JsonNode node, - int depth, int[] currentCol) { - Row row = sheet.getRow(depth); - Cell cell = row.createCell(currentCol[0]); - cell.setCellValue(node.get("label").asText()); - - int startCol = currentCol[0]; - - if (node.has("children")) { - Iterator children = node.get("children").elements(); - while (children.hasNext()) { - buildHeader(sheet, children.next(), depth + 1, currentCol); - } - - // 合并父单元格 - if (currentCol[0] - startCol > 1) { - sheet.addMergedRegion(new CellRangeAddress( - depth, depth, - startCol, currentCol[0] - 1 - )); - } - } else { - currentCol[0]++; - } - } - - - public static void main(String[] args) { - String json = "[{\"children\":[{\"name\":\"khdx\",\"label\":\"单位\"},{\"children\":[{\"children\":[{\"name\":\"khx1\",\"label\":\"政治建设\"},{\"name\":\"khx1_zb\",\"label\":\"占比\"},{\"name\":\"khx2\",\"label\":\"宣传与思想政治工作\"},{\"name\":\"khx2_zb\",\"label\":\"占比\"},{\"name\":\"khx3\",\"label\":\"作风纪律\"},{\"name\":\"khx3_zb\",\"label\":\"占比\"},{\"name\":\"khx4\",\"label\":\"安全稳定\"},{\"name\":\"khx4_zb\",\"label\":\"占比\"},{\"name\":\"khx5\",\"label\":\"师资队伍与师德师风\"},{\"name\":\"khx5_zb\",\"label\":\"占比\"},{\"name\":\"khx6\",\"label\":\"财务工作\"},{\"name\":\"khx6_zb\",\"label\":\"占比\"},{\"name\":\"khx7\",\"label\":\"依法治校与综合治理\"},{\"name\":\"khx7_zb\",\"label\":\"占比\"},{\"name\":\"khx8\",\"label\":\"国有资产管理\"},{\"name\":\"khx8_zb\",\"label\":\"占比\"},{\"name\":\"khx9\",\"label\":\"实验室管理\"},{\"name\":\"khx9_zb\",\"label\":\"占比\"},{\"name\":\"khx10\",\"label\":\"招生就业与创新创业工作\"},{\"name\":\"khx10_zb\",\"label\":\"占比\"},{\"name\":\"khx11\",\"label\":\"对外交流与合作\"},{\"name\":\"khx11_zb\",\"label\":\"占比\"}],\"name\":\"djyxzmbrw\",\"label\":\"党建与行政目标任务\"},{\"name\":\"djyxzmbrw_df\",\"label\":\"得分\"},{\"name\":\"djyxzmbrw_zb\",\"label\":\"占比\"},{\"name\":\"djyxzmbrw_zsfs\",\"label\":\"折算分数\"},{\"children\":[{\"name\":\"khx1\",\"label\":\"教学工作\"},{\"name\":\"khx1_zb\",\"label\":\"占比\"},{\"name\":\"khx2\",\"label\":\"科研工作\"},{\"name\":\"khx2_zb\",\"label\":\"占比\"},{\"name\":\"khx3\",\"label\":\"学生工作\"},{\"name\":\"khx3_zb\",\"label\":\"占比\"}],\"name\":\"syfz\",\"label\":\"事业发展\"},{\"name\":\"syfz_df\",\"label\":\"得分\"},{\"name\":\"syfz_zb\",\"label\":\"占比\"},{\"name\":\"syfz_zsfs\",\"label\":\"折算分数\"}],\"name\":\"ejdwmbglyjxkhcj\",\"label\":\"二级单位目标管理与绩效考核成绩\"},{\"name\":\"ejdwmbglyjxkhcj_df\",\"label\":\"得分\"},{\"name\":\"ejdwmbglyjxkhcj_zb\",\"label\":\"占比\"},{\"name\":\"ejdwmbglyjxkhcj_zsfs\",\"label\":\"折算分数\"},{\"children\":[{\"children\":[{\"name\":\"optionA\",\"label\":\"优秀\"},{\"name\":\"optionB\",\"label\":\"合格\"},{\"name\":\"optionC\",\"label\":\"基本合格\"},{\"name\":\"optionD\",\"label\":\"不合格\"},{\"name\":\"avgScore\",\"label\":\"得分\"},{\"name\":\"percentage\",\"label\":\"占比\"}],\"name\":\"khx1\",\"label\":\"师院领导班子\"},{\"children\":[{\"name\":\"optionA\",\"label\":\"优秀\"},{\"name\":\"optionB\",\"label\":\"合格\"},{\"name\":\"optionC\",\"label\":\"基本合格\"},{\"name\":\"optionD\",\"label\":\"不合格\"},{\"name\":\"avgScore\",\"label\":\"得分\"},{\"name\":\"percentage\",\"label\":\"占比\"}],\"name\":\"khx2\",\"label\":\"师院处级领导干部\"},{\"children\":[{\"name\":\"optionA\",\"label\":\"优秀\"},{\"name\":\"optionB\",\"label\":\"合格\"},{\"name\":\"optionC\",\"label\":\"基本合格\"},{\"name\":\"optionD\",\"label\":\"不合格\"},{\"name\":\"avgScore\",\"label\":\"得分\"},{\"name\":\"percentage\",\"label\":\"占比\"}],\"name\":\"khx3\",\"label\":\"服务对象代表\"}],\"name\":\"mzcp\",\"label\":\"民主测评\"},{\"name\":\"mzcp_df\",\"label\":\"得分\"},{\"name\":\"mzcp_zb\",\"label\":\"占比\"},{\"name\":\"mzcp_zsfs\",\"label\":\"折算分数\"},{\"children\":[{\"name\":\"khx1\",\"label\":\"分数 (满分10分)\"}],\"name\":\"tscx\",\"label\":\"特色创新\"},{\"name\":\"tscx_df\",\"label\":\"得分\"},{\"children\":[{\"name\":\"khx1\",\"label\":\"分数 (加减分项,值域可以为负)\"}],\"name\":\"zhpj\",\"label\":\"综合评价\"},{\"name\":\"zhpj_df\",\"label\":\"得分\"},{\"name\":\"jxdwldbzkhzf_df\",\"label\":\"总分\"}],\"name\":\"jxdwldbzkhzf\",\"label\":\"教学单位领导班子考核总分\"}]"; // 替换为实际JSON字符串 - //String json ="[{\"label\":\"基本信息\",\"children\":[{\"label\":\"个人信息\",\"children\":[{\"label\":\"姓名\"},{\"label\":\"年龄\"},{\"label\":\"性别\"}]},{\"label\":\"联系方式\",\"children\":[{\"label\":\"手机\"},{\"label\":\"邮箱\"}]}]},{\"label\":\"教育背景\",\"children\":[{\"label\":\"学历\",\"children\":[{\"label\":\"学校名称\"},{\"label\":\"专业\"},{\"label\":\"入学时间\"},{\"label\":\"毕业时间\"}]},{\"label\":\"证书\",\"children\":[{\"label\":\"证书名称\"},{\"label\":\"获得时间\"}]}]},{\"label\":\"工作经历\",\"children\":[{\"label\":\"公司A\",\"children\":[{\"label\":\"职位\"},{\"label\":\"在职时间\"},{\"label\":\"工作内容\"}]},{\"label\":\"公司B\",\"children\":[{\"label\":\"职位\"},{\"label\":\"在职时间\"},{\"label\":\"工作内容\"}]}]},{\"label\":\"技能评价\",\"children\":[{\"label\":\"技术技能\"},{\"label\":\"语言能力\"},{\"label\":\"综合评分\"}]}]"; - try { - Workbook workbook =export(new ObjectMapper().readTree(json)); - try (FileOutputStream out = new FileOutputStream("output.xlsx")) { - workbook.write(out); - System.out.println("ok"); - } - } catch (Exception e) { - e.printStackTrace(); - } - } -} diff --git a/考核结果.xlsx b/考核结果.xlsx new file mode 100644 index 0000000..6411406 Binary files /dev/null and b/考核结果.xlsx differ diff --git a/考核结果1.xlsx b/考核结果1.xlsx new file mode 100644 index 0000000..35d729b Binary files /dev/null and b/考核结果1.xlsx differ