From e8a501d488dde2a7c954fc3b8ef0d3698b0e1203 Mon Sep 17 00:00:00 2001 From: wangguangyuan Date: Thu, 3 Sep 2026 15:35:06 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=B7=A1=E8=A7=86=E6=8A=A5=E5=91=8A?= =?UTF-8?q?=E6=A0=87=E9=A2=98=E5=AD=97=E4=BD=93=E9=BB=91=E4=BD=93=204?= =?UTF-8?q?=E5=8F=B7=EF=BC=8C=E6=A0=87=E9=A2=98=E6=AE=B5=E8=90=BD=E9=A6=96?= =?UTF-8?q?=E8=A1=8C=E7=BC=A9=E8=BF=9B1=E5=AD=97=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DonghuanReportExportController.java | 39 ++++++++++++++----- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/inspect-main/inspect-main-task/src/main/java/com/inspect/resultmain/controller/DonghuanReportExportController.java b/inspect-main/inspect-main-task/src/main/java/com/inspect/resultmain/controller/DonghuanReportExportController.java index 96786bd..965ac11 100644 --- a/inspect-main/inspect-main-task/src/main/java/com/inspect/resultmain/controller/DonghuanReportExportController.java +++ b/inspect-main/inspect-main-task/src/main/java/com/inspect/resultmain/controller/DonghuanReportExportController.java @@ -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 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 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 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 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 dataList = report.getReportDatalist() != null ? report.getReportDatalist().stream().filter(item -> messageUtils.get("缺陷").equals(item.getPointStatus())).collect(Collectors.toList()) : Collections.emptyList();