feat: bookmark replace

This commit is contained in:
zzs 2025-03-07 14:43:12 +08:00
parent 6e32047bcd
commit 3168c49e1a

View File

@ -52,6 +52,8 @@ public class BookmarkExec {
List<XWPFRun> runs = paragraph.getRuns();
List<BookmarkInfo> info = queryBookmarkInfo(paragraph);
Map<String, BookmarkInfo> bkMap = info.stream().collect(Collectors.toMap(BookmarkInfo::getBookmarkName, bk -> bk));
List<Integer> waitRemoveIdx = new ArrayList<>();
for (Map.Entry<String, BookmarkInfo> 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<CTText> 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());
}
}
/**