[英]Iterating through word document in OpenXml entering text into bookmarks (losing formatting)
我有一個帶有書簽的word文檔。 書簽非常簡單,不會跨越表格或段落。 以下代碼有效但我丟失了文檔的格式,插入使用了單詞的默認字體和大小等。如何在文檔中輸入文本以保持文檔格式化?
using (var wordDoc = WordprocessingDocument.Open(targetFileName, true))
{
MainDocumentPart mainPart = wordDoc.MainDocumentPart;
var bookmarkStarts = mainPart.Document.Descendants<BookmarkStart>().ToList();
foreach (BookmarkStart bookmarkStart in bookmarkStarts)
{
InsertIntoBookmark(bookmarkStart, "Hello");
}
}
private static void InsertIntoBookmark(BookmarkStart bookmarkStart, string text)
{
OpenXmlElement elem = bookmarkStart.NextSibling();
while (elem != null && !(elem is BookmarkEnd))
{
OpenXmlElement nextElem = elem.NextSibling();
elem.Remove();
elem = nextElem;
}
Run run = new Run();
run.Append(new Text(text));
bookmarkStart.Parent.InsertAfter<Run>(run, bookmarkStart);
}
一種選擇是逐步替換Run中的文本而不是刪除所有內容並插入未格式化的Run。 然而,關於Word的討厭的事情是它有一個習慣,就是應該為一個人插入多個運行,有時甚至將一個單詞分成兩個或多個運行。
我通過使用您的示例中使用的相同循環解決了這個問題,但是我沒有刪除所有內容,而是替換了第一次運行中的文本,並刪除了其余內容,直到您點擊BookmarkEnd。 事情仍然可能出錯(因為Word ...),但我發現它足夠好,可以根據具體情況處理其他任何問題。
您的示例重新設計為替換而不是刪除和插入:
private static void InsertIntoBookmark(BookmarkStart bookmarkStart, string text)
{
OpenXmlElement elem = bookmarkStart.NextSibling();
bool firstRunReplaced = false;
while (elem != null && !(elem is BookmarkEnd))
{
OpenXmlElement nextElem = elem.NextSibling();
if (elem is Run && !firstRunReplaced)
{
((Run)elem).Elements<Text>().First().Text = text;
firstRunReplaced = true;
}
else
{
elem.Remove();
}
elem = nextElem;
}
}
在您的情況下,無法直接完成您要實現的目標。 書簽不會包含任何格式信息,因此復制時不會保留任何格式。
實際的解決方法是手動獲取文檔的默認格式,並嘗試將其應用於插入Run的段落。
除了使用書簽,您還可以使用內容控件,這將使用OOXML在將文本插入到Word文檔中時提供更多額外的靈活性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.