簡體   English   中英

如何使用OpenXML SDK 2.5從word文檔復制公式?

[英]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 從原始文檔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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM