【问题标题】:How can I use OpenXML SDK 2.5 to copy formulas from a word document?如何使用 OpenXML SDK 2.5 从 Word 文档中复制公式?
【发布时间】:2014-07-10 20:37:24
【问题描述】:

我必须使用带有 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);
            }

        }

【问题讨论】:

  • 如果不知道您的练习[]-array 的内容是什么,这有点难以回答。
  • 练习对象包含一个段落,现在就是这样。在上面的代码中,练习对象的唯一用法是返回该段落的“ex.toParagraph()”。我希望有人能告诉我解决方案。我被这个问题困住了。

标签: c# xml ms-word openxml


【解决方案1】:

发生这种情况是因为在克隆段落时不会复制段落中可以引用的所有内容。 Word XML 格式由多个文件组成,其中一些文件相互引用。如果您将段落从一个文档复制到另一个文档,您还需要复制任何可能存在的关系。

OpenXML Productivity Tool 可用于诊断此类错误。您可以使用该工具打开一个文档并要求它验证该文档。

我创建了一个仅包含超链接的测试文档,并运行您的代码将内容复制到另一个文档。当我尝试使用 Word 加载它时,我也遇到了错误,因此我在生产力工具中打开它并看到以下输出:

这表明超链接存储为关系而不是段落中的内联,并且我的新文件引用了不存在的关系。解压缩原始文件和新文件并比较两者显示发生了什么: 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-paragraphs-in-word-processing-documents-using-the-open-xml-sdk.aspx。

基本上,该博客文章的作者使用Powertools for OpenXML 查找关系并将它们从一个文档复制到另一个文档。

【讨论】:

  • 谢谢你们,你们刚刚为我打开了大门。但是,方程式和图像是否与超链接相同?你有什么建议我注意的吗?
  • @vutran - 我认为方程的问题可能是字体。我创建了一个小测试文件,它创建了与 fontTable.xml 文件的关系。图像存储在单独的媒体文件夹中。
猜你喜欢
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多