![](/img/trans.png)
[英]Can I find the location of text in a Word document using OpenXML SDK?
[英]How can I use OpenXML SDK 2.5 to copy formulas from a word document?
我必須使用帶有C#的OpenXML SDK 2.5來復制一個word文檔中的公式,然后將它們附加到另一個word文檔中。 我嘗試了下面的代碼,它運行成功但是當我試圖打開文件時,它說內容有問題。 我打開它忽略了警告,但沒有顯示那些公式。 它們只是空白塊。
我的代碼:
private void CreateNewWordDocument(string document, Exercise[] exercices)
{
using (WordprocessingDocument wordDoc = WordprocessingDocument.Create(document, WordprocessingDocumentType.Document))
{
// Set the content of the document so that Word can open it.
MainDocumentPart mainPart = wordDoc.AddMainDocumentPart();
SetMainDocumentContent(mainPart);
foreach (Exercise ex in exercices)
{
wordDoc.MainDocumentPart.Document.Body.AppendChild(ex.toParagraph().CloneNode(true));
}
wordDoc.MainDocumentPart.Document.Save();
}
}
// Set content of MainDocumentPart.
private void SetMainDocumentContent(MainDocumentPart part)
{
string docXml =
@"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>
<w:document xmlns:w=""http://schemas.openxmlformats.org/wordprocessingml/2006/main"">
<w:body><w:p><w:r><w:t>Exercise list!</w:t></w:r></w:p></w:body>
</w:document>";
using (Stream stream = part.GetStream())
{
byte[] buf = (new UTF8Encoding()).GetBytes(docXml);
stream.Write(buf, 0, buf.Length);
}
}
發生這種情況是因為克隆段落時不會復制段落中可引用的所有內容。 Word XML格式由多個文件組成,其中一些文件相互引用。 如果將段落從一個文檔復制到另一個文檔,則還需要復制可能存在的任何關系。
OpenXML Productivity Tool可用於診斷這些錯誤。 您可以使用該工具打開文檔並要求其驗證文檔。
我創建了一個測試文檔,其中只包含一個超鏈接並運行您的代碼以將內容復制到另一個文檔。 當我嘗試使用Word加載它時,我也遇到了錯誤,因此我在Productivity Tool中打開它並看到以下輸出:
這表明超鏈接存儲為段落中的關系而不是內聯,我的新文件引用了不存在的關系。 解壓縮原始文件和新文件並比較兩者顯示正在發生的事情:來自original的document.xml
:
原始的.rels
生成文件的document.xml
.rels
生成的文件
請注意,在生成的文件中,超鏈接引用了關系rId5,但在生成的文檔關系文件中不存在。
值得注意的是,對於簡單的源文檔,代碼可以正常工作,因為沒有需要復制的關系。
有兩種方法可以解決這個問題。 最簡單的方法是只復制段落的文本 (你將失去所有的樣式,圖像,超鏈接等),但它非常簡單。 你需要做的就是改變
wordDoc.MainDocumentPart.Document.Body.AppendChild(ex.toParagraph().CloneNode(true));
對於
Paragraph para = wordDoc.MainDocumentPart.Document.Body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text(ex.toParagraph().InnerText));
實現它的更復雜(也許是正確的)方法是找到關系並將它們復制到新文檔中。 這樣做的代碼可能超出了我在這里寫的范圍,但是這里有一篇關於這個主題的有趣文章http://blogs.msdn.com/b/ericwhite/archive/2009/02/05/move- insert-delete-paragraph-in-word-processing-documents-using-open-xml-sdk.aspx 。
本博客文章的作者基本上是使用Powertools for OpenXML來查找關系並將它們從一個文檔復制到另一個文檔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.