使用OpenXML SDK在C#中生成PowerPoint文件;验证,但会打开但有错误

时间:2014-02-26 02:28:41

标签: c# openxml openxml-sdk presentationml

我最近开始深入研究OpenXML SDK,希望自动生成PowerPoint演示文稿。我发现整个过程都很痛苦,并且花了大半个周末和最后两天生成一个库来讨论原始的SDK调用。在生成过程中,一切似乎都运行正常,我可以在Open XML SDK Productivity Tool中验证代码是否正确。但是,在PowerPoint中打开文件会导致出现一个对话框,要求我在打开文件之前修复该文件。

所有这些代码都是从我在PowerPoint中创建的文件中反映出来的。在Productivity Tool中对这些包运行差异,我发现我的幻灯片布局(第一个除外)位于/ppt/slideLayouts/slideLayouts/,而正确的演示文稿在/ppt/slideLayouts/中有它们。我已经对生成代码进行了三次检查,并将SlideLayout添加到PresentationPart,而不是SlideLayoutPart。这特别奇怪,因为第一个布局位于正确的位置,后续的布局不是。

我已经阅读了Wouter van Vugt撰写的MSDN文档和Open XML电子书。我将我的代码与反映的代码进行了比较,看起来对我来说是正确的(尽管考虑到我对Open XML的新方式和PresentationML的复杂性,我可能会遗漏很多东西)。有没有人对这里可能发生的事情有任何见解?

1 个答案:

答案 0 :(得分:2)

经过多次反复试验,我终于找到了问题所在。对于演示文稿中的每张幻灯片,我都按照以下步骤操作:

  • SlidePart添加到PresentationPart
  • SlideLayoutPart添加到SlidePart
  • SlideMasterPart添加到SlideLayoutPart
  • ThemePart添加到SlideMasterPart
  • 如果这是第一次使用幻灯片母版,请添加对布局的循环引用

OpenXML SDK必定存在错误,因为首先将SlideLayoutPart添加到SlideMasterPart会导致我在问题中列出的路径问题。这就是为什么第一个布局始终正常工作(它首先添加到幻灯片中)。我现在安排了代码,以便前四个项目符号存在于一个循环中,然后另一个循环遍历所有主程序以查找所有相关的布局,并且仅链接所使用的那些。

没有验证错误,PowerPoint第一次尝试就完全打开了文件!