使用Open XML和C#读取Word书签

时间:2014-01-14 00:47:57

标签: c# ms-word openxml bookmarks

我已经阅读了我能找到的与此相关的所有内容(包括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);
    }
}

2 个答案:

答案 0 :(得分:0)

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

其次,Word中的书签没有任何与之关联的值。它通常标记word文档中的位置。所以你要做的就是不行。

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

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

答案 1 :(得分:0)

解决方案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是免费版本(Docx v1.3)。但是,它已在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;
        }
    }
}