diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 72d888f..b266507 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -118,6 +118,16 @@ javax.servlet javax.servlet-api + 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 20060cb..0309a22 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 @@ -1,5 +1,6 @@ package com.ruoyi.kaohe.controller; +import java.io.IOException; import java.math.BigDecimal; import java.util.*; import javax.servlet.http.HttpServletResponse; @@ -9,6 +10,7 @@ import com.ruoyi.kaohe.domain.KhKhrwResult; import com.ruoyi.kaohe.service.IKhKhrwResultService; import com.ruoyi.kaohe.service.IKhVoteEmpService; import com.ruoyi.kaohe.service.IKhVoteService; +import com.ruoyi.kaohe.util.EnhancedJsonExporter; import com.ruoyi.kaohe.util.JsonDeepMerge; import com.ruoyi.kaohe.util.PinYinUtil; import org.json.JSONArray; @@ -97,6 +99,16 @@ public class KhGatherController extends BaseController { tabledata.putAll(hz_df); //根据被考核对象名分组数据到map中 得到表格内容的最终数据 JSONArray endTableData = JsonDeepMerge.mergeByKey(tabledata, "khdx"); + //把数据结果中的khdx这个键值对———放到汇总主题拼音的key值里面 + for (Object endData : endTableData) { + JSONObject jsonData = (JSONObject) endData; + String khdx = jsonData.getString("khdx"); + JSONObject hzData = jsonData.getJSONObject(pyhz_name); + hzData.put("khdx",khdx); + jsonData.remove("khdx"); + jsonData.put(pyhz_name,hzData); + endData=jsonData; + } KhGather gather = new KhGather(); gather.setHzName(hz_name); @@ -117,7 +129,6 @@ public class KhGatherController extends BaseController { private Map parseJson(JSONArray datas, String titleP, BigDecimal z_zb) throws JsonProcessingException { Map result = new HashMap<>(); - JSONArray hz_df = new JSONArray();//存储标题占比时的得分 JSONArray title_df = new JSONArray();//处理标题占比时的得分 String pyTitle = PinYinUtil.getPinyinInitials(titleP);//父级表头 JSONObject btKhdx = new JSONObject(true); //表头考核对象存储 @@ -311,13 +322,21 @@ public class KhGatherController extends BaseController { /** * 导出生成汇总列表 */ - @PreAuthorize("@ss.hasPermi('kaohe:gather:export')") + /*@PreAuthorize("@ss.hasPermi('kaohe:gather:export')") @Log(title = "生成汇总", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, KhGather khGather) { List list = khGatherService.selectKhGatherList(khGather); ExcelUtil util = new ExcelUtil(KhGather.class); util.exportExcel(response, list, "生成汇总数据"); + }*/ + @PreAuthorize("@ss.hasPermi('kaohe:gather:export')") + @Log(title = "生成汇总", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, Long id) throws Exception { + KhGather gather = khGatherService.selectKhGatherById(id); + String tableHeader = gather.getTableHeader(); + // EnhancedJsonExporter.export(tableHeader,"生成汇总数据.xlsx"); } /** 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 new file mode 100644 index 0000000..e173900 --- /dev/null +++ b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/util/EnhancedJsonExporter.java @@ -0,0 +1,279 @@ +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.FileOutputStream; +import java.util.*; + +public class EnhancedJsonExporter { + private static final ObjectMapper mapper = new ObjectMapper(); + + static class HeaderNode { + String name; + String label; + int level; + int startCol; + int span; + List children = new ArrayList<>(); + } + + public static void exportWithMergedHeader(String jsonStr,String jsonData, String outputPath) throws Exception { + JsonNode rootNode = mapper.readTree(jsonStr); + JsonNode dataNode = mapper.readTree(jsonData); + Workbook workbook = new XSSFWorkbook(); + Sheet sheet = workbook.createSheet("sheet1"); + + //获取标题样式 + CellStyle headStyle = getStyle(workbook); + + // 构建表头树 + HeaderNode rootHeader = buildHeaderTree(rootNode, 0); + + // 计算列位置和跨度 + calculateHeaderLayout(rootHeader, 0); + + // 创建合并表头 + createMergedHeaderRows(sheet, rootHeader, headStyle); + + // 填充数据 + fillDataRows(sheet, dataNode, rootHeader,headStyle);//rootNode改为实际数据dataNode + + // 自适应列宽 + autoSizeColumns(sheet, rootHeader.span); + + // 添加边框 + addBordersWithMergedRegions(sheet); + + // 输出文件 + try (FileOutputStream fos = new FileOutputStream(outputPath)) { + workbook.write(fos); + } + } + + private static HeaderNode buildHeaderTree(JsonNode node, int curLevel) { + HeaderNode root = new HeaderNode(); + if (node.isArray()) { + for (JsonNode child : node) { + root.children.add(buildHeaderTree(child, curLevel)); + } + return root; + } + + HeaderNode current = new HeaderNode(); + current.level = curLevel; + current.name = node.path("name").asText(); + current.label = node.path("label").asText(); + + if (node.has("children")) { + for (JsonNode child : node.path("children")) { + HeaderNode childNode = buildHeaderTree(child, curLevel + 1); + childNode.level = current.level + 1; + current.children.add(childNode); + } + } + return current; + } + + private static int calculateHeaderLayout(HeaderNode node, int startCol) { + if (node.children.isEmpty()) { + node.startCol = startCol; + node.span = 1; + return startCol + 1; + } + + int currentCol = startCol; + for (HeaderNode child : node.children) { + currentCol = calculateHeaderLayout(child, currentCol); + } + node.startCol = node.children.get(0).startCol; + node.span = currentCol - startCol; + return currentCol; + } + + private static int getMaxDepth(HeaderNode node) { + int max = node.level; + for (HeaderNode child : node.children) { + max = Math.max(max, getMaxDepth(child)); + } + return max; + } + + private static void createMergedHeaderRows(Sheet sheet, HeaderNode root, CellStyle headStyle) { + int maxDepth = getMaxDepth(root); + for (int level = 0; level <= maxDepth; level++) { + Row row = sheet.createRow(level); + createHeaderRow(sheet, row, root, level, headStyle, getMaxDepth(root)); + } + } + + //创建标题行 + private static void createHeaderRow(Sheet sheet, Row row, HeaderNode node, int targetLevel, CellStyle headStyle, int maxLevel) { + if (node.name!=null&&node.level == targetLevel) { + Cell cell = row.createCell(node.startCol); + cell.setCellValue(node.label); + cell.setCellStyle(headStyle); + // 列合并处理 + if (node.span > 1) { + sheet.addMergedRegion(new CellRangeAddress( + row.getRowNum(), row.getRowNum(), + node.startCol, node.startCol + node.span - 1 + )); + } + // 行合并(关键改进点) + if (shouldMergeRows(node, maxLevel)) { + sheet.addMergedRegion(new CellRangeAddress( + row.getRowNum(), maxLevel, + node.startCol, node.startCol + )); + } + return; + } + for (HeaderNode child : node.children) { + createHeaderRow(sheet, row, child, targetLevel, headStyle, maxLevel); + } + } + + private static boolean shouldMergeRows(HeaderNode node, int maxLevel) { + // 当前节点没有子节点 且 不是最后一级 + return node.children.isEmpty() && node.level < maxLevel; + } + + //设置字体样式 + private static CellStyle getStyle(Workbook workbook) { + CellStyle style = workbook.createCellStyle(); + style.setWrapText(true); // 启用自动换行 + // 设置水平居中 + style.setAlignment(HorizontalAlignment.CENTER); + // 设置垂直居中 + style.setVerticalAlignment(VerticalAlignment.CENTER); + Font font = workbook.createFont(); + // 设置加粗 + // font.setBold(true); + // 设置字号 + font.setFontHeightInPoints((short) 12); + //设置字体 + // font.setFontName("宋体"); + // 将字体应用到样式 + style.setFont(font); + return style; + } + + private static void fillDataRows(Sheet sheet, JsonNode dataNode, HeaderNode header, CellStyle style) { + if (!dataNode.isArray()) return; + int startRow = getMaxDepth(header) + 1; + for (int i = 0; i < dataNode.size(); i++) { + Row row = sheet.createRow(startRow + i); + fillRowData(row, dataNode.get(i), header, style); + } + } + + private static void fillRowData(Row row, JsonNode data, HeaderNode header, CellStyle style) { + if (header.children.isEmpty()) { + if (data.has(header.name)) { + Cell cell = row.createCell(header.startCol); + cell.setCellValue(data.get(header.name).asText()); + cell.setCellStyle(style); + } + return; + } + + for (HeaderNode child : header.children) { + if (header.name!=null&&data.has(header.name)) { + data=data.get(header.name); + } + fillRowData(row, data, child, style); + } + } + + + private static void autoSizeColumns(Sheet sheet, int columnCount) { + for (int i = 0; i < columnCount; i++) { + sheet.autoSizeColumn(i, true); + // sheet.setColumnWidth(i, sheet.getColumnWidth(i) + 6 * 256); //中文自动列宽不准确,这里4*256 代表额外增加4个中文字符宽度 + sheet.setColumnWidth(i, sheet.getColumnWidth(i)); + } + } + + public static void addBordersWithMergedRegions(Sheet sheet) { + // 创建细线边框样式 + CellStyle borderStyle = createBorderStyle(sheet.getWorkbook()); + + // 先处理合并区域边框 + for (int i = 0; i < sheet.getNumMergedRegions(); i++) { + CellRangeAddress region = sheet.getMergedRegion(i); + applyBorderToMergedRegion(sheet, region, borderStyle); + } + + // 再处理普通单元格边框 + for (Row row : sheet) { + for (Cell cell : row) { + if (!isInMergedRegion(cell, sheet)) { + applyBorderToCell(cell, borderStyle); + } + } + } + } + + private static CellStyle createBorderStyle(Workbook workbook) { + CellStyle style = workbook.createCellStyle(); + style.setBorderTop(BorderStyle.THIN); + style.setBorderBottom(BorderStyle.THIN); + style.setBorderLeft(BorderStyle.THIN); + style.setBorderRight(BorderStyle.THIN); + return style; + } + + private static void applyBorderToMergedRegion(Sheet sheet, + CellRangeAddress region, CellStyle style) { + for (int rowNum = region.getFirstRow(); rowNum <= region.getLastRow(); rowNum++) { + Row row = sheet.getRow(rowNum) != null ? sheet.getRow(rowNum) : sheet.createRow(rowNum); + for (int colNum = region.getFirstColumn(); colNum <= region.getLastColumn(); colNum++) { + Cell cell = row.getCell(colNum) != null ? row.getCell(colNum) : row.createCell(colNum); + CellStyle newStyle = sheet.getWorkbook().createCellStyle(); + newStyle.cloneStyleFrom(cell.getCellStyle()); + newStyle.setBorderTop(BorderStyle.THIN); + newStyle.setBorderBottom(BorderStyle.THIN); + newStyle.setBorderLeft(BorderStyle.THIN); + newStyle.setBorderRight(BorderStyle.THIN); + cell.setCellStyle(newStyle); + } + } + } + + private static boolean isInMergedRegion(Cell cell, Sheet sheet) { + for (int i = 0; i < sheet.getNumMergedRegions(); i++) { + CellRangeAddress region = sheet.getMergedRegion(i); + if (region.isInRange(cell.getRowIndex(), cell.getColumnIndex())) { + return true; + } + } + return false; + } + + private static void applyBorderToCell(Cell cell, CellStyle style) { + CellStyle newStyle = cell.getSheet().getWorkbook().createCellStyle(); + newStyle.cloneStyleFrom(cell.getCellStyle()); + newStyle.setBorderTop(style.getBorderTop()); + newStyle.setBorderBottom(style.getBorderBottom()); + newStyle.setBorderLeft(style.getBorderLeft()); + newStyle.setBorderRight(style.getBorderRight()); + cell.setCellStyle(newStyle); + } + + public static void main(String[] args) { + String jsonHead = "[{\"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\":\"ejbt\",\"label\":\"二级标题\"},{\"name\":\"ejbt_df\",\"label\":\"得分\"},{\"name\":\"ejbt_zb\",\"label\":\"占比\"},{\"name\":\"ejbt_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\":\"得分\"},{\"name\":\"tscx_zb\",\"label\":\"占比\"},{\"name\":\"tscx_zsfs\",\"label\":\"折算分数\"},{\"name\":\"cssj1_df\",\"label\":\"总分\"}],\"name\":\"cssj1\",\"label\":\"测试数据1\"}]"; // 替换为实际JSON字符串 + String jsonData = "[{\"cssj1\":{\"ejbt_zb\":0.1,\"tscx\":{\"khx1\":10},\"khdx\":\"物理科学与技术学院\",\"mzcp_zsfs\":73.6,\"tscx_zb\":0.1,\"mzcp\":{\"khx1\":{\"avgScore\":100,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":1,\"optionB\":0},\"khx2\":{\"avgScore\":100,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":1,\"optionB\":0},\"khx3\":{\"avgScore\":80,\"percentage\":0.4,\"optionC\":0,\"optionD\":0,\"optionA\":0,\"optionB\":2}},\"ejbt_zsfs\":9.8866,\"mzcp_zb\":0.8,\"tscx_df\":10,\"ejbt_df\":98.866,\"ejbt\":{\"syfz_zb\":0.9,\"syfz_zsfs\":89.001,\"djyxzmbrw_df\":98.65,\"djyxzmbrw\":{\"khx9_zb\":0.03,\"khx8_zb\":0.02,\"khx7_zb\":0.05,\"khx1\":100,\"khx2\":100,\"khx4_zb\":0.1,\"khx5\":90,\"khx3_zb\":0.1,\"khx6\":100,\"khx3\":100,\"khx5_zb\":0.1,\"khx4\":100,\"khx6_zb\":0.1,\"khx9\":90,\"khx7\":99,\"khx10\":100,\"khx8\":100,\"khx11\":100,\"khx1_zb\":0.2,\"khx2_zb\":0.1,\"khx10_zb\":0.1,\"khx11_zb\":0.1},\"djyxzmbrw_zb\":0.1,\"djyxzmbrw_zsfs\":9.865,\"syfz_df\":98.89,\"syfz\":{\"khx1\":100,\"khx1_zb\":0.5,\"khx2\":98,\"khx2_zb\":0.28,\"khx3_zb\":0.22,\"khx3\":97.5}},\"mzcp_df\":92,\"tscx_zsfs\":1,\"cssj1_df\":84.4866}},{\"cssj1\":{\"ejbt_zb\":0.1,\"tscx\":{\"khx1\":10},\"khdx\":\"体育系\",\"mzcp_zsfs\":65.6,\"tscx_zb\":0.1,\"mzcp\":{\"khx1\":{\"avgScore\":80,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":0,\"optionB\":1},\"khx2\":{\"avgScore\":60,\"percentage\":0.3,\"optionC\":1,\"optionD\":0,\"optionA\":0,\"optionB\":0},\"khx3\":{\"avgScore\":100,\"percentage\":0.4,\"optionC\":0,\"optionD\":0,\"optionA\":2,\"optionB\":0}},\"ejbt_zsfs\":9.3547,\"mzcp_zb\":0.8,\"tscx_df\":10,\"ejbt_df\":93.547,\"ejbt\":{\"syfz_zb\":0.9,\"syfz_zsfs\":83.997,\"djyxzmbrw_df\":95.5,\"djyxzmbrw\":{\"khx9_zb\":0.03,\"khx8_zb\":0.02,\"khx7_zb\":0.05,\"khx1\":85,\"khx2\":100,\"khx4_zb\":0.1,\"khx5\":100,\"khx3_zb\":0.1,\"khx6\":100,\"khx3\":98,\"khx5_zb\":0.1,\"khx4\":100,\"khx6_zb\":0.1,\"khx9\":90,\"khx7\":100,\"khx10\":100,\"khx8\":100,\"khx11\":90,\"khx1_zb\":0.2,\"khx2_zb\":0.1,\"khx10_zb\":0.1,\"khx11_zb\":0.1},\"djyxzmbrw_zb\":0.1,\"djyxzmbrw_zsfs\":9.55,\"syfz_df\":93.33,\"syfz\":{\"khx1\":89,\"khx1_zb\":0.5,\"khx2\":97,\"khx2_zb\":0.28,\"khx3_zb\":0.22,\"khx3\":98.5}},\"mzcp_df\":82,\"tscx_zsfs\":1,\"cssj1_df\":75.9547}},{\"cssj1\":{\"ejbt_zb\":0.1,\"tscx\":{\"khx1\":10},\"khdx\":\"外国语学院\",\"mzcp_zsfs\":75.2,\"tscx_zb\":0.1,\"mzcp\":{\"khx1\":{\"avgScore\":80,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":0,\"optionB\":1},\"khx2\":{\"avgScore\":100,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":1,\"optionB\":0},\"khx3\":{\"avgScore\":100,\"percentage\":0.4,\"optionC\":0,\"optionD\":0,\"optionA\":2,\"optionB\":0}},\"ejbt_zsfs\":9.8069,\"mzcp_zb\":0.8,\"tscx_df\":10,\"ejbt_df\":98.069,\"ejbt\":{\"syfz_zb\":0.9,\"syfz_zsfs\":88.605,\"djyxzmbrw_df\":94.64,\"djyxzmbrw\":{\"khx9_zb\":0.03,\"khx8_zb\":0.02,\"khx7_zb\":0.05,\"khx1\":90,\"khx2\":100,\"khx4_zb\":0.1,\"khx5\":100,\"khx3_zb\":0.1,\"khx6\":96,\"khx3\":90,\"khx5_zb\":0.1,\"khx4\":100,\"khx6_zb\":0.1,\"khx9\":90,\"khx7\":90,\"khx10\":100,\"khx8\":97,\"khx11\":89,\"khx1_zb\":0.2,\"khx2_zb\":0.1,\"khx10_zb\":0.1,\"khx11_zb\":0.1},\"djyxzmbrw_zb\":0.1,\"djyxzmbrw_zsfs\":9.464,\"syfz_df\":98.45,\"syfz\":{\"khx1\":100,\"khx1_zb\":0.5,\"khx2\":98,\"khx2_zb\":0.28,\"khx3_zb\":0.22,\"khx3\":95.5}},\"mzcp_df\":94,\"tscx_zsfs\":1,\"cssj1_df\":86.0069}},{\"cssj1\":{\"ejbt_zb\":0.1,\"tscx\":{\"khx1\":7.5},\"khdx\":\"生命科学系\",\"mzcp_zsfs\":68.8,\"tscx_zb\":0.1,\"mzcp\":{\"khx1\":{\"avgScore\":100,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":1,\"optionB\":0},\"khx2\":{\"avgScore\":80,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":0,\"optionB\":1},\"khx3\":{\"avgScore\":80,\"percentage\":0.4,\"optionC\":1,\"optionD\":0,\"optionA\":1,\"optionB\":0}},\"ejbt_zsfs\":9.7226,\"mzcp_zb\":0.8,\"tscx_df\":7.5,\"ejbt_df\":97.226,\"ejbt\":{\"syfz_zb\":0.9,\"syfz_zsfs\":87.453,\"djyxzmbrw_df\":97.73,\"djyxzmbrw\":{\"khx9_zb\":0.03,\"khx8_zb\":0.02,\"khx7_zb\":0.05,\"khx1\":96,\"khx2\":100,\"khx4_zb\":0.1,\"khx5\":100,\"khx3_zb\":0.1,\"khx6\":99,\"khx3\":99,\"khx5_zb\":0.1,\"khx4\":100,\"khx6_zb\":0.1,\"khx9\":90,\"khx7\":99,\"khx10\":96,\"khx8\":99,\"khx11\":95,\"khx1_zb\":0.2,\"khx2_zb\":0.1,\"khx10_zb\":0.1,\"khx11_zb\":0.1},\"djyxzmbrw_zb\":0.1,\"djyxzmbrw_zsfs\":9.773,\"syfz_df\":97.17,\"syfz\":{\"khx1\":95,\"khx1_zb\":0.5,\"khx2\":100,\"khx2_zb\":0.28,\"khx3_zb\":0.22,\"khx3\":98.5}},\"mzcp_df\":86,\"tscx_zsfs\":0.75,\"cssj1_df\":79.2726}},{\"cssj1\":{\"ejbt_zb\":0.1,\"tscx\":{\"khx1\":10},\"khdx\":\"化学系\",\"mzcp_zsfs\":73.6,\"tscx_zb\":0.1,\"mzcp\":{\"khx1\":{\"avgScore\":100,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":1,\"optionB\":0},\"khx2\":{\"avgScore\":100,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":1,\"optionB\":0},\"khx3\":{\"avgScore\":80,\"percentage\":0.4,\"optionC\":0,\"optionD\":0,\"optionA\":0,\"optionB\":2}},\"ejbt_zsfs\":9.2434,\"mzcp_zb\":0.8,\"tscx_df\":10,\"ejbt_df\":92.434,\"ejbt\":{\"syfz_zb\":0.9,\"syfz_zsfs\":82.899,\"djyxzmbrw_df\":95.35,\"djyxzmbrw\":{\"khx9_zb\":0.03,\"khx8_zb\":0.02,\"khx7_zb\":0.05,\"khx1\":86,\"khx2\":100,\"khx4_zb\":0.1,\"khx5\":100,\"khx3_zb\":0.1,\"khx6\":99,\"khx3\":94,\"khx5_zb\":0.1,\"khx4\":100,\"khx6_zb\":0.1,\"khx9\":90,\"khx7\":99,\"khx10\":100,\"khx8\":100,\"khx11\":92,\"khx1_zb\":0.2,\"khx2_zb\":0.1,\"khx10_zb\":0.1,\"khx11_zb\":0.1},\"djyxzmbrw_zb\":0.1,\"djyxzmbrw_zsfs\":9.535,\"syfz_df\":92.11,\"syfz\":{\"khx1\":87,\"khx1_zb\":0.5,\"khx2\":97,\"khx2_zb\":0.28,\"khx3_zb\":0.22,\"khx3\":97.5}},\"mzcp_df\":92,\"tscx_zsfs\":1,\"cssj1_df\":83.8434}},{\"cssj1\":{\"ejbt_zb\":0.1,\"tscx\":{\"khx1\":7.5},\"khdx\":\"文学院\",\"mzcp_zsfs\":70.4,\"tscx_zb\":0.1,\"mzcp\":{\"khx1\":{\"avgScore\":80,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":0,\"optionB\":1},\"khx2\":{\"avgScore\":80,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":0,\"optionB\":1},\"khx3\":{\"avgScore\":100,\"percentage\":0.4,\"optionC\":0,\"optionD\":0,\"optionA\":2,\"optionB\":0}},\"ejbt_zsfs\":9.0252,\"mzcp_zb\":0.8,\"tscx_df\":7.5,\"ejbt_df\":90.252,\"ejbt\":{\"syfz_zb\":0.9,\"syfz_zsfs\":80.604,\"djyxzmbrw_df\":96.48,\"djyxzmbrw\":{\"khx9_zb\":0.03,\"khx8_zb\":0.02,\"khx7_zb\":0.05,\"khx1\":90,\"khx2\":100,\"khx4_zb\":0.1,\"khx5\":100,\"khx3_zb\":0.1,\"khx6\":100,\"khx3\":99,\"khx5_zb\":0.1,\"khx4\":100,\"khx6_zb\":0.1,\"khx9\":90,\"khx7\":90,\"khx10\":100,\"khx8\":99,\"khx11\":94,\"khx1_zb\":0.2,\"khx2_zb\":0.1,\"khx10_zb\":0.1,\"khx11_zb\":0.1},\"djyxzmbrw_zb\":0.1,\"djyxzmbrw_zsfs\":9.648,\"syfz_df\":89.56,\"syfz\":{\"khx1\":83,\"khx1_zb\":0.5,\"khx2\":97,\"khx2_zb\":0.28,\"khx3_zb\":0.22,\"khx3\":95}},\"mzcp_df\":88,\"tscx_zsfs\":0.75,\"cssj1_df\":80.1752}},{\"cssj1\":{\"ejbt_zb\":0.1,\"tscx\":{\"khx1\":10},\"khdx\":\"继续教育学院\",\"mzcp_zsfs\":80,\"tscx_zb\":0.1,\"mzcp\":{\"khx1\":{\"avgScore\":100,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":1,\"optionB\":0},\"khx2\":{\"avgScore\":100,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":1,\"optionB\":0},\"khx3\":{\"avgScore\":100,\"percentage\":0.4,\"optionC\":0,\"optionD\":0,\"optionA\":2,\"optionB\":0}},\"ejbt_zsfs\":8.8449,\"mzcp_zb\":0.8,\"tscx_df\":10,\"ejbt_df\":88.449,\"ejbt\":{\"syfz_zb\":0.9,\"syfz_zsfs\":78.759,\"djyxzmbrw_df\":96.9,\"djyxzmbrw\":{\"khx9_zb\":0.03,\"khx8_zb\":0.02,\"khx7_zb\":0.05,\"khx1\":90,\"khx2\":100,\"khx4_zb\":0.1,\"khx5\":100,\"khx3_zb\":0.1,\"khx6\":99,\"khx3\":98,\"khx5_zb\":0.1,\"khx4\":100,\"khx6_zb\":0.1,\"khx9\":90,\"khx7\":100,\"khx10\":100,\"khx8\":100,\"khx11\":95,\"khx1_zb\":0.2,\"khx2_zb\":0.1,\"khx10_zb\":0.1,\"khx11_zb\":0.1},\"djyxzmbrw_zb\":0.1,\"djyxzmbrw_zsfs\":9.69,\"syfz_df\":87.51,\"syfz\":{\"khx1\":80,\"khx1_zb\":0.5,\"khx2\":97,\"khx2_zb\":0.28,\"khx3_zb\":0.22,\"khx3\":92.5}},\"mzcp_df\":100,\"tscx_zsfs\":1,\"cssj1_df\":89.8449}},{\"cssj1\":{\"ejbt_zb\":0.1,\"tscx\":{\"khx1\":10},\"khdx\":\"教育学院\",\"mzcp_zsfs\":64,\"tscx_zb\":0.1,\"mzcp\":{\"khx1\":{\"avgScore\":80,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":0,\"optionB\":1},\"khx2\":{\"avgScore\":80,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":0,\"optionB\":1},\"khx3\":{\"avgScore\":80,\"percentage\":0.4,\"optionC\":0,\"optionD\":0,\"optionA\":0,\"optionB\":2}},\"ejbt_zsfs\":9.4026,\"mzcp_zb\":0.8,\"tscx_df\":10,\"ejbt_df\":94.026,\"ejbt\":{\"syfz_zb\":0.9,\"syfz_zsfs\":84.546,\"djyxzmbrw_df\":94.8,\"djyxzmbrw\":{\"khx9_zb\":0.03,\"khx8_zb\":0.02,\"khx7_zb\":0.05,\"khx1\":90,\"khx2\":100,\"khx4_zb\":0.1,\"khx5\":88,\"khx3_zb\":0.1,\"khx6\":93,\"khx3\":100,\"khx5_zb\":0.1,\"khx4\":100,\"khx6_zb\":0.1,\"khx9\":90,\"khx7\":100,\"khx10\":99,\"khx8\":100,\"khx11\":91,\"khx1_zb\":0.2,\"khx2_zb\":0.1,\"khx10_zb\":0.1,\"khx11_zb\":0.1},\"djyxzmbrw_zb\":0.1,\"djyxzmbrw_zsfs\":9.48,\"syfz_df\":93.94,\"syfz\":{\"khx1\":90,\"khx1_zb\":0.5,\"khx2\":97,\"khx2_zb\":0.28,\"khx3_zb\":0.22,\"khx3\":99}},\"mzcp_df\":80,\"tscx_zsfs\":1,\"cssj1_df\":74.4026}},{\"cssj1\":{\"ejbt_zb\":0.1,\"tscx\":{\"khx1\":10},\"khdx\":\"美术学院\",\"mzcp_zsfs\":73.6,\"tscx_zb\":0.1,\"mzcp\":{\"khx1\":{\"avgScore\":100,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":1,\"optionB\":0},\"khx2\":{\"avgScore\":100,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":1,\"optionB\":0},\"khx3\":{\"avgScore\":80,\"percentage\":0.4,\"optionC\":0,\"optionD\":0,\"optionA\":0,\"optionB\":2}},\"ejbt_zsfs\":8.9429,\"mzcp_zb\":0.8,\"tscx_df\":10,\"ejbt_df\":89.429,\"ejbt\":{\"syfz_zb\":0.9,\"syfz_zsfs\":79.749,\"djyxzmbrw_df\":96.8,\"djyxzmbrw\":{\"khx9_zb\":0.03,\"khx8_zb\":0.02,\"khx7_zb\":0.05,\"khx1\":90,\"khx2\":100,\"khx4_zb\":0.1,\"khx5\":100,\"khx3_zb\":0.1,\"khx6\":99,\"khx3\":98,\"khx5_zb\":0.1,\"khx4\":100,\"khx6_zb\":0.1,\"khx9\":90,\"khx7\":100,\"khx10\":100,\"khx8\":100,\"khx11\":94,\"khx1_zb\":0.2,\"khx2_zb\":0.1,\"khx10_zb\":0.1,\"khx11_zb\":0.1},\"djyxzmbrw_zb\":0.1,\"djyxzmbrw_zsfs\":9.68,\"syfz_df\":88.61,\"syfz\":{\"khx1\":80,\"khx1_zb\":0.5,\"khx2\":97,\"khx2_zb\":0.28,\"khx3_zb\":0.22,\"khx3\":97.5}},\"mzcp_df\":92,\"tscx_zsfs\":1,\"cssj1_df\":83.5429}},{\"cssj1\":{\"ejbt_zb\":0.1,\"tscx\":{\"khx1\":10},\"khdx\":\"海洋学院\",\"mzcp_zsfs\":64,\"tscx_zb\":0.1,\"mzcp\":{\"khx1\":{\"avgScore\":80,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":0,\"optionB\":1},\"khx2\":{\"avgScore\":80,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":0,\"optionB\":1},\"khx3\":{\"avgScore\":80,\"percentage\":0.4,\"optionC\":0,\"optionD\":0,\"optionA\":0,\"optionB\":2}},\"ejbt_zsfs\":8.9428,\"mzcp_zb\":0.8,\"tscx_df\":10,\"ejbt_df\":89.428,\"ejbt\":{\"syfz_zb\":0.9,\"syfz_zsfs\":80.1,\"djyxzmbrw_df\":93.28,\"djyxzmbrw\":{\"khx9_zb\":0.03,\"khx8_zb\":0.02,\"khx7_zb\":0.05,\"khx1\":96,\"khx2\":100,\"khx4_zb\":0.1,\"khx5\":80,\"khx3_zb\":0.1,\"khx6\":90,\"khx3\":90,\"khx5_zb\":0.1,\"khx4\":100,\"khx6_zb\":0.1,\"khx9\":90,\"khx7\":100,\"khx10\":94,\"khx8\":99,\"khx11\":90,\"khx1_zb\":0.2,\"khx2_zb\":0.1,\"khx10_zb\":0.1,\"khx11_zb\":0.1},\"djyxzmbrw_zb\":0.1,\"djyxzmbrw_zsfs\":9.328,\"syfz_df\":89,\"syfz\":{\"khx1\":80,\"khx1_zb\":0.5,\"khx2\":98,\"khx2_zb\":0.28,\"khx3_zb\":0.22,\"khx3\":98}},\"mzcp_df\":80,\"tscx_zsfs\":1,\"cssj1_df\":73.9428}},{\"cssj1\":{\"ejbt_zb\":0.1,\"tscx\":{\"khx1\":9},\"khdx\":\"音乐系\",\"mzcp_zsfs\":75.2,\"tscx_zb\":0.1,\"mzcp\":{\"khx1\":{\"avgScore\":80,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":0,\"optionB\":1},\"khx2\":{\"avgScore\":100,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":1,\"optionB\":0},\"khx3\":{\"avgScore\":100,\"percentage\":0.4,\"optionC\":0,\"optionD\":0,\"optionA\":2,\"optionB\":0}},\"ejbt_zsfs\":8.8475,\"mzcp_zb\":0.8,\"tscx_df\":9,\"ejbt_df\":88.475,\"ejbt\":{\"syfz_zb\":0.9,\"syfz_zsfs\":78.912,\"djyxzmbrw_df\":95.63,\"djyxzmbrw\":{\"khx9_zb\":0.03,\"khx8_zb\":0.02,\"khx7_zb\":0.05,\"khx1\":90,\"khx2\":100,\"khx4_zb\":0.1,\"khx5\":100,\"khx3_zb\":0.1,\"khx6\":99,\"khx3\":97,\"khx5_zb\":0.1,\"khx4\":100,\"khx6_zb\":0.1,\"khx9\":90,\"khx7\":89,\"khx10\":100,\"khx8\":99,\"khx11\":89,\"khx1_zb\":0.2,\"khx2_zb\":0.1,\"khx10_zb\":0.1,\"khx11_zb\":0.1},\"djyxzmbrw_zb\":0.1,\"djyxzmbrw_zsfs\":9.563,\"syfz_df\":87.68,\"syfz\":{\"khx1\":80,\"khx1_zb\":0.5,\"khx2\":98,\"khx2_zb\":0.28,\"khx3_zb\":0.22,\"khx3\":92}},\"mzcp_df\":94,\"tscx_zsfs\":0.9,\"cssj1_df\":84.9475}},{\"cssj1\":{\"ejbt_zb\":0.1,\"tscx\":{\"khx1\":5},\"khdx\":\"历史文化与法学系\",\"mzcp_zsfs\":73.6,\"tscx_zb\":0.1,\"mzcp\":{\"khx1\":{\"avgScore\":100,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":1,\"optionB\":0},\"khx2\":{\"avgScore\":100,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":1,\"optionB\":0},\"khx3\":{\"avgScore\":80,\"percentage\":0.4,\"optionC\":0,\"optionD\":0,\"optionA\":0,\"optionB\":2}},\"ejbt_zsfs\":8.8914,\"mzcp_zb\":0.8,\"tscx_df\":5,\"ejbt_df\":88.914,\"ejbt\":{\"syfz_zb\":0.9,\"syfz_zsfs\":79.308,\"djyxzmbrw_df\":96.06,\"djyxzmbrw\":{\"khx9_zb\":0.03,\"khx8_zb\":0.02,\"khx7_zb\":0.05,\"khx1\":100,\"khx2\":100,\"khx4_zb\":0.1,\"khx5\":80,\"khx3_zb\":0.1,\"khx6\":99,\"khx3\":98,\"khx5_zb\":0.1,\"khx4\":100,\"khx6_zb\":0.1,\"khx9\":90,\"khx7\":96,\"khx10\":100,\"khx8\":93,\"khx11\":90,\"khx1_zb\":0.2,\"khx2_zb\":0.1,\"khx10_zb\":0.1,\"khx11_zb\":0.1},\"djyxzmbrw_zb\":0.1,\"djyxzmbrw_zsfs\":9.606,\"syfz_df\":88.12,\"syfz\":{\"khx1\":80,\"khx1_zb\":0.5,\"khx2\":98,\"khx2_zb\":0.28,\"khx3_zb\":0.22,\"khx3\":94}},\"mzcp_df\":92,\"tscx_zsfs\":0.5,\"cssj1_df\":82.9914}},{\"cssj1\":{\"ejbt_zb\":0.1,\"tscx\":{\"khx1\":10},\"khdx\":\"数学与计算科学学院\",\"mzcp_zsfs\":75.2,\"tscx_zb\":0.1,\"mzcp\":{\"khx1\":{\"avgScore\":80,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":0,\"optionB\":1},\"khx2\":{\"avgScore\":100,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":1,\"optionB\":0},\"khx3\":{\"avgScore\":100,\"percentage\":0.4,\"optionC\":0,\"optionD\":0,\"optionA\":2,\"optionB\":0}},\"ejbt_zsfs\":9.1797,\"mzcp_zb\":0.8,\"tscx_df\":10,\"ejbt_df\":91.797,\"ejbt\":{\"syfz_zb\":0.9,\"syfz_zsfs\":82.215,\"djyxzmbrw_df\":95.82,\"djyxzmbrw\":{\"khx9_zb\":0.03,\"khx8_zb\":0.02,\"khx7_zb\":0.05,\"khx1\":90,\"khx2\":100,\"khx4_zb\":0.1,\"khx5\":100,\"khx3_zb\":0.1,\"khx6\":100,\"khx3\":100,\"khx5_zb\":0.1,\"khx4\":100,\"khx6_zb\":0.1,\"khx9\":90,\"khx7\":96,\"khx10\":94,\"khx8\":96,\"khx11\":90,\"khx1_zb\":0.2,\"khx2_zb\":0.1,\"khx10_zb\":0.1,\"khx11_zb\":0.1},\"djyxzmbrw_zb\":0.1,\"djyxzmbrw_zsfs\":9.582,\"syfz_df\":91.35,\"syfz\":{\"khx1\":88,\"khx1_zb\":0.5,\"khx2\":98,\"khx2_zb\":0.28,\"khx3_zb\":0.22,\"khx3\":90.5}},\"mzcp_df\":94,\"tscx_zsfs\":1,\"cssj1_df\":85.3797}},{\"cssj1\":{\"ejbt_zb\":0.1,\"tscx\":{\"khx1\":10},\"khdx\":\"计算机科学技术系\",\"mzcp_zsfs\":64,\"tscx_zb\":0.1,\"mzcp\":{\"khx1\":{\"avgScore\":100,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":1,\"optionB\":0},\"khx2\":{\"avgScore\":60,\"percentage\":0.3,\"optionC\":1,\"optionD\":0,\"optionA\":0,\"optionB\":0},\"khx3\":{\"avgScore\":80,\"percentage\":0.4,\"optionC\":0,\"optionD\":0,\"optionA\":0,\"optionB\":2}},\"ejbt_zsfs\":8.9912,\"mzcp_zb\":0.8,\"tscx_df\":10,\"ejbt_df\":89.912,\"ejbt\":{\"syfz_zb\":0.9,\"syfz_zsfs\":80.298,\"djyxzmbrw_df\":96.14,\"djyxzmbrw\":{\"khx9_zb\":0.03,\"khx8_zb\":0.02,\"khx7_zb\":0.05,\"khx1\":90,\"khx2\":100,\"khx4_zb\":0.1,\"khx5\":100,\"khx3_zb\":0.1,\"khx6\":97,\"khx3\":98,\"khx5_zb\":0.1,\"khx4\":100,\"khx6_zb\":0.1,\"khx9\":100,\"khx7\":100,\"khx10\":100,\"khx8\":97,\"khx11\":87,\"khx1_zb\":0.2,\"khx2_zb\":0.1,\"khx10_zb\":0.1,\"khx11_zb\":0.1},\"djyxzmbrw_zb\":0.1,\"djyxzmbrw_zsfs\":9.614,\"syfz_df\":89.22,\"syfz\":{\"khx1\":80,\"khx1_zb\":0.5,\"khx2\":98,\"khx2_zb\":0.28,\"khx3_zb\":0.22,\"khx3\":99}},\"mzcp_df\":80,\"tscx_zsfs\":1,\"cssj1_df\":73.9912}},{\"cssj1\":{\"ejbt_zb\":0.1,\"tscx\":{\"khx1\":10},\"khdx\":\"资源管理系\",\"mzcp_zsfs\":68.8,\"tscx_zb\":0.1,\"mzcp\":{\"khx1\":{\"avgScore\":100,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":1,\"optionB\":0},\"khx2\":{\"avgScore\":80,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":0,\"optionB\":1},\"khx3\":{\"avgScore\":80,\"percentage\":0.4,\"optionC\":0,\"optionD\":0,\"optionA\":0,\"optionB\":2}},\"ejbt_zsfs\":9.5029,\"mzcp_zb\":0.8,\"tscx_df\":10,\"ejbt_df\":95.029,\"ejbt\":{\"syfz_zb\":0.9,\"syfz_zsfs\":85.536,\"djyxzmbrw_df\":94.93,\"djyxzmbrw\":{\"khx9_zb\":0.03,\"khx8_zb\":0.02,\"khx7_zb\":0.05,\"khx1\":88,\"khx2\":100,\"khx4_zb\":0.1,\"khx5\":100,\"khx3_zb\":0.1,\"khx6\":95,\"khx3\":98,\"khx5_zb\":0.1,\"khx4\":100,\"khx6_zb\":0.1,\"khx9\":90,\"khx7\":99,\"khx10\":100,\"khx8\":99,\"khx11\":84,\"khx1_zb\":0.2,\"khx2_zb\":0.1,\"khx10_zb\":0.1,\"khx11_zb\":0.1},\"djyxzmbrw_zb\":0.1,\"djyxzmbrw_zsfs\":9.493,\"syfz_df\":95.04,\"syfz\":{\"khx1\":99,\"khx1_zb\":0.5,\"khx2\":99,\"khx2_zb\":0.28,\"khx3_zb\":0.22,\"khx3\":81}},\"mzcp_df\":86,\"tscx_zsfs\":1,\"cssj1_df\":79.3029}},{\"cssj1\":{\"ejbt_zb\":0.1,\"tscx\":{\"khx1\":10},\"khdx\":\"马克思主义学院\",\"mzcp_zsfs\":73.6,\"tscx_zb\":0.1,\"mzcp\":{\"khx1\":{\"avgScore\":100,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":1,\"optionB\":0},\"khx2\":{\"avgScore\":100,\"percentage\":0.3,\"optionC\":0,\"optionD\":0,\"optionA\":1,\"optionB\":0},\"khx3\":{\"avgScore\":80,\"percentage\":0.4,\"optionC\":0,\"optionD\":0,\"optionA\":0,\"optionB\":2}},\"ejbt_zsfs\":8.701,\"mzcp_zb\":0.8,\"tscx_df\":10,\"ejbt_df\":87.01,\"ejbt\":{\"syfz_zb\":0.9,\"syfz_zsfs\":77.49,\"djyxzmbrw_df\":95.2,\"djyxzmbrw\":{\"khx9_zb\":0.03,\"khx8_zb\":0.02,\"khx7_zb\":0.05,\"khx1\":90,\"khx2\":100,\"khx4_zb\":0.1,\"khx5\":100,\"khx3_zb\":0.1,\"khx6\":100,\"khx3\":94,\"khx5_zb\":0.1,\"khx4\":100,\"khx6_zb\":0.1,\"khx9\":90,\"khx7\":100,\"khx10\":97,\"khx8\":100,\"khx11\":84,\"khx1_zb\":0.2,\"khx2_zb\":0.1,\"khx10_zb\":0.1,\"khx11_zb\":0.1},\"djyxzmbrw_zb\":0.1,\"djyxzmbrw_zsfs\":9.52,\"syfz_df\":86.1,\"syfz\":{\"khx1\":80,\"khx1_zb\":0.5,\"khx2\":90,\"khx2_zb\":0.28,\"khx3_zb\":0.22,\"khx3\":95}},\"mzcp_df\":92,\"tscx_zsfs\":1,\"cssj1_df\":83.301}}]"; + // 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"); + System.out.println("导出成功"); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/util/JsonDeepMerge.java b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/util/JsonDeepMerge.java index b486dd4..fe25882 100644 --- a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/util/JsonDeepMerge.java +++ b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/util/JsonDeepMerge.java @@ -31,7 +31,7 @@ public class JsonDeepMerge { } } } - + //根据某个相同key值,整合其他相同层级的key数据到一起,然后返回新的JSONArray数据 public static JSONArray mergeByKey(JSONArray array, String mergeKey) { JSONArray result = new JSONArray(); for (int i = 0; i < array.length(); i++) { 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 new file mode 100644 index 0000000..4ca2777 --- /dev/null +++ b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/util/JsonToExcelExporter.java @@ -0,0 +1,85 @@ +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(); + } + } +}