6 changed files with 205 additions and 12 deletions
@ -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); |
||||
|
} |
||||
|
} |
Binary file not shown.
Loading…
Reference in new issue