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();