如何在Word文档中更新正文和超链接

时间:2019-01-22 17:20:29

标签: c# xml ms-word openxml openxml-sdk

我设法用XSL转换的输出来更新Word文档的主体。现在,我必须向文档添加超链接。超链接的URL转到* .docx文件的zip归档文件中的word/document.xml.rels文件,因此,我要做的不仅仅是更改XSL样式表。

this MSDN post的方法似乎可以工作,但是我无法结合更新正文来使它起作用。

这是我正在处理的代码。这是一个Web应用程序,因此我正在阅读模板Word文档,但未存储任何文件。模板Word文档被传输到Stream,修改为Stream,最后输出为byte[]数组以发送到浏览器。

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;

public static void ReplaceDocumentXml(Stream fsDocx, string strDocumentXml, string LinkId, string LinkUrl)
{
    // Step 1: change the document body
    using (WordprocessingDocument doc = WordprocessingDocument.Open(fsDocx, true))
    {
        MainDocumentPart mainPart = doc.MainDocumentPart;
        // Replace the existing Document Body with the new content.
        mainPart.Document.Body = new Body(strDocumentXml);
        //Save the updated output document.
        //mainPart.Document.Save();
        doc.Save();
    }
    // Step 2: change the Hyperlink
    using (WordprocessingDocument doc = WordprocessingDocument.Open(fsDocx, true))
    {
        MainDocumentPart mainPart = doc.MainDocumentPart;                
        // Search and delete the dummy hyperlink
        IEnumerable<Hyperlink> hLinks = mainPart.Document.Body.Descendants<Hyperlink>();
        foreach (Hyperlink hLink in hLinks)
        {
            if (hLink != null && hLink.Id == LinkId)
            {
                // get hyperlink's relation Id (where path stores)
                HyperlinkRelationship hr = mainPart.HyperlinkRelationships.FirstOrDefault(a => a.Id == hLink.Id);
                if (hr == null)
                {
                    continue;
                }
                else
                {
                    mainPart.DeleteReferenceRelationship(hr);
                    //mainPart.AddHyperlinkRelationship(new Uri(LinkUrl, UriKind.Absolute), true, LinkId);
                    break;
                }
            }
        }
        // add the actual hyperlink
        mainPart.AddHyperlinkRelationship(new Uri(LinkUrl, UriKind.Absolute), true/*IsExternal*/, LinkId);
        //Save the updated output document.               
        doc.Save();
    }
    return;
}

代码分两个步骤。我从一个using块开始了这两个步骤,但是由于找不到并替换了超链接URL,因此我试图更改顺序。在此代码中,我甚至分别保存了每个修改。

主体始终会更新,但是超链接会带来麻烦。如果我在步骤1中更改了超链接,步骤2似乎将从document.xml.rels中删除它。在所示的代码中,foreach循环找不到超链接的ID(“ rId7”),但也无法添加超链接的ID

rId7 ID conflicts with the ID of an existing relationship for the specified source.

现在我在这里做错了什么?如何解决此问题?

对于一个类似的Excel项目,我在github上发现了ClosedXML软件包,极大地简化了OpenXML的使用和电子表格的创建。创建Word文档是否存在类似的东西?

修改

问题似乎出在Descendants<>调用中;它不返回任何对象。奇怪,因为肯定有一个Hyperlink<w:hyperlink r:id='rId7'>)标签。

我试图找到并计算许多<w:p>元素:

IEnumerable<Paragraph> hParagraphs = mainPart.Document.Body.Descendants<Paragraph>();
int Dummy1 = hParagraphs.Count();
int I1 = 0;
foreach(Paragraph par in hParagraphs)
{
    I1++;
}

但是找到零(0)个元素。

与表<tbl>元素相似,因为大多数(所有)文本都在表中;得到零项。

这是实际文档的一部分:

<w:tbl>
...
  <w:tc>
    <w:tcPr>
      ...
    </w:tcPr>
    <w:p>
      <w:pPr>
         ...
      </w:pPr>
      <w:hyperlink r:id='rId7'>
        <w:r>
          <w:rPr>
            ...
          </w:rPr>
          <w:t>click for settings</w:t>
        </w:r>
      </w:hyperlink>
    </w:p>
  </w:tc>

这是怎么了?

0 个答案:

没有答案