簡體   English   中英

從Word文檔中刪除大量書簽的快速方法

[英]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 文檔,可以使用DocumentRange實例的WordOpenXML屬性獲取文檔或范圍的 Flat OPC 格式的 Open XML 標記。 然后,您可以通過以下方式使用該 XML 字符串:

  • 使用DocumentFormat.OpenXml NuGet package(打開 XML SDK),您可以將 Flat OPC 字符串轉換為WordprocessingDocument並按照您的描述進行轉換。
  • 使用 LINQ 到 XML ( System.Xml.Linq ) 和DocumentFormat.OpenXml.Linq NuGet package,你可以把它變成一個沒有XElementWordprocessingDocument

轉換標記后,您可以使用Range.InsertXML()方法將其轉回平面 OPC 字符串並將其重新插入到 Word 文檔中。

轉換 Open XML 標記比使用 COM API 快一到兩個數量級,如果您需要許多 COM 調用來創建所需的結果。 但請注意,從打開的文檔中檢索 Open XML 標記並將其插入回文檔中也不是免費的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM