|
|
|
@ -93,8 +93,10 @@ public class DonghuanReportExportController extends BaseController { |
|
|
|
|
|
|
|
/** 正文 12pt(半磅 24) */ |
|
|
|
private static final int SZ_BODY = 24; |
|
|
|
/** 小标题 16pt(半磅 32) */ |
|
|
|
private static final int SZ_HEAD = 32; |
|
|
|
/** 小标题 14pt(半磅 28) 四号 */ |
|
|
|
private static final int SZ_HEAD_FOURTH = 28; |
|
|
|
/** 小标题 16pt(半磅 32)三号 */ |
|
|
|
private static final int SZ_HEAD_THIRD = 32; |
|
|
|
/** 行高 atLeast(twips) */ |
|
|
|
private static final int ROW_H = 454; |
|
|
|
/** 单元格左右边距(twips) */ |
|
|
|
@ -411,6 +413,19 @@ public class DonghuanReportExportController extends BaseController { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 设置段落首行缩进 1 字符。 |
|
|
|
* 写 w:firstLineChars=100(Word/WPS 原生「首行缩进:1 字符」,随字号自动折算 1 个汉字宽), |
|
|
|
* 同时按段落字号(halfPoints,半磅)回填 w:firstLine(twips = halfPoints × 10), |
|
|
|
* 兼容不识别 firstLineChars 的阅读器(如 LibreOffice)。 |
|
|
|
*/ |
|
|
|
private void setFirstLineIndentOneChar(XWPFParagraph p, int halfPoints) { |
|
|
|
p.setIndentationFirstLine(halfPoints * 10); |
|
|
|
CTPPr pPr = p.getCTP().isSetPPr() ? p.getCTP().getPPr() : p.getCTP().addNewPPr(); |
|
|
|
CTInd ind = pPr.isSetInd() ? pPr.getInd() : pPr.addNewInd(); |
|
|
|
ind.setFirstLineChars(BigInteger.valueOf(100)); |
|
|
|
} |
|
|
|
|
|
|
|
/** 页面设置:A4 + 模板版心 + 文档网格(与模板 sectPr 一致) */ |
|
|
|
private void setupPage(XWPFDocument doc) { |
|
|
|
CTBody body = doc.getDocument().getBody(); |
|
|
|
@ -471,7 +486,7 @@ public class DonghuanReportExportController extends BaseController { |
|
|
|
addPara(doc, reportTitle, FONT_TITLE, 44, true, false, COLOR_DARK, |
|
|
|
ParagraphAlignment.CENTER, 0, 100); |
|
|
|
// 副标题 |
|
|
|
addPara(doc, "【巡检类型:动环智能巡检】", FONT_BODY, SZ_HEAD, false, false, |
|
|
|
addPara(doc, "【巡检类型:动环智能巡检】", FONT_BODY, SZ_HEAD_THIRD, false, false, |
|
|
|
COLOR_LIGHT, ParagraphAlignment.CENTER, 200, 100); |
|
|
|
|
|
|
|
// 空行(撑出版面,与模板一致) |
|
|
|
@ -505,9 +520,10 @@ public class DonghuanReportExportController extends BaseController { |
|
|
|
|
|
|
|
/** 一、巡检基本情况 */ |
|
|
|
private void buildSectionBasic(XWPFDocument doc, InspectionReport report) { |
|
|
|
XWPFParagraph h = addPara(doc, "一、巡检基本情况", FONT_HEAD, SZ_HEAD, true, false, |
|
|
|
XWPFParagraph h = addPara(doc, "一、巡检基本情况", FONT_HEAD, SZ_HEAD_FOURTH, true, false, |
|
|
|
null, null, 160, 80); |
|
|
|
setKeepNext(h); |
|
|
|
setFirstLineIndentOneChar(h, SZ_HEAD_FOURTH); // 标题首行缩进 1 字符 |
|
|
|
|
|
|
|
XWPFTable t = addTable(doc, 7, 4, new int[]{1827, 2655, 1920, 2659}, 9061, false); |
|
|
|
List<InspectionReportData> dataList = report.getReportDatalist(); |
|
|
|
@ -570,9 +586,10 @@ public class DonghuanReportExportController extends BaseController { |
|
|
|
|
|
|
|
/** 二、巡检状态说明(静态文案,与模板一致) */ |
|
|
|
private void buildSectionStatus(XWPFDocument doc) { |
|
|
|
XWPFParagraph h = addPara(doc, "二、巡检状态说明", FONT_HEAD, SZ_HEAD, true, false, |
|
|
|
XWPFParagraph h = addPara(doc, "二、巡检状态说明", FONT_HEAD, SZ_HEAD_FOURTH, true, false, |
|
|
|
null, null, 160, 80); |
|
|
|
setKeepNext(h); |
|
|
|
setFirstLineIndentOneChar(h, SZ_HEAD_FOURTH); // 标题首行缩进 1 字符 |
|
|
|
|
|
|
|
XWPFTable t = addTable(doc, 4, 3, new int[]{1831, 4115, 3114}, 9060, false); |
|
|
|
String[][] rows = { |
|
|
|
@ -600,9 +617,10 @@ public class DonghuanReportExportController extends BaseController { |
|
|
|
|
|
|
|
/** 三、巡检结果概览:(一)巡检统计 + (二)缺陷汇总表 */ |
|
|
|
private void buildSectionOverview(XWPFDocument doc, InspectionReport report) { |
|
|
|
XWPFParagraph h = addPara(doc, "三、巡检结果概览", FONT_HEAD, SZ_HEAD, true, false, |
|
|
|
XWPFParagraph h = addPara(doc, "三、巡检结果概览", FONT_HEAD, SZ_HEAD_FOURTH, true, false, |
|
|
|
null, null, 160, 80); |
|
|
|
setKeepNext(h); |
|
|
|
setFirstLineIndentOneChar(h, SZ_HEAD_FOURTH); // 标题首行缩进 1 字符 |
|
|
|
|
|
|
|
List<InspectionReportData> dataList = report.getReportDatalist() != null |
|
|
|
? report.getReportDatalist() : Collections.emptyList(); |
|
|
|
@ -611,9 +629,10 @@ public class DonghuanReportExportController extends BaseController { |
|
|
|
String statusNormal = messageUtils.get("正常"); |
|
|
|
|
|
|
|
// (一)巡检统计 |
|
|
|
XWPFParagraph h1 = addPara(doc, "(一)巡检统计", FONT_BODY, SZ_HEAD, true, false, |
|
|
|
XWPFParagraph h1 = addPara(doc, "(一)巡检统计", FONT_BODY, SZ_HEAD_THIRD, true, false, |
|
|
|
null, null, 80, 40); |
|
|
|
setKeepNext(h1); |
|
|
|
setFirstLineIndentOneChar(h1, SZ_HEAD_THIRD); // 标题首行缩进 1 字符 |
|
|
|
XWPFTable statTable = addTable(doc, 5, 2, new int[]{4296, 4713}, 9008, true); |
|
|
|
setRow(statTable.getRow(0), ROW_H, false); |
|
|
|
headerCell(statTable.getRow(0).getCell(0), "巡检状态", 4296); |
|
|
|
@ -631,9 +650,10 @@ public class DonghuanReportExportController extends BaseController { |
|
|
|
} |
|
|
|
|
|
|
|
// (二)缺陷汇总表 |
|
|
|
XWPFParagraph h2 = addPara(doc, "(二)缺陷汇总表", FONT_BODY, SZ_HEAD, true, false, |
|
|
|
XWPFParagraph h2 = addPara(doc, "(二)缺陷汇总表", FONT_BODY, SZ_HEAD_THIRD, true, false, |
|
|
|
null, null, 80, 40); |
|
|
|
setKeepNext(h2); |
|
|
|
setFirstLineIndentOneChar(h2, SZ_HEAD_THIRD); // 标题首行缩进 1 字符 |
|
|
|
List<InspectionReportData> defectList = dataList.stream() |
|
|
|
.filter(d -> statusDefect.equals(d.getPointStatus())) |
|
|
|
.collect(Collectors.toList()); |
|
|
|
@ -677,9 +697,10 @@ public class DonghuanReportExportController extends BaseController { |
|
|
|
/** 四、巡检详情:每个点位一张 8 行 × 4 列详情表 */ |
|
|
|
private void buildSectionDetail(XWPFDocument doc, InspectionReport report, |
|
|
|
Map<String, Path> tempFileMap) { |
|
|
|
XWPFParagraph h = addPara(doc, "四、巡检详情", FONT_HEAD, SZ_HEAD, true, false, |
|
|
|
XWPFParagraph h = addPara(doc, "四、巡检详情", FONT_HEAD, SZ_HEAD_FOURTH, true, false, |
|
|
|
null, null, 160, 80); |
|
|
|
setKeepNext(h); |
|
|
|
setFirstLineIndentOneChar(h, SZ_HEAD_FOURTH); // 标题首行缩进 1 字符 |
|
|
|
|
|
|
|
List<InspectionReportData> dataList = report.getReportDatalist() != null |
|
|
|
? report.getReportDatalist().stream().filter(item -> messageUtils.get("缺陷").equals(item.getPointStatus())).collect(Collectors.toList()) : Collections.emptyList(); |
|
|
|
|