首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Open XML SDK替换Word文件中的书签文本

使用Open XML SDK替换Word文件中的书签文本
EN

Stack Overflow用户
提问于 2010-07-22 19:27:02
回答 11查看 52.9K关注 0票数 22

我认为v2.0更好……他们有一些很好的“如何:...”examples,但书签似乎不像表格那样明显……书签是由两个 XML元素BookmarkStartBookmarkEnd定义的。我们有一些模板的文本作为书签,我们只是想用一些其他的文本替换书签…没有奇怪的格式,但我如何选择/替换书签文本?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2010-07-23 21:08:14

以下是我在使用你们作为灵感后的方法:

  IDictionary<String, BookmarkStart> bookmarkMap = 
      new Dictionary<String, BookmarkStart>();

  foreach (BookmarkStart bookmarkStart in file.MainDocumentPart.RootElement.Descendants<BookmarkStart>())
  {
      bookmarkMap[bookmarkStart.Name] = bookmarkStart;
  }

  foreach (BookmarkStart bookmarkStart in bookmarkMap.Values)
  {
      Run bookmarkText = bookmarkStart.NextSibling<Run>();
      if (bookmarkText != null)
      {
          bookmarkText.GetFirstChild<Text>().Text = "blah";
      }
  }
票数 20
EN

Stack Overflow用户

发布于 2012-01-12 18:24:02

将书签替换为单个内容(可能是多个文本块)。

public 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;
    }

    bookmarkStart.Parent.InsertAfter<Run>(new Run(new Text(text)), bookmarkStart);
}

首先,删除start和end之间的现有内容。然后,在开始之后(结束之前)直接添加一个新的运行。

但是,不确定书签在打开时是在另一节中关闭,还是在不同的表格单元格中关闭,等等。

对我来说,现在就足够了。

票数 9
EN

Stack Overflow用户

发布于 2013-04-22 21:45:31

经过几个小时之后,我编写了这个方法:

    Public static void ReplaceBookmarkParagraphs(WordprocessingDocument doc, string bookmark, string text)
    {
        //Find all Paragraph with 'BookmarkStart' 
        var t = (from el in doc.MainDocumentPart.RootElement.Descendants<BookmarkStart>()
                 where (el.Name == bookmark) &&
                 (el.NextSibling<Run>() != null)
                 select el).First();
        //Take ID value
        var val = t.Id.Value;
        //Find the next sibling 'text'
        OpenXmlElement next = t.NextSibling<Run>();
        //Set text value
        next.GetFirstChild<Text>().Text = text;

        //Delete all bookmarkEnd node, until the same ID
        deleteElement(next.GetFirstChild<Text>().Parent, next.GetFirstChild<Text>().NextSibling(), val, true);
    }

在那之后,我调用:

Public static bool deleteElement(OpenXmlElement parentElement, OpenXmlElement elem, string id, bool seekParent)
{
    bool found = false;

    //Loop until I find BookmarkEnd or null element
    while (!found && elem != null && (!(elem is BookmarkEnd) || (((BookmarkEnd)elem).Id.Value != id)))
    {
        if (elem.ChildElements != null && elem.ChildElements.Count > 0)
        {
            found = deleteElement(elem, elem.FirstChild, id, false);
        }

        if (!found)
        {
            OpenXmlElement nextElem = elem.NextSibling();
            elem.Remove();
            elem = nextElem;
        }
    }

    if (!found)
    {
        if (elem == null)
        {
            if (!(parentElement is Body) && seekParent)
            {
                //Try to find bookmarkEnd in Sibling nodes
                found = deleteElement(parentElement.Parent, parentElement.NextSibling(), id, true);
            }
        }
        else
        {
            if (elem is BookmarkEnd && ((BookmarkEnd)elem).Id.Value == id)
            {
                found = true;
            }
        }
    }

    return found;
}

如果你没有空的书签,这段代码运行得很好。我希望它能帮助一些人。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3308299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档