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.FileUtil;
|
||||||
import cn.hutool.core.io.IoUtil;
|
import cn.hutool.core.io.IoUtil;
|
||||||
import cn.hutool.core.io.file.FileNameUtil;
|
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.BookmarkInfo;
|
||||||
import com.wmyun.farmwork.word.core.model.BookmarkReplaceDataModel;
|
import com.wmyun.farmwork.word.core.model.BookmarkReplaceDataModel;
|
||||||
import com.wmyun.farmwork.word.core.model.TableBookmarkInfo;
|
import com.wmyun.farmwork.word.core.model.TableBookmarkInfo;
|
||||||
@ -414,11 +413,8 @@ public class BookmarkExec {
|
|||||||
BigInteger numId = ctNumPr.getNumId().getVal();
|
BigInteger numId = ctNumPr.getNumId().getVal();
|
||||||
BigInteger ilvl = ctNumPr.getIlvl().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);
|
removeOriginalListParagraphs(doc, bookmarkName);
|
||||||
|
|
||||||
@ -474,29 +470,10 @@ public class BookmarkExec {
|
|||||||
return numPr;
|
return numPr;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int findListEndPosition(XWPFDocument doc, int startPos, BigInteger numId) {
|
private static void insertNewListItems(XWPFDocument doc, List<String> items,
|
||||||
int endPos = startPos;
|
BigInteger numId, BigInteger ilvl, XWPFParagraph originalPara, String bookmarkName) {
|
||||||
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) {
|
|
||||||
// 获取插入位置的游标锚点
|
// 获取插入位置的游标锚点
|
||||||
XmlCursor cursor = findInsertCursor(doc, insertPos);
|
XmlCursor cursor = findInsertCursor(doc, bookmarkName);
|
||||||
|
|
||||||
// 循环插入新列表项
|
// 循环插入新列表项
|
||||||
for (String item : items) {
|
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();
|
List<XWPFParagraph> paragraphs = doc.getParagraphs();
|
||||||
|
|
||||||
// 处理插入位置超出范围的情况
|
for (XWPFParagraph paragraph : paragraphs) {
|
||||||
if (insertPos >= paragraphs.size()) {
|
CTP ctp = paragraph.getCTP();
|
||||||
return doc.getDocument().getBody().addNewP().newCursor();
|
List<CTBookmark> bookmarks = ctp.getBookmarkStartList();
|
||||||
|
for (CTBookmark bookmark : bookmarks) {
|
||||||
|
if (bookmarkName.equals(bookmark.getName())) {
|
||||||
|
XmlCursor cursor = paragraph.getCTP().newCursor();
|
||||||
|
cursor.toNextSibling();
|
||||||
|
return cursor;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
throw new IllegalArgumentException("书签 '" + bookmarkName + "' 未找到");
|
||||||
// 获取锚点段落并创建游标
|
|
||||||
XWPFParagraph anchorPara = paragraphs.get(insertPos);
|
|
||||||
XmlCursor cursor = anchorPara.getCTP().newCursor();
|
|
||||||
cursor.toNextSibling(); // 移动到锚点段落之后
|
|
||||||
return cursor;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void copyParagraphStyle(XWPFParagraph source, XWPFParagraph target) {
|
private static void copyParagraphStyle(XWPFParagraph source, XWPFParagraph target) {
|
||||||
|
Loading…
Reference in New Issue
Block a user