feat: bookmark replace
This commit is contained in:
parent
358f5b2b6d
commit
bad5ee4cc1
@ -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<XWPFParagraph> paragraphs = doc.getParagraphs();
|
||||
List<Integer> indexesToRemove = new ArrayList<>();
|
||||
|
||||
for (int i = 0; i < paragraphs.size(); i++) {
|
||||
XWPFParagraph paragraph = paragraphs.get(i);
|
||||
CTP ctp = paragraph.getCTP();
|
||||
List<CTBookmark> bookmarks = ctp.getBookmarkStartList();
|
||||
List<BookmarkInfo> info = queryBookmarkInfo(paragraph);
|
||||
Map<String, BookmarkInfo> 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<String> items, int insertPos,
|
||||
BigInteger numId, BigInteger ilvl, XWPFParagraph originalPara, XWPFRun xwpfRun) {
|
||||
BigInteger numId, BigInteger ilvl, XWPFParagraph originalPara) {
|
||||
// 获取插入位置的游标锚点
|
||||
XmlCursor cursor = findInsertCursor(doc, insertPos);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user