c# - 使用 OpenXML 在 Word 2010 和 2003 中嵌入 Excel 图形

标签 c# excel ms-word openxml-sdk

我必须实现一个 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。如果我删除这两个行:

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

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

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

你可以找到这段小代码here

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


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

最佳答案

我终于找到了解决方案!

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

这段代码让它工作:

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。

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

关于c# - 使用 OpenXML 在 Word 2010 和 2003 中嵌入 Excel 图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12426901/

相关文章:

c# - 带通配符的拼字游戏词查找器

c# - 适用于 Windows Phone 8.1 的 HTML 敏捷包

Excel公式替换第一次出现的字符

excel - Word表格文本中的单元格比较,然后导出数据

c# - Xamarin - Entity Framework - SqLite - GetItemsAsync : unable to open database file

java - 解决 XSSFWorkbook - Java - POI .jar 的问题

c# - 将 N 个 Excel 工作簿中的第 X 个工作表复制到新工作簿中 - 使用哪种语言?

c# - 如何读取 ".doc"文件或如何使用 ASP.NET 将其转换为 ".docx"

vba - 我应该重置 VBA 对象变量还是关闭设置的对象然后设置为新变量?

c# - 意外的相等测试,Equals(a, a) 评估为 false