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