下载汇总表

main
hshansha 3 months ago
parent b7f06512b8
commit a7f0430d23

@ -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);
}
/**

@ -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<HeaderNode> 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();

@ -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<JsonNode> 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();
}
}
}

Binary file not shown.

Binary file not shown.
Loading…
Cancel
Save