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 38230b6..982f137 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 @@ -414,19 +414,43 @@ public class BookmarkExec { BigInteger numId = ctNumPr.getNumId().getVal(); BigInteger ilvl = ctNumPr.getIlvl().getVal(); - XWPFRun originRun = bookmarkParagraph.getRuns().get(0); - // 确定原列表段落的范围 int bookmarkPos = doc.getPosOfParagraph(bookmarkParagraph); - int endPos = findListEndPosition(doc, bookmarkPos, numId); // 插入新的列表项 - insertNewListItems(doc, newListItems, bookmarkPos, numId, ilvl, bookmarkParagraph, originRun); + insertNewListItems(doc, newListItems, bookmarkPos, numId, ilvl, bookmarkParagraph); // 删除原列表段落 - removeOriginalListParagraphs(doc, bookmarkPos, endPos); + removeOriginalListParagraphs(doc, bookmarkName); } + private static void removeOriginalListParagraphs(XWPFDocument doc, String bookmarkName) { + List paragraphs = doc.getParagraphs(); + List indexesToRemove = new ArrayList<>(); + + for (int i = 0; i < paragraphs.size(); i++) { + XWPFParagraph paragraph = paragraphs.get(i); + CTP ctp = paragraph.getCTP(); + List bookmarks = ctp.getBookmarkStartList(); + List info = queryBookmarkInfo(paragraph); + Map bkMap = info.stream() + .collect(Collectors.toMap(BookmarkInfo::getBookmarkName, bk -> bk)); + for (CTBookmark bookmark : bookmarks) { + if (bookmark.getName().equals(bookmarkName)) { + if (bkMap.containsKey(bookmarkName) && bkMap.get(bookmarkName).isListMark()) { + indexesToRemove.add(i); + break; + } + } + } + } + + Collections.reverse(indexesToRemove); + for (int index : indexesToRemove) { + doc.removeBodyElement(doc.getBodyElements().indexOf(paragraphs.get(index))); + } + } + private static XWPFParagraph findBookmarkParagraph(XWPFDocument doc, String bookmarkName) { for (XWPFParagraph p : doc.getParagraphs()) { for (CTBookmark bookmark : p.getCTP().getBookmarkStartList()) { @@ -469,14 +493,8 @@ public class BookmarkExec { return (pPr != null) ? pPr.getNumPr() : null; } - private static void removeOriginalListParagraphs(XWPFDocument doc, int start, int end) { - for (int i = end - 1; i >= start; i--) { - doc.removeBodyElement(doc.getPosOfParagraph(doc.getParagraphs().get(i))); - } - } - private static void insertNewListItems(XWPFDocument doc, List items, int insertPos, - BigInteger numId, BigInteger ilvl, XWPFParagraph originalPara, XWPFRun xwpfRun) { + BigInteger numId, BigInteger ilvl, XWPFParagraph originalPara) { // 获取插入位置的游标锚点 XmlCursor cursor = findInsertCursor(doc, insertPos);