From bd6742f4b6723c541fef91d0f0dc41f830ca0670 Mon Sep 17 00:00:00 2001 From: hshansha Date: Wed, 16 Jul 2025 09:21:12 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=B8=9A=E5=8A=A1=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E6=94=BE=E5=88=B0=E4=B8=9A=E5=8A=A1=E5=B1=82=E3=80=81=E8=AF=84?= =?UTF-8?q?=E5=88=86=E9=80=89=E9=A1=B9=E4=B8=AA=E9=80=89=E9=A1=B9=E8=AE=B0?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/KhKhrwResultController.java | 150 +--------------- .../kaohe/service/IKhKhrwResultService.java | 5 + .../service/impl/KhKhrwResultServiceImpl.java | 164 +++++++++++++++++- .../service/impl/KhVoteEmpServiceImpl.java | 4 + 4 files changed, 172 insertions(+), 151 deletions(-) diff --git a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/controller/KhKhrwResultController.java b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/controller/KhKhrwResultController.java index 623c28c..aed4af2 100644 --- a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/controller/KhKhrwResultController.java +++ b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/controller/KhKhrwResultController.java @@ -58,155 +58,7 @@ public class KhKhrwResultController extends BaseController { if(khKhrwResults!=null&&khKhrwResults.size()>0){ return AjaxResult.error("该考核任务已有生成结果!"); } - - /* JSONArray header = new JSONArray();//存放表头及表格关联数据 - JSONObject headerData = new JSONObject(); - headerData.put("name", null); - headerData.put("label", pc.getPcTitle());*/ - JSONArray children = new JSONArray(); - JSONObject tableColumn = new JSONObject(); - tableColumn.put("name", "khdx"); - if (pc.getBkhdxType().equals("0")) { - tableColumn.put("label", "单位"); - } else { - tableColumn.put("label", "姓名"); - } - children.add(tableColumn); - - JSONObject tableColumn2 = new JSONObject(); - String pyPCtitle = PinYinUtil.getPinyinInitials(pc.getPcTitle()); - tableColumn2.put("name", pyPCtitle); - tableColumn2.put("label", pc.getPcTitle()); - -//----------------------------------------------------------------------------------------- - - JSONArray endData = new JSONArray(); //存放表格数据 - List lists = new ArrayList<>(); - - KhVote khVote = new KhVote(); - khVote.setPingceId(pc.getId()); - //查询该考核任务下的所有评分任务 - List votes = khVoteService.selectKhVoteList(khVote); - for (KhVote vote : votes) { - KhVoteEmp khVoteEmp = new KhVoteEmp(); - khVoteEmp.setVoteId(vote.getId()); - //查询该评分任务对应的所有被考核对象详情 - List khVoteEmps = voteEmpService.selectKhVoteEmpList(khVoteEmp); - lists.addAll(khVoteEmps); - } - //根据被考核对象名分组数据到map中 - Map> khdxMap = lists.stream() - .collect(Collectors.groupingBy(KhVoteEmp::getBkhdxName, - LinkedHashMap::new, // 使用LinkedHashMap保持插入顺序(这对于键很重要) - Collectors.toList())); // 根据getBkhdxName分组*/lists.stream(). - //循环map得到对应数据 - Set>> entries = khdxMap.entrySet(); - Integer index1=0; - for (Map.Entry> entry : entries) { - index1++; - BigDecimal sumScore = BigDecimal.ZERO; - String key = entry.getKey(); - //获取表头数据 - List children2 = new ArrayList<>(); -//------------------------------------------------------------------------------------------------------ - - //获取表数据 - JSONObject pcdata = new JSONObject(); - List value = entry.getValue(); - JSONObject votesDatas = new JSONObject(); - Integer index2 = 0; - for (KhVoteEmp voteEmp : value) { - index2++; - JSONObject tabledata = new JSONObject(); - tabledata.put("name", "khx"+index2); - tabledata.put("label", voteEmp.getVoteTitle()); - - Object objectData; - //根据考核类型存储不同数据 - if (voteEmp.getKhitemTypeid().equals(1L)) { //评分选项 - KhXxpf xxpf = new KhXxpf(); - xxpf.setOptionA(voteEmp.getOptionA()); - xxpf.setOptionB(voteEmp.getOptionB()); - xxpf.setOptionC(voteEmp.getOptionC()); - xxpf.setOptionD(voteEmp.getOptionD()); - xxpf.setAvgScore(voteEmp.getAvgScore()); - xxpf.setPercentage(voteEmp.getPercentage()); - votesDatas.put("khx"+index2, xxpf); - sumScore = sumScore.add(voteEmp.getEndScore()); - if (index1 == 1) { - List children3 = new ArrayList<>(); - JSONObject child1 = new JSONObject(); - JSONObject child2 = new JSONObject(); - JSONObject child3 = new JSONObject(); - JSONObject child4 = new JSONObject(); - JSONObject child5 = new JSONObject(); - JSONObject child6 = new JSONObject(); - child1.put("name", "optionA"); - child1.put("label", "优秀"); - child2.put("name", "optionB"); - child2.put("label", "合格"); - child3.put("name", "optionC"); - child3.put("label", "基本合格"); - child4.put("name", "optionD"); - child4.put("label", "不合格"); - child5.put("name", "avgScore"); - child5.put("label", "得分"); - child6.put("name", "percentage"); - child6.put("label", "占比"); - children3.add(child1); - children3.add(child2); - children3.add(child3); - children3.add(child4); - children3.add(child5); - children3.add(child6); - tabledata.put("children", children3); - children2.add(tabledata); - } - } else if (voteEmp.getKhitemTypeid().equals(2L)) {//评分占比 - votesDatas.put("khx"+index2, voteEmp.getAvgScore()); - votesDatas.put("khx"+index2+"_zb", voteEmp.getPercentage()); - sumScore = sumScore.add(voteEmp.getEndScore()); - - if (index1 == 1) { - JSONObject tabledata2 = new JSONObject(); - tabledata2.put("name", "khx"+index2 + "_zb"); - tabledata2.put("label", "占比"); - children2.add(tabledata); - children2.add(tabledata2); - } - } else {//单独评分 - sumScore = sumScore.add(voteEmp.getAvgScore()); - votesDatas.put("khx"+index2, voteEmp.getAvgScore()); - if (index1 == 1) { - children2.add(tabledata); - } - } - } - pcdata.put("khdx", key); - pcdata.put(pyPCtitle, votesDatas); - pcdata.put(pyPCtitle+"_df", sumScore); - endData.add(pcdata); - - if (index1 == 1) { - tableColumn2.put("children", children2); - } - } - - children.add(tableColumn2); - JSONObject tableColumn3 = new JSONObject(); - tableColumn3.put("name", pyPCtitle+"_df"); - tableColumn3.put("label", "得分"); - children.add(tableColumn3); - //headerData.put("children", children); - //header.add(children); - - KhKhrwResult pcResult = new KhKhrwResult(); - pcResult.setPcId(pc.getId()); - pcResult.setPcName(pc.getPcTitle()); - pcResult.setTableHeader(children.toJSONString()); - pcResult.setTableData(endData.toJSONString()); - khKhrwResultService.insertKhKhrwResult(pcResult); - return AjaxResult.success(); + return khKhrwResultService.generateResult(pc); } /** diff --git a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/service/IKhKhrwResultService.java b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/service/IKhKhrwResultService.java index fbefebe..06d5601 100644 --- a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/service/IKhKhrwResultService.java +++ b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/service/IKhKhrwResultService.java @@ -1,7 +1,10 @@ package com.ruoyi.kaohe.service; import java.util.List; + +import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.kaohe.domain.KhKhrwResult; +import com.ruoyi.kaohe.domain.KhPingce; /** * 考核结果Service接口 @@ -58,4 +61,6 @@ public interface IKhKhrwResultService * @return 结果 */ public int deleteKhKhrwResultById(Long id); + + AjaxResult generateResult(KhPingce pc); } diff --git a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/service/impl/KhKhrwResultServiceImpl.java b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/service/impl/KhKhrwResultServiceImpl.java index 898aa2e..1ba078a 100644 --- a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/service/impl/KhKhrwResultServiceImpl.java +++ b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/service/impl/KhKhrwResultServiceImpl.java @@ -1,11 +1,20 @@ package com.ruoyi.kaohe.service.impl; -import java.util.List; +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.kaohe.domain.*; +import com.ruoyi.kaohe.mapper.KhVoteEmpMapper; +import com.ruoyi.kaohe.mapper.KhVoteMapper; +import com.ruoyi.kaohe.util.PinYinUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.kaohe.mapper.KhKhrwResultMapper; -import com.ruoyi.kaohe.domain.KhKhrwResult; import com.ruoyi.kaohe.service.IKhKhrwResultService; /** @@ -19,6 +28,10 @@ public class KhKhrwResultServiceImpl implements IKhKhrwResultService { @Autowired private KhKhrwResultMapper khKhrwResultMapper; + @Autowired + private KhVoteMapper khVoteMapper; + @Autowired + private KhVoteEmpMapper khVoteEmpMapper; /** * 查询考核结果 @@ -93,4 +106,151 @@ public class KhKhrwResultServiceImpl implements IKhKhrwResultService { return khKhrwResultMapper.deleteKhKhrwResultById(id); } + + @Override + public AjaxResult generateResult(KhPingce pc) { + JSONArray children = new JSONArray(); + JSONObject tableColumn = new JSONObject(); + tableColumn.put("name", "khdx"); + if (pc.getBkhdxType().equals("0")) { + tableColumn.put("label", "单位"); + } else { + tableColumn.put("label", "姓名"); + } + children.add(tableColumn); + + JSONObject tableColumn2 = new JSONObject(); + String pyPCtitle = PinYinUtil.getPinyinInitials(pc.getPcTitle()); + tableColumn2.put("name", pyPCtitle); + tableColumn2.put("label", pc.getPcTitle()); + +//----------------------------------------------------------------------------------------- + + JSONArray endData = new JSONArray(); //存放表格数据 + List lists = new ArrayList<>(); + + KhVote khVote = new KhVote(); + khVote.setPingceId(pc.getId()); + //查询该考核任务下的所有评分任务 + List votes = khVoteMapper.selectKhVoteList(khVote); + for (KhVote vote : votes) { + KhVoteEmp khVoteEmp = new KhVoteEmp(); + khVoteEmp.setVoteId(vote.getId()); + //查询该评分任务对应的所有被考核对象详情 + List khVoteEmps = khVoteEmpMapper.selectKhVoteEmpList(khVoteEmp); + lists.addAll(khVoteEmps); + } + //根据被考核对象名分组数据到map中 + Map> khdxMap = lists.stream() + .collect(Collectors.groupingBy(KhVoteEmp::getBkhdxName, + LinkedHashMap::new, // 使用LinkedHashMap保持插入顺序(这对于键很重要) + Collectors.toList())); // 根据getBkhdxName分组*/lists.stream(). + //循环map得到对应数据 + Set>> entries = khdxMap.entrySet(); + Integer index1=0; + for (Map.Entry> entry : entries) { + index1++; + BigDecimal sumScore = BigDecimal.ZERO; + String key = entry.getKey(); + //获取表头数据 + List children2 = new ArrayList<>(); +//------------------------------------------------------------------------------------------------------ + + //获取表数据 + JSONObject pcdata = new JSONObject(); + List value = entry.getValue(); + JSONObject votesDatas = new JSONObject(); + Integer index2 = 0; + for (KhVoteEmp voteEmp : value) { + index2++; + JSONObject tabledata = new JSONObject(); + tabledata.put("name", "khx"+index2); + tabledata.put("label", voteEmp.getVoteTitle()); + + Object objectData; + //根据考核类型存储不同数据 + if (voteEmp.getKhitemTypeid().equals(1L)) { //评分选项 + KhXxpf xxpf = new KhXxpf(); + xxpf.setOptionA(voteEmp.getOptionA()); + xxpf.setOptionB(voteEmp.getOptionB()); + xxpf.setOptionC(voteEmp.getOptionC()); + xxpf.setOptionD(voteEmp.getOptionD()); + xxpf.setAvgScore(voteEmp.getAvgScore()); + xxpf.setPercentage(voteEmp.getPercentage()); + votesDatas.put("khx"+index2, xxpf); + sumScore = sumScore.add(voteEmp.getEndScore()); + if (index1 == 1) { + List children3 = new ArrayList<>(); + JSONObject child1 = new JSONObject(); + JSONObject child2 = new JSONObject(); + JSONObject child3 = new JSONObject(); + JSONObject child4 = new JSONObject(); + JSONObject child5 = new JSONObject(); + JSONObject child6 = new JSONObject(); + child1.put("name", "optionA"); + child1.put("label", "优秀"); + child2.put("name", "optionB"); + child2.put("label", "合格"); + child3.put("name", "optionC"); + child3.put("label", "基本合格"); + child4.put("name", "optionD"); + child4.put("label", "不合格"); + child5.put("name", "avgScore"); + child5.put("label", "得分"); + child6.put("name", "percentage"); + child6.put("label", "占比"); + children3.add(child1); + children3.add(child2); + children3.add(child3); + children3.add(child4); + children3.add(child5); + children3.add(child6); + tabledata.put("children", children3); + children2.add(tabledata); + } + } else if (voteEmp.getKhitemTypeid().equals(2L)) {//评分占比 + votesDatas.put("khx"+index2, voteEmp.getAvgScore()); + votesDatas.put("khx"+index2+"_zb", voteEmp.getPercentage()); + sumScore = sumScore.add(voteEmp.getEndScore()); + + if (index1 == 1) { + JSONObject tabledata2 = new JSONObject(); + tabledata2.put("name", "khx"+index2 + "_zb"); + tabledata2.put("label", "占比"); + children2.add(tabledata); + children2.add(tabledata2); + } + } else {//单独评分 + sumScore = sumScore.add(voteEmp.getAvgScore()); + votesDatas.put("khx"+index2, voteEmp.getAvgScore()); + if (index1 == 1) { + children2.add(tabledata); + } + } + } + pcdata.put("khdx", key); + pcdata.put(pyPCtitle, votesDatas); + pcdata.put(pyPCtitle+"_df", sumScore); + endData.add(pcdata); + + if (index1 == 1) { + tableColumn2.put("children", children2); + } + } + + children.add(tableColumn2); + JSONObject tableColumn3 = new JSONObject(); + tableColumn3.put("name", pyPCtitle+"_df"); + tableColumn3.put("label", "得分"); + children.add(tableColumn3); + + + KhKhrwResult pcResult = new KhKhrwResult(); + pcResult.setPcId(pc.getId()); + pcResult.setPcName(pc.getPcTitle()); + pcResult.setTableHeader(children.toJSONString()); + pcResult.setTableData(endData.toJSONString()); + this.insertKhKhrwResult(pcResult); + return AjaxResult.success(); + } } diff --git a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/service/impl/KhVoteEmpServiceImpl.java b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/service/impl/KhVoteEmpServiceImpl.java index 7c0f743..4d1eaf7 100644 --- a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/service/impl/KhVoteEmpServiceImpl.java +++ b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/service/impl/KhVoteEmpServiceImpl.java @@ -159,6 +159,10 @@ public class KhVoteEmpServiceImpl implements IKhVoteEmpService { BigDecimal avgScore = (optionA.multiply(a).add(optionB.multiply(b).add(optionC.multiply(c).add(optionD.multiply(d))) )).divide(voteEmp.getVoteNum(),4, RoundingMode.HALF_UP); voteEmp.setAvgScore(avgScore);//投票后计算平均分 + voteEmp.setOptionA(optionA); + voteEmp.setOptionB(optionB); + voteEmp.setOptionC(optionC); + voteEmp.setOptionD(optionD); if (oldvoteEmp.getPercentage() != null) { //计算最后得分 voteEmp.setEndScore(avgScore.multiply(oldvoteEmp.getPercentage())); }else{ From b7f06512b84e07799bd39708720f521fd251a016 Mon Sep 17 00:00:00 2001 From: hshansha Date: Sat, 30 Aug 2025 09:17:17 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=B1=87=E6=80=BB=E6=95=B0=E6=8D=AEjson?= =?UTF-8?q?=E8=B0=83=E6=95=B4khdx=E7=9A=84=E4=BD=8D=E7=BD=AE=E3=80=81?= =?UTF-8?q?=E6=B1=87=E6=80=BB=E5=AF=BC=E5=87=BA=E6=8E=A5=E5=8F=A3=E7=BC=96?= =?UTF-8?q?=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-common/pom.xml | 10 + .../kaohe/controller/KhGatherController.java | 23 +- .../kaohe/util/EnhancedJsonExporter.java | 279 ++++++++++++++++++ .../com/ruoyi/kaohe/util/JsonDeepMerge.java | 2 +- .../ruoyi/kaohe/util/JsonToExcelExporter.java | 85 ++++++ 5 files changed, 396 insertions(+), 3 deletions(-) create mode 100644 ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/util/EnhancedJsonExporter.java create mode 100644 ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/util/JsonToExcelExporter.java 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(); + } + } +} From a7f0430d235d008b1a64a5e84d3427ddd5f12831 Mon Sep 17 00:00:00 2001 From: hshansha Date: Sat, 27 Sep 2025 09:02:40 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E6=B1=87=E6=80=BB?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kaohe/controller/KhGatherController.java | 6 +- .../kaohe/util/EnhancedJsonExporter.java | 32 +++++-- .../ruoyi/kaohe/util/JsonToExcelExporter.java | 85 ------------------ 考核结果.xlsx | Bin 0 -> 13150 bytes 考核结果1.xlsx | Bin 0 -> 4259 bytes 5 files changed, 31 insertions(+), 92 deletions(-) delete mode 100644 ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/util/JsonToExcelExporter.java create mode 100644 考核结果.xlsx create mode 100644 考核结果1.xlsx 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 0000000000000000000000000000000000000000..6411406e55b962fd1915465b5057d0a9ef889a4f GIT binary patch literal 13150 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 E1v8X6TL1t6 literal 0 HcmV?d00001 diff --git a/考核结果1.xlsx b/考核结果1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..35d729bcb456b1f3b082062111896ce8057db2cf GIT binary patch literal 4259 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