5

我必须实现一个 Microsoft Word 文档生成器,其中嵌入了 excel 图形。我的限制之一是让我生成的 docx 与 Microsoft word 2010 和 2003 + 兼容包一起工作。

我没有设法使它对他们俩都有效。我可以使它适用于 Word 2010,但该文档不适用于 2003,反之亦然。

经过几次搜索以使其适用于 Word 2003,我在我的代码中添加了这个:

    private static void Word2003(ChartPart importedChartPart, MainDocumentPart mainDocumentPart, Stream fileStream)
    {
        var ext = new ExternalData { Id = "rel" + 5 };
        importedChartPart.ChartSpace.InsertAt(ext, 3);


        var fi = new FileInfo(@"generated.xlsx");
        importedChartPart.AddExternalRelationship("http://schemas.openxmlformats.org/officeDocument/2006/relationships/package", new Uri(fi.Name, UriKind.Relative), "rel5");

        EmbeddedPackagePart embeddedObjectPart = mainDocumentPart.AddEmbeddedPackagePart(@"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        Stream copyStream = new MemoryStream();
        fileStream.CopyTo(copyStream);
        embeddedObjectPart.FeedData(copyStream);
    }

但此时生成的文档不适用于 Word 2010。如果我删除这两个 lignes :

 var ext = new ExternalData { Id = "rel" + 5 };
 importedChartPart.ChartSpace.InsertAt(ext, 3);

从以前的代码,它适用于 Word 2010,但不适用于 Word 2003。

我已经尝试了几件事,但我没有设法让它适用于每种情况。

你可以在这里找到这段小代码

先决条件是一个 Excel 文件模板,其中包含图表和图形。


编辑:生成的文档始终适用于 Microsoft Office 2007(是否有两个有问题的代码行)。我还在寻找解决方案!

4

1 回答 1

5

我终于找到了解决方案!

问题是由于两件事:我没有正确放置外部数据并且外部关系是错误的。

这段代码使它工作:

private static void Word2003(ChartPart importedChartPart, MainDocumentPart mainDocumentPart, Stream fileStream)
{
    // Add of the external data id
    ExternalData ext = new ExternalData { Id = "rel" + 5 };
    AutoUpdate autoUpdate = new AutoUpdate{ Val = false};
    ext.Append(autoUpdate);
    importedChartPart.ChartSpace.Append(ext);

    // Set of the relationship
    var fi = new FileInfo(@"generated.xlsx");
    importedChartPart.AddExternalRelationship("http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject", new Uri(fi.Name, UriKind.Relative), "rel5");

    // Link to the embedded file
    EmbeddedPackagePart embeddedObjectPart = mainDocumentPart.AddEmbeddedPackagePart(@"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    Stream copyStream = new MemoryStream();
    fileStream.CopyTo(copyStream);
    embeddedObjectPart.FeedData(copyStream);
}

现在生成的 Word 文档适用于 Word 2003、2007 和 2010。

也许这会对某人有所帮助!

于 2012-09-18T14:35:39.170 回答