diff --git a/ruoyi-modules/ruoyi-demo/pom.xml b/ruoyi-modules/ruoyi-demo/pom.xml
index 1140c33..560ea6e 100644
--- a/ruoyi-modules/ruoyi-demo/pom.xml
+++ b/ruoyi-modules/ruoyi-demo/pom.xml
@@ -14,13 +14,19 @@
demo模块
-
+
org.apache.poi
poi-ooxml
5.2.4
+
+
+ cn.afterturn
+ easypoi-spring-boot-starter
+ 4.4.0
+
diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/CheckItem.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/CheckItem.java
index dc3b91d..76724c5 100644
--- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/CheckItem.java
+++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/CheckItem.java
@@ -23,13 +23,6 @@ public class CheckItem {
private String checkProject;
- /**
- * 具体检查子项描述
- * 示例值:"站房清洁与规范管理"
- * 表示该项目下的具体考核条目
- */
- private String checkItem;
-
// TODO 需要设置集合
private List checkItemBasis;
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 0d9d04f..4f3dc66 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
@@ -23,7 +23,7 @@ public class ReportData {
/** 运维单位,如:上海环保科技有限公司 */
private String operationUnit;
- /** 检查时间,格式:yyyy-MM-dd */
+ /** 检查时间,格式:yyyy-MM-dd HH:mm:ss */
private LocalDateTime checkTime;
/** 检查人员,多人用顿号或逗号分隔,如:张三、李四 */
diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/WordExportTest.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/WordExportTest.java
new file mode 100644
index 0000000..8d30d9f
--- /dev/null
+++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/WordExportTest.java
@@ -0,0 +1,197 @@
+package org.dromara.demo.domain;
+
+import cn.afterturn.easypoi.word.WordExportUtil;
+import cn.hutool.json.JSONUtil;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.*;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+public class WordExportTest {
+
+ public static void main(String[] args) throws Exception {
+ // 1. 准备数据(用户填写的内容)
+ Map data = getData();
+
+ // 2. 从 classpath 根目录加载模板文件:resources/score_template.docx
+ InputStream templateIs = WordExportTest.class
+ .getClassLoader()
+ .getResourceAsStream("score_template.docx"); // ✅ 路径已调整
+
+ if (templateIs == null) {
+ System.err.println("❌ 模板文件未找到!请检查路径:classpath:score_template.docx");
+ return;
+ }
+
+ System.out.println("✅ 模板加载成功!");
+
+ // 3. 创建临时文件(因为 EasyPOI exportWord07 不支持 InputStream)
+ File tempFile = File.createTempFile("temp_template", ".docx");
+ tempFile.deleteOnExit();
+
+ try (FileOutputStream fos = new FileOutputStream(tempFile)) {
+ byte[] buffer = new byte[1024];
+ int len;
+ while ((len = templateIs.read(buffer)) != -1) {
+ fos.write(buffer, 0, len);
+ }
+ }
+
+ // 4. ✅ 使用 EasyPOI 填充模板(传 File)
+ XWPFDocument document = WordExportUtil.exportWord07(String.valueOf(tempFile), data);
+
+ // 5. 导出到本地
+ String outputPath = "D:\\Users\\14212\\Desktop\\评分报告.docx"; // 可改为你的路径
+ try (FileOutputStream out = new FileOutputStream(outputPath)) {
+ document.write(out);
+ }
+
+ // 6. 关闭资源
+ document.close();
+ templateIs.close();
+
+ System.out.println("✅ Word 文件已生成:" + outputPath);
+ }
+
+ @NotNull
+ private static Map getData() {
+ // 1. 准备数据(用户填写的内容)
+ Map data = new LinkedHashMap<>();
+ data.put("siteName", "临安区龙岗镇站");
+ data.put("checkDateTime", "2025-09-04 10:30");
+ data.put("operationUnit", "XX有限公司");
+ data.put("checkPeople", "李工");
+ data.put("totalScore", "140"); // 28项 × 5分 = 140
+ // === 简单粗暴:score_01 到 score_28 全部设为 5 ===
+ for (int i = 1; i <= 28; i++) {
+ data.put("score_" + String.format("%02d", i), "5");
+ }
+ // -------------------- 零气测试 --------------------
+ double zero_flow = 5.0; // 零气MFC设定流量(L/min)
+ double zero_std = 4.98; // 标准流量计实测值(L/min)
+ // -------------------- 标气测试 --------------------
+ double span_flow = 100.0; // 标气MFC设定流量(ml/min)
+ double span_std = 101.5; // 标准流量计实测值(ml/min)
+
+ data.put("zero_flow", String.valueOf(zero_flow));
+ data.put("zero_std", String.valueOf(zero_std));
+ data.put("zero_error", calcError(zero_flow, zero_std)); // 自动计算
+
+ data.put("span_flow", String.valueOf(span_flow));
+ data.put("span_std", String.valueOf(span_std));
+ data.put("span_error", calcError(span_flow, span_std)); // 自动计算
+
+ // -------------------- SO2 流量测试 --------------------
+ double soDisplay = 0.8; // SO2显示流量(L/min)
+ double soStd = 0.78; // 标准流量计测值(L/min)
+
+ data.put("so_display", String.valueOf(soDisplay));
+ data.put("so_std", String.valueOf(soStd));
+ data.put("so_error", calcError(soDisplay, soStd)); // 自动计算:相对误差
+
+ // -------------------- SO2 浓度测试 --------------------
+ double soConcOutput = 500.0; // 标气稀释输出浓度(ppb)
+ double soConcResponse = 492.0; // 仪器响应浓度(ppb)
+
+ data.put("so_conc_output", String.valueOf(soConcOutput));
+ data.put("so_conc_response", String.valueOf(soConcResponse));
+ data.put("so_conc_error", calcError(soConcResponse, soConcOutput)); // (响应 - 输出)/输出 × 100%
+
+ // -------------------- t90响应时间(用户填写,不参与计算)--------------------
+ data.put("so_time", "4.2"); // 用户手动填写,单位:min,不参与任何计算
+
+
+ // -------------------- NO2 流量测试 --------------------
+ double noDisplay = 0.8;
+ double noStd = 0.78;
+
+ data.put("no_display", String.valueOf(noDisplay));
+ data.put("no_std", String.valueOf(noStd));
+ data.put("no_error", calcError(noDisplay, noStd)); // 自动计算:相对误差
+
+ // -------------------- NO 浓度测试 --------------------
+ double noConcOutput = 500.0; // 标气稀释输出浓度(ppb)
+ double noConcResponse = 492.0; // 仪器响应浓度(ppb)
+
+ data.put("no_conc_output", String.valueOf(noConcOutput));
+ data.put("no_conc_response", String.valueOf(noConcResponse));
+ data.put("no_conc_error", calcError(noConcResponse, noConcOutput)); // (响应 - 输出)/输出 × 100%
+
+ // -------------------- t90响应时间(用户填写,不参与计算)--------------------
+ data.put("no_time", "4.2"); // 用户手动填写,单位:min,不参与任何计算
+
+
+ // -------------------- CO 流量测试 --------------------
+ double coDisplay = 0.8; // SO2显示流量(L/min)
+ double coStd = 0.78; // 标准流量计测值(L/min)
+
+ data.put("co_display", String.valueOf(coDisplay));
+ data.put("co_std", String.valueOf(coStd));
+ data.put("co_error", calcError(coDisplay, coStd)); // 自动计算:相对误差
+
+ // -------------------- NO2 浓度测试 --------------------
+ double coConcOutput = 500.0; // 标气稀释输出浓度(ppb)
+ double coConcResponse = 492.0; // 仪器响应浓度(ppb)
+
+ data.put("co_conc_output", String.valueOf(coConcOutput));
+ data.put("co_conc_response", String.valueOf(coConcResponse));
+ data.put("co_conc_error", calcError(coConcResponse, coConcOutput)); // (响应 - 输出)/输出 × 100%
+
+ // -------------------- t90响应时间(用户填写,不参与计算)--------------------
+ data.put("co_time", "4.2"); // 用户手动填写,单位:min,不参与任何计算
+
+
+ double oDisplay = 0.8; // SO2显示流量(L/min)
+ double oStd = 0.78; // 标准流量计测值(L/min)
+
+ data.put("o_display", String.valueOf(oDisplay));
+ data.put("o_std", String.valueOf(oStd));
+ data.put("o_error", calcError(oDisplay, oStd)); // 自动计算:相对误差
+
+ double oConcOutput = 500.0; // 标气稀释输出浓度(ppb)
+ double oConcResponse = 492.0; // 仪器响应浓度(ppb)
+
+ data.put("o_conc_output", String.valueOf(oConcOutput));
+ data.put("o_conc_response", String.valueOf(oConcResponse));
+ data.put("o_conc_error", calcError(oConcResponse, oConcOutput)); // (响应 - 输出)/输出 × 100%
+ // -------------------- t90响应时间(用户填写,不参与计算)--------------------
+ data.put("o_time", "4.2"); // 用户手动填写,单位:min,不参与任何计算
+
+ //----------PM10 测试----------
+ double pm10Display = 0.8;
+ double pm10Std = 0.78;
+
+ data.put("pm10_display", String.valueOf(pm10Display));
+ data.put("pm10_std", String.valueOf(pm10Std));
+ data.put("pm10_error", calcError(pm10Display, pm10Std)); // 自动计算:相对误差
+
+ data.put("pm10_k", 0.8);
+ data.put("k0_A", 0.8);
+
+
+ //----------PM2 测试----------
+ double pm2Display = 0.8;
+ double pm2Std = 0.78;
+
+ data.put("pm2_display", String.valueOf(pm2Display));
+ data.put("pm2_std", String.valueOf(pm2Std));
+ data.put("pm2_error", calcError(pm2Display, pm2Std)); // 自动计算:相对误差
+
+ data.put("pm2_k", 0.5);
+ data.put("k0_B", 0.5);
+
+ System.out.println("✅ 数据准备完成!");
+ System.out.println(JSONUtil.toJsonStr(data));
+ return data;
+ }
+
+ // 工具方法:计算相对误差,保留1位小数
+ private static String calcError(double mfcFlow, double stdFlow) {
+ if (Math.abs(stdFlow) < 0.0001) return "0.0"; // 防止除0
+ double error = (mfcFlow - stdFlow) / stdFlow * 100;
+ return String.format("%.1f", error);
+ }
+}
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 cd7b74f..a0ded01 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
@@ -318,7 +318,6 @@ public class WordReportExporter {
CheckItem item1 = new CheckItem();
item1.setCheckProject("01站房环境保障情况(5分)");
- item1.setCheckItem("站房环境是否清洁,是否符合监测要求");
item1.setItemScore(2);
item1.setObtainedScore(1);
item1.setScoringBasis(List.of(
@@ -335,7 +334,6 @@ public class WordReportExporter {
CheckItem item2 = new CheckItem();
item2.setCheckProject("01站房环境保障情况(5分)");
- item2.setCheckItem("站房温度是否控制在25±5℃,相对湿度控制在80%以下)");
item2.setItemScore(3);
item2.setObtainedScore(3);
item2.setScoringBasis(List.of("1)仪器运行正常;"));
@@ -348,7 +346,6 @@ public class WordReportExporter {
CheckItem item3 = new CheckItem();
item3.setCheckProject("02采样系统维护效果(10分)");
- item3.setCheckItem("采样口距离地面、房顶高度、周围空间是否符合《规范》(注1)要求");
item3.setItemScore(3);
item3.setObtainedScore(3);
item3.setScoringBasis(List.of("1)仪器运行正常;"));
diff --git a/ruoyi-modules/ruoyi-demo/src/main/resources/score_template.docx b/ruoyi-modules/ruoyi-demo/src/main/resources/score_template.docx
new file mode 100644
index 0000000..e1ddff0
Binary files /dev/null and b/ruoyi-modules/ruoyi-demo/src/main/resources/score_template.docx differ