feat: bookmark replace
This commit is contained in:
parent
bad5ee4cc1
commit
0abe958069
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user