From 0abe9580698b04c8b3e24883d4882ce1036a46b7 Mon Sep 17 00:00:00 2001 From: zzs Date: Sat, 8 Mar 2025 11:03:47 +0800 Subject: [PATCH] feat: bookmark replace --- .../farmwork/word/core/BookmarkExec.java | 53 ++++++------------- 1 file changed, 16 insertions(+), 37 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 982f137..17254ea 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 @@ -3,7 +3,6 @@ package com.wmyun.farmwork.word.core; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.file.FileNameUtil; -import com.google.common.collect.Maps; import com.wmyun.farmwork.word.core.model.BookmarkInfo; import com.wmyun.farmwork.word.core.model.BookmarkReplaceDataModel; import com.wmyun.farmwork.word.core.model.TableBookmarkInfo; @@ -414,11 +413,8 @@ public class BookmarkExec { BigInteger numId = ctNumPr.getNumId().getVal(); BigInteger ilvl = ctNumPr.getIlvl().getVal(); - // 确定原列表段落的范围 - int bookmarkPos = doc.getPosOfParagraph(bookmarkParagraph); - // 插入新的列表项 - insertNewListItems(doc, newListItems, bookmarkPos, numId, ilvl, bookmarkParagraph); + insertNewListItems(doc, newListItems, numId, ilvl, bookmarkParagraph, bookmarkName); // 删除原列表段落 removeOriginalListParagraphs(doc, bookmarkName); @@ -474,29 +470,10 @@ public class BookmarkExec { return numPr; } - private static int findListEndPosition(XWPFDocument doc, int startPos, BigInteger numId) { - int endPos = startPos; - while (endPos < doc.getParagraphs().size()) { - XWPFParagraph p = doc.getParagraphs().get(endPos); - CTNumPr currentNumPr = getNumPr(p); - if (currentNumPr != null && numId.equals(currentNumPr.getNumId().getVal())) { - endPos++; - } else { - break; - } - } - return endPos; - } - - private static CTNumPr getNumPr(XWPFParagraph p) { - CTPPr pPr = p.getCTP().getPPr(); - return (pPr != null) ? pPr.getNumPr() : null; - } - - private static void insertNewListItems(XWPFDocument doc, List items, int insertPos, - BigInteger numId, BigInteger ilvl, XWPFParagraph originalPara) { + private static void insertNewListItems(XWPFDocument doc, List items, + BigInteger numId, BigInteger ilvl, XWPFParagraph originalPara, String bookmarkName) { // 获取插入位置的游标锚点 - XmlCursor cursor = findInsertCursor(doc, insertPos); + XmlCursor cursor = findInsertCursor(doc, bookmarkName); // 循环插入新列表项 for (String item : items) { @@ -516,19 +493,21 @@ public class BookmarkExec { } } - private static XmlCursor findInsertCursor(XWPFDocument doc, int insertPos) { + private static XmlCursor findInsertCursor(XWPFDocument doc, String bookmarkName) { List paragraphs = doc.getParagraphs(); - // 处理插入位置超出范围的情况 - if (insertPos >= paragraphs.size()) { - return doc.getDocument().getBody().addNewP().newCursor(); + for (XWPFParagraph paragraph : paragraphs) { + CTP ctp = paragraph.getCTP(); + List bookmarks = ctp.getBookmarkStartList(); + for (CTBookmark bookmark : bookmarks) { + if (bookmarkName.equals(bookmark.getName())) { + XmlCursor cursor = paragraph.getCTP().newCursor(); + cursor.toNextSibling(); + return cursor; + } + } } - - // 获取锚点段落并创建游标 - XWPFParagraph anchorPara = paragraphs.get(insertPos); - XmlCursor cursor = anchorPara.getCTP().newCursor(); - cursor.toNextSibling(); // 移动到锚点段落之后 - return cursor; + throw new IllegalArgumentException("书签 '" + bookmarkName + "' 未找到"); } private static void copyParagraphStyle(XWPFParagraph source, XWPFParagraph target) {