管理办法手册插入位置逻辑调整

This commit is contained in:
yujh_java 2025-07-22 09:08:38 +08:00 committed by zhaolei
parent baaf3f4737
commit 64a5b62b0b

View File

@ -2889,50 +2889,142 @@ public class OutputWordUtil {
return;
}
BO mrBO = SDK.getBOAPI().getByKeyField("BO_EU_PROCESS_MR", "FILEUUID", uuid);
if(null!=mrBO){
String status = mrBO.getString("STATUS");
if(status.equals("1")){//如果为生效状态
//先获取管理要求附件
if (null == mrBO || !"1".equals(mrBO.getString("STATUS"))) {
return;
}
List<FormFile> systemfile = SDK.getBOAPI().getFiles(mrBO.getId(), "SYSTEMFILE");
if (systemfile.isEmpty()) {
return;
}
FormFile formFile = systemfile.get(0);
DCContext fileDCContext = SDK.getBOAPI().getFileDCContext(formFile);
//开始合并
// 加载目标文件和待合并文档2
Document docs1 = new Document();
docs1.loadFromFile(filePath);
// 加载文档2
Document docs2 = new Document();
docs2.loadFromFile(fileDCContext.getFilePath());
SectionCollection sections1 = docs1.getSections();
//先确认要找到的段落
int targetParagraphIndex = 0;
// 定位插入位置根据text判断是流程图前还是活动说明后表格后
Paragraph targetPara = null;
Section targetSection = null;
int targetParaIndex = -1;
if ("流程图前".equals(text)) {
for (int i = 1; i < sections1.getCount(); i++) {
Section section = sections1.get(i);
for (int j = 0; j < section.getParagraphs().getCount(); j++) {
Paragraph para = section.getParagraphs().get(j);
if (para.getText().contains("流程图")) {
targetParagraphIndex = i;
// 保持原有流程图前逻辑适配文件中# 2. 流程图
for (Object obj : docs1.getSections()) {
Section sec = (Section) obj;
int i = 0;
for (Object parObj : sec.getParagraphs()) {
Paragraph para = (Paragraph) parObj;
if (para.getText().trim().contains("2. 流程图") || para.getText().trim().equals("流程图")) {
targetPara = para;
targetSection = sec;
targetParaIndex = i;
break;
}
i++;
}
if (targetPara != null) {
break;
}
}
} else if ("活动说明后".equals(text)) {
for (int i = 1; i < sections1.getCount(); i++) {
Section section = sections1.get(i);
for (int j = 0; j < section.getParagraphs().getCount(); j++) {
Paragraph para = section.getParagraphs().get(j);
if (para.getText().contains("流程说明")) {
targetParagraphIndex = i+1;
boolean foundProcessDesc = false; // 标记已找到3. 流程说明标题
int lastTableParaIndex = -1; // 记录流程说明表格最后一行的索引
for (Object obj : docs1.getSections()) {
Section sec = (Section) obj;
int i = 0;
for (Object paragraph : sec.getParagraphs()) {
Paragraph para = (Paragraph) paragraph;
String paraText = para.getText().trim();
// 修正1匹配文件中实际的3. 流程说明标题#和数字
if (paraText.contains("3. 流程说明") || paraText.contains("流程说明")) {
foundProcessDesc = true;
continue;
}
// 修正2流程说明持续追踪表格最后一行|符号
if (foundProcessDesc) {
// 表格行含||01|线上审批55555|...
if (paraText.contains("|")) {
lastTableParaIndex = i; // 持续更新表格最后一行索引
} else {
// 遇到非表格内容时插入位置为表格最后一行的下一行
if (lastTableParaIndex != -1) {
targetParaIndex = i; // 插入到当前非表格段落前即表格下方
targetPara = para;
targetSection = sec;
break;
}
}
}
i++;
}
sections1.insert(targetParagraphIndex, docs2.getSections().get(0).deepClone());
// 保存文档2
if (targetPara != null) {
break;
}
}
}
// 未找到目标位置则退出
if (targetPara == null || targetSection == null) {
return;
}
// 插入文档2内容保持格式与文件协调
Section doc2Sec = docs2.getSections().get(0);
boolean isFirstPara = true;
for (Object obj : doc2Sec.getParagraphs()) {
Paragraph doc2Para = (Paragraph) obj;
Paragraph clonedPara = (Paragraph) doc2Para.deepClone();
ParagraphFormat format = clonedPara.getFormat();
// 核心格式确保同页且不挤压
format.setPageBreakBefore(false);
format.setPageBreakAfter(false);
format.setKeepLines(true);
format.setKeepFollow(true);
format.setLineSpacingRule(LineSpacingRule.At_Least);
format.setLineSpacing(12f); // 适配文件中行高
// 第一段与表格保持6磅间距避免贴紧表格底部
if (isFirstPara) {
float beforeSpacing = format.getBeforeSpacing();
format.setBeforeSpacing(beforeSpacing > 0 ? beforeSpacing : 6f);
isFirstPara = false;
}
// 插入到目标位置表格下方
targetSection.getParagraphs().insert(targetParaIndex, clonedPara);
}
// 调整后续段落如矩阵标题与插入内容的间距
ParagraphFormat targetFormat = targetPara.getFormat();
targetFormat.setBeforeSpacing(6f); // 与插入内容保持6磅间距
targetFormat.setPageBreakBefore(false);
// 保存文档
docs1.saveToFile(filePath, FileFormat.Docx_2013);
docs1.dispose();
}
docs2.dispose();
}
// 新增清除文档中的分页符针对文档2
private static void clearPageBreaks(Document doc) {
for (Object obj : doc.getSections()) {
Section section= (Section) obj;
// 遍历段落移除手动分页符假设分页符以特殊字符或元素存在
for (Object obj1 : section.getParagraphs()) {
Paragraph para = (Paragraph) obj1;
String paraText = para.getText();
if (paraText.contains("\f")) {
para.setText(paraText.replace("\f", "")); // 清除分页符字符
}
}
}
}
}