From 3168c49e1a08315ca6400a2d1d43f5ee293ef504 Mon Sep 17 00:00:00 2001 From: zzs Date: Fri, 7 Mar 2025 14:43:12 +0800 Subject: [PATCH] feat: bookmark replace --- .../farmwork/word/core/BookmarkExec.java | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/BookmarkExec.java b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/BookmarkExec.java index 197055f..5e44744 100644 --- a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/BookmarkExec.java +++ b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/BookmarkExec.java @@ -52,6 +52,8 @@ public class BookmarkExec { List runs = paragraph.getRuns(); List info = queryBookmarkInfo(paragraph); Map bkMap = info.stream().collect(Collectors.toMap(BookmarkInfo::getBookmarkName, bk -> bk)); + + List waitRemoveIdx = new ArrayList<>(); for (Map.Entry bk : bkMap.entrySet()) { String name = bk.getKey(); BookmarkInfo bkInfo = bk.getValue(); @@ -63,16 +65,23 @@ public class BookmarkExec { int endIdx = bkInfo.getEndIdx(); XWPFRun run = runs.get(startIdx); CTR ctr = run.getCTR(); - List tList = ctr.getTList(); + // 修改第一个run的内容 for (int i = 0; i < ctr.getTList().size(); i++) { ctr.removeT(i); } CTText newTextNode = ctr.addNewT(); newTextNode.setStringValue(model.getExtData().getValue()); - for (int i = 0; i < endIdx - startIdx; i++) { - paragraph.removeRun(i); + + // 删除其余的run + for (int i = startIdx + 1; i < endIdx; i++) { + waitRemoveIdx.add(i); } } + + waitRemoveIdx.sort(Comparator.naturalOrder()); + for (Integer idx : waitRemoveIdx) { + paragraph.removeRun(idx); + } } File outFile = FileUtil.newFile(tmpDir + "gen/" + FileNameUtil.getName(file)); @@ -120,7 +129,7 @@ public class BookmarkExec { CTR ctr = run.getCTR(); Node node = ctr.getDomNode(); Node currentNode = node.getPreviousSibling(); - + int idx = runs.indexOf(run); // 递归查找前一个兄弟节点 while (currentNode != null) { String nodeName = currentNode.getNodeName(); @@ -131,7 +140,7 @@ public class BookmarkExec { // 匹配书签ID或名称 if (id.equals(info.getBookmarkId())) { - info.setStartIdx(i); // 记录当前Run的索引为起始位置 + info.setStartIdx(idx); // 记录当前Run的索引为起始位置 foundStart = true; break; } @@ -142,7 +151,7 @@ public class BookmarkExec { // 匹配书签ID if (id.equals(info.getBookmarkId())) { - info.setEndIdx(i); // 记录当前Run的索引为结束位置 + info.setEndIdx(idx); // 记录当前Run的索引为结束位置 foundEnd = true; break; } @@ -155,6 +164,10 @@ public class BookmarkExec { break; } } + + if (!foundEnd) { + info.setEndIdx(runs.size()); + } } /**