Browse Source

word模板导出demov5

aqm-ops-supervision-platform
gjh 1 week ago
parent
commit
781e847749
  1. 8
      ruoyi-modules/ruoyi-demo/pom.xml
  2. 7
      ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/CheckItem.java
  3. 2
      ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/ReportData.java
  4. 197
      ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/WordExportTest.java
  5. 3
      ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/WordReportExporter.java
  6. BIN
      ruoyi-modules/ruoyi-demo/src/main/resources/score_template.docx

8
ruoyi-modules/ruoyi-demo/pom.xml

@ -14,13 +14,19 @@
<description> <description>
demo模块 demo模块
</description> </description>
<!-- poi-->
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.apache.poi</groupId> <groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId> <artifactId>poi-ooxml</artifactId>
<version>5.2.4</version> <version>5.2.4</version>
</dependency> </dependency>
<!-- easy-poi-->
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-spring-boot-starter</artifactId>
<version>4.4.0</version> <!-- 或最新版本 -->
</dependency>
<!-- 通用工具--> <!-- 通用工具-->
<dependency> <dependency>

7
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 checkProject;
/**
* 具体检查子项描述
* 示例值"站房清洁与规范管理"
* 表示该项目下的具体考核条目
*/
private String checkItem;
// TODO 需要设置集合 // TODO 需要设置集合
private List<String> checkItemBasis; private List<String> checkItemBasis;

2
ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/ReportData.java

@ -23,7 +23,7 @@ public class ReportData {
/** 运维单位,如:上海环保科技有限公司 */ /** 运维单位,如:上海环保科技有限公司 */
private String operationUnit; private String operationUnit;
/** 检查时间,格式:yyyy-MM-dd */ /** 检查时间,格式:yyyy-MM-dd HH:mm:ss */
private LocalDateTime checkTime; private LocalDateTime checkTime;
/** 检查人员,多人用顿号或逗号分隔,如:张三、李四 */ /** 检查人员,多人用顿号或逗号分隔,如:张三、李四 */

197
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<String, Object> 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<String, Object> getData() {
// 1. 准备数据(用户填写的内容)
Map<String, Object> 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);
}
}

3
ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/WordReportExporter.java

@ -318,7 +318,6 @@ public class WordReportExporter {
CheckItem item1 = new CheckItem(); CheckItem item1 = new CheckItem();
item1.setCheckProject("01站房环境保障情况(5分)"); item1.setCheckProject("01站房环境保障情况(5分)");
item1.setCheckItem("站房环境是否清洁,是否符合监测要求");
item1.setItemScore(2); item1.setItemScore(2);
item1.setObtainedScore(1); item1.setObtainedScore(1);
item1.setScoringBasis(List.of( item1.setScoringBasis(List.of(
@ -335,7 +334,6 @@ public class WordReportExporter {
CheckItem item2 = new CheckItem(); CheckItem item2 = new CheckItem();
item2.setCheckProject("01站房环境保障情况(5分)"); item2.setCheckProject("01站房环境保障情况(5分)");
item2.setCheckItem("站房温度是否控制在25±5℃,相对湿度控制在80%以下)");
item2.setItemScore(3); item2.setItemScore(3);
item2.setObtainedScore(3); item2.setObtainedScore(3);
item2.setScoringBasis(List.of("1)仪器运行正常;")); item2.setScoringBasis(List.of("1)仪器运行正常;"));
@ -348,7 +346,6 @@ public class WordReportExporter {
CheckItem item3 = new CheckItem(); CheckItem item3 = new CheckItem();
item3.setCheckProject("02采样系统维护效果(10分)"); item3.setCheckProject("02采样系统维护效果(10分)");
item3.setCheckItem("采样口距离地面、房顶高度、周围空间是否符合《规范》(注1)要求");
item3.setItemScore(3); item3.setItemScore(3);
item3.setObtainedScore(3); item3.setObtainedScore(3);
item3.setScoringBasis(List.of("1)仪器运行正常;")); item3.setScoringBasis(List.of("1)仪器运行正常;"));

BIN
ruoyi-modules/ruoyi-demo/src/main/resources/score_template.docx

Binary file not shown.
Loading…
Cancel
Save