[英]A quick method to remove a huge number of bookmarks from a Word document
我正在尋找從 MS Word 中打開的 docx 文件中刪除書簽的快速代碼。
現在,我使用簡單的 VBA 宏,並根據經驗進行一些改進。
Public Sub RemoveBookmarks(ByRef doc As Document)
Dim b As Bookmark
Dim i As Long
For Each b In doc.Bookmarks
b.Delete
'There were documents freeze Word after delete only 4 bookmarks
i = i + 1
If i Mod 4 = 0 Then
doc.UndoClear
End If
'to handle possible Ctrl+Break
If i Mod 100 = 0 Then
DoEvents
End If
Next b
Set b = Nothing
End Sub
我的同事經常有大型文檔(超過 1,2k 頁)和 25k 或更多書簽。 刪除此書簽需要很長時間。
使用 DocumentOpenXml 刪除書簽和操作 WordProcessingDocument 非常快:
public static void RemoveAllBookmarks(string fileName)
{
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(fileName, true))
{
var d = wordDoc.MainDocumentPart.Document;
var bstart = d.Descendants<BookmarkStart>().ToList();
foreach (var s in bstart)
s.Remove();
var bend = d.Descendants<BookmarkEnd>().ToList();
foreach (var e in bend)
e.Remove();
d.Save();
wordDoc.Save();
}
}
但我想避免再次在 Word 中關閉和打開文檔,因為添加和刪除書簽是較大過程的一部分。 我不想(我認為我不能)預測文檔准備過程是否會更快:只需使用 VBA 刪除或多次關閉、刪除和打開大文件。
也許有解決方案可以在打開的文檔下操作 WordprocessingDocument 並插入 xml。
每當您從集合中刪除項目時,您都需要從頭開始並向后工作。
Public Sub RemoveBookmarks(ByRef doc As Document)
Dim b As Long
For b = doc.Bookmarks.Count To 1 Step -1
doc.Bookmarks(b).Delete
Next b
End Sub
如果要轉換已打開的 Word 文檔,可以使用Document
或Range
實例的WordOpenXML
屬性獲取文檔或范圍的 Flat OPC 格式的 Open XML 標記。 然后,您可以通過以下方式使用該 XML 字符串:
DocumentFormat.OpenXml
NuGet package(打開 XML SDK),您可以將 Flat OPC 字符串轉換為WordprocessingDocument
並按照您的描述進行轉換。System.Xml.Linq
) 和DocumentFormat.OpenXml.Linq
NuGet package,你可以把它變成一個沒有XElement
的WordprocessingDocument
轉換標記后,您可以使用Range.InsertXML()
方法將其轉回平面 OPC 字符串並將其重新插入到 Word 文檔中。
轉換 Open XML 標記比使用 COM API 快一到兩個數量級,如果您需要許多 COM 調用來創建所需的結果。 但請注意,從打開的文檔中檢索 Open XML 標記並將其插入回文檔中也不是免費的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.