【问题标题】:Reading Word Bookmarks using Open XML and C#使用 Open XML 和 C# 读取 Word 书签
【发布时间】:2019-07-09 15:20:12
【问题描述】:

我已经阅读了我能找到的与此相关的所有内容(包括Read Word bookmarks),但无法让任何工作。

我正在尝试浏览一个包含书签的 Word 文档,并获取每个书签的值。我可以遍历文档并获取书签的名称,但无法弄清楚如何获取书签的值/文本。

这是我用来获取书签名称的方法:

using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(athleteFile, false))
{
    foreach (BookmarkStart bookmark in wordDocument.MainDocumentPart.Document.Body.Descendants<BookmarkStart>())
    {       
        System.Diagnostics.Debug.WriteLine(bookmark.Name + " - " + bookmark.InnerText);
    }
}

【问题讨论】:

    标签: c# ms-word openxml bookmarks


    【解决方案1】:

    首先,我强烈建议您使用Open XML SDK 2.5 Productivity tool,这样您就可以更好地了解您正在使用的内容。

    其次,Word 中的书签没有任何关联的值。它通常在word文档中标记一个位置。所以你试图做的事情不会奏效。

    <w:bookmarkStart w:name="bkStart" w:id="0" />
    

    这是您在文档中添加书签时在 docx 文件中创建的 XML 元素。

    【讨论】:

    • 谢谢。我试图使用 SDK(我想我应该在描述中包含它)。我查看了 XML,发现由于在文档中使用了文本框和下拉菜单,尝试获取数据会很困难,而且由于这是一次性实用程序,所以我继续使用自动化对象。
    • 太棒了!很高兴我能帮上忙。 :)
    【解决方案2】:

    解决方案 1:

    通过访问其父级的内部文本获取书签文本:

    using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(athleteFile, false))
    {
        foreach (BookmarkStart bookmark in wordDocument.MainDocumentPart.Document.Body.Descendants<BookmarkStart>())
        {       
            // Get name of bookmark
            string bookmarkNameOriginal = bookmark.Name;
    
            // Get bookmark text from parent elements text
            string bookmarkText = bookmark.Parent.InnerText;
        }
    }
    

    解决方案 2:

    我找到了另一个使用 Xceed 的 DocX 的解决方案。

    注意: Reading bookmarks is slow 免费版(v1.3 Docx)。但是它在 Docx 的 v1.4 中得到了修复(免费版本获取此更新的速度较慢)。


    导入 DocX:

    using Xceed.Words.NET;
    

    创建读取书签名称和文本的方法:

    /// <summary>
    /// Read bookmark text/names in word document
    /// </summary>
    /// <param name="filePath"></param>
    /// <remarks>
    /// Uses free DocX by Xceed
    /// </remarks>
    public void ReadBookmarks(string filePath)
    {
        //Load document
        using (DocX Document = DocX.Load(filePath))
        {
            //This is slow in free version (v1.3 Docx), is fixed in v1.4Docx (free version is slower to get this)
            BookmarkCollection bookmarks = Document.Bookmarks;
    
            //Iterate over bookmarks in document
            foreach (Bookmark bookmark in bookmarks) {
                //Name of bookmark
                string bookmarkName = bookmark.Name;
                //Text of bookmark, usually a word heading (1, 2, 3...)
                string bookmarkText = bookmark.Paragraph.Text;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多