From cbc0c54b15bd7a37cdd3020e0f5a49654441e5f2 Mon Sep 17 00:00:00 2001 From: gjh <1421wake> Date: Wed, 3 Sep 2025 10:50:45 +0800 Subject: [PATCH] =?UTF-8?q?word=E6=A8=A1=E6=9D=BF=E5=AF=BC=E5=87=BAdemov2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/demo/domain/ReportData.java | 7 +- .../demo/domain/WordReportExporter.java | 159 +++++++++--------- 2 files changed, 80 insertions(+), 86 deletions(-) diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/ReportData.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/ReportData.java index 33dbce0..f650a21 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/ReportData.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/ReportData.java @@ -2,6 +2,7 @@ package org.dromara.demo.domain; import lombok.Data; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.List; /** @@ -19,16 +20,16 @@ public class ReportData { private String siteName; /** 所属区或管委会,如:浦东新区 */ - private String district; + //private String district; /** 所属街道、乡或镇,如:张江镇 */ - private String street; + //private String street; /** 运维单位,如:上海环保科技有限公司 */ private String operationUnit; /** 检查时间,格式:yyyy-MM-dd */ - private LocalDate checkTime; + private LocalDateTime checkTime; /** 检查人员,多人用顿号或逗号分隔,如:张三、李四 */ private String checkPersonnel; diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/WordReportExporter.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/WordReportExporter.java index 9f31954..7c19388 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/WordReportExporter.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/WordReportExporter.java @@ -2,18 +2,19 @@ package org.dromara.demo.domain; import cn.hutool.json.JSONUtil; import org.apache.poi.xwpf.usermodel.*; -import org.dromara.demo.domain.ReportData; -import org.dromara.demo.domain.CheckItem; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth; +import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.io.File; import java.math.BigInteger; +import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.util.Comparator; import java.util.List; import java.util.Map; +import java.util.TreeMap; import java.util.stream.Collectors; public class WordReportExporter { @@ -70,7 +71,7 @@ public class WordReportExporter { XWPFRun label = p.createRun(); label.setFontFamily("宋体"); label.setFontSize(12); - label.setBold(true); + label.setBold(false); label.setText("站点名称:"); XWPFRun value = p.createRun(); @@ -79,37 +80,37 @@ public class WordReportExporter { value.setBold(false); value.setText(reportData.getSiteName()); - // 区(管委会) - p = document.createParagraph(); - p.setSpacingAfter(10); - - label = p.createRun(); - label.setFontFamily("宋体"); - label.setFontSize(12); - label.setBold(true); - label.setText("区(管委会):"); - - value = p.createRun(); - value.setFontFamily("宋体"); - value.setFontSize(12); - value.setBold(false); - value.setText(reportData.getDistrict()); - - // 街道(乡、镇) - p = document.createParagraph(); - p.setSpacingAfter(10); - - label = p.createRun(); - label.setFontFamily("宋体"); - label.setFontSize(12); - label.setBold(true); - label.setText("街道(乡、镇):"); - - value = p.createRun(); - value.setFontFamily("宋体"); - value.setFontSize(12); - value.setBold(false); - value.setText(reportData.getStreet()); +// // 区(管委会) +// p = document.createParagraph(); +// p.setSpacingAfter(10); +// +// label = p.createRun(); +// label.setFontFamily("宋体"); +// label.setFontSize(12); +// label.setBold(false); +// label.setText("区(管委会):"); +// +// value = p.createRun(); +// value.setFontFamily("宋体"); +// value.setFontSize(12); +// value.setBold(false); +// value.setText(reportData.getDistrict()); +// +// // 街道(乡、镇) +// p = document.createParagraph(); +// p.setSpacingAfter(10); +// +// label = p.createRun(); +// label.setFontFamily("宋体"); +// label.setFontSize(12); +// label.setBold(false); +// label.setText("街道(乡、镇):"); +// +// value = p.createRun(); +// value.setFontFamily("宋体"); +// value.setFontSize(12); +// value.setBold(false); +// value.setText(reportData.getStreet()); // 运维单位 p = document.createParagraph(); @@ -118,7 +119,7 @@ public class WordReportExporter { label = p.createRun(); label.setFontFamily("宋体"); label.setFontSize(12); - label.setBold(true); + label.setBold(false); label.setText("运维单位:"); value = p.createRun(); @@ -127,37 +128,6 @@ public class WordReportExporter { value.setBold(false); value.setText(reportData.getOperationUnit()); - // 检查时间 - p = document.createParagraph(); - p.setSpacingAfter(10); - - label = p.createRun(); - label.setFontFamily("宋体"); - label.setFontSize(12); - label.setBold(true); - label.setText("检查时间:"); - - value = p.createRun(); - value.setFontFamily("宋体"); - value.setFontSize(12); - value.setBold(false); - value.setText(reportData.getCheckTime().format(formatter)); - - // 检查人员 - p = document.createParagraph(); - p.setSpacingAfter(10); - - label = p.createRun(); - label.setFontFamily("宋体"); - label.setFontSize(12); - label.setBold(true); - label.setText("检查人员:"); - - value = p.createRun(); - value.setFontFamily("宋体"); - value.setFontSize(12); - value.setBold(false); - value.setText(reportData.getCheckPersonnel()); } private static void addScoreTable(XWPFDocument document, ReportData reportData) { @@ -173,17 +143,22 @@ public class WordReportExporter { XWPFTableRow header = table.getRow(0); setCellTextAndStyle(header.getCell(0), "检查项目", true); header.addNewTableCell(); - setCellTextAndStyle(header.getCell(1), "检查子项", true); + setCellTextAndStyle(header.getCell(1), "检查要点", true); header.addNewTableCell(); - setCellTextAndStyle(header.getCell(2), "满分分数", true); + setCellTextAndStyle(header.getCell(2), "单项分值", true); header.addNewTableCell(); - setCellTextAndStyle(header.getCell(3), "实际得分", true); + setCellTextAndStyle(header.getCell(3), "得分", true); header.addNewTableCell(); setCellTextAndStyle(header.getCell(4), "评分说明", true); - // 按 checkProject 分组 + // 按 checkProject 分组,并按项目编号排序 Map> grouped = items.stream() - .collect(Collectors.groupingBy(CheckItem::getCheckProject)); + .sorted(Comparator.comparing(CheckItem::getCheckProject)) + .collect(Collectors.groupingBy( + CheckItem::getCheckProject, // 分组依据 + TreeMap::new, // ✅ 用 TreeMap 保持 key 有序 + Collectors.toList() // 每组是一个 List + )); for (Map.Entry> entry : grouped.entrySet()) { List groupItems = entry.getValue(); @@ -225,15 +200,33 @@ public class WordReportExporter { } private static void addTotalAndRemarks(XWPFDocument document, ReportData reportData) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + // 1. 总分 XWPFParagraph totalPara = document.createParagraph(); XWPFRun totalRun = totalPara.createRun(); - totalRun.setBold(true); + totalRun.setBold(false); totalRun.setText("总分:" + reportData.getTotalScore()); + totalRun.setFontFamily("宋体"); + totalRun.setFontSize(12); + // 2. 备注 XWPFParagraph remarksPara = document.createParagraph(); XWPFRun remarksRun = remarksPara.createRun(); remarksRun.setText("备注:" + reportData.getRemarks()); + remarksRun.setFontFamily("宋体"); + remarksRun.setFontSize(12); + // 3. 检查时间(左) + 检查人员(右) + XWPFParagraph p = document.createParagraph(); + p.setAlignment(ParagraphAlignment.BOTH); // 两端对齐 + + XWPFRun run = p.createRun(); + run.setText("检查时间:" + reportData.getCheckTime().format(formatter) + + " " + // 多个空格 + "检查人员:" + reportData.getCheckPersonnel()); + run.setFontFamily("宋体"); + run.setFontSize(12); } // ==================== 测试入口 ==================== @@ -242,11 +235,11 @@ public class WordReportExporter { ReportData report = new ReportData(); report.setReportTitle("数据购买监理服务现场技术核查评分表"); - report.setSiteName("杭州西湖空气质量监测站"); - report.setDistrict("西湖区"); - report.setStreet("龙翔桥"); + report.setSiteName("临安区龙岗镇站"); +// report.setDistrict("西湖区"); +// report.setStreet("龙翔桥"); report.setOperationUnit("国研信息"); - report.setCheckTime(java.time.LocalDate.now()); + report.setCheckTime(LocalDateTime.now()); report.setCheckPersonnel("张三、李四"); //report.setTotalScore(95); report.setRemarks("注1:《环境空气环境空气气态污染物(SO2、NO2、O3、CO)连续自动监测系统技术要求及检测方法HJ654-2013》\n" + @@ -254,8 +247,8 @@ public class WordReportExporter { "04质量控制效果中相关质控因子有缺项的,分值按比例分摊。\n"); CheckItem item1 = new CheckItem(); - item1.setCheckProject("01 站房环境保障情况"); - item1.setCheckItem("站房清洁与规范管理"); + item1.setCheckProject("01站房环境保障情况(5分)"); + item1.setCheckItem("站房环境是否清洁,是否符合监测要求"); item1.setItemScore(2); item1.setObtainedScore(1); item1.setScoringBasis(List.of( @@ -265,16 +258,16 @@ public class WordReportExporter { item1.setDeductionRule("一项不合格扣0.5分,扣完为止(评分规则)"); CheckItem item2 = new CheckItem(); - item2.setCheckProject("01 站房环境保障情况"); - item2.setCheckItem("仪器运行状态检查"); + item2.setCheckProject("01站房环境保障情况(5分)"); + item2.setCheckItem("站房温度是否控制在25±5℃,相对湿度控制在80%以下)"); item2.setItemScore(3); item2.setObtainedScore(3); item2.setScoringBasis(List.of("1)仪器运行正常;")); item2.setDeductionRule("发现异常未处理扣1分"); CheckItem item3 = new CheckItem(); - item3.setCheckProject("02 站房环境保障情况"); - item3.setCheckItem("仪器运行状态检查"); + item3.setCheckProject("02采样系统维护效果(10分)"); + item3.setCheckItem("采样口距离地面、房顶高度、周围空间是否符合《规范》(注1)要求"); item3.setItemScore(3); item3.setObtainedScore(3); item3.setScoringBasis(List.of("1)仪器运行正常;"));