feat: bookmark replace

This commit is contained in:
zzs 2025-03-08 11:03:47 +08:00
parent bad5ee4cc1
commit 0abe958069

View File

@ -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<String> items, int insertPos,
BigInteger numId, BigInteger ilvl, XWPFParagraph originalPara) {
private static void insertNewListItems(XWPFDocument doc, List<String> 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<XWPFParagraph> paragraphs = doc.getParagraphs();
// 处理插入位置超出范围的情况
if (insertPos >= paragraphs.size()) {
return doc.getDocument().getBody().addNewP().newCursor();
for (XWPFParagraph paragraph : paragraphs) {
CTP ctp = paragraph.getCTP();
List<CTBookmark> 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) {