我设法用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>
这是怎么了?