Генерация файлов PowerPoint в C# с OpenXML SDK; Проверяет, но открывается с ошибками

Недавно я начал копаться в OpenXML SDK в надежде автоматически создать презентацию PowerPoint. Я счел весь процесс болезненным и провел большую часть выходных и последние два дня, создавая библиотеку для обработки необработанных вызовов SDK. В процессе генерации все работает нормально, и я могу проверить правильность кода в инструменте повышения производительности Open XML SDK. Однако при открытии файла в PowerPoint появляется диалоговое окно с просьбой исправить файл перед его открытием.

Весь этот код реорганизован из того, что я отразил в файле, созданном в PowerPoint. Запустив различие с этими пакетами в инструменте повышения производительности, я обнаружил, что мои макеты слайдов (за исключением первого) находятся в /ppt/slideLayouts/slideLayouts/в то время как правильная презентация содержит их в /ppt/slideLayouts/, Я трижды проверил мой генерирующий код, и он добавляет SlideLayout к PresentationPartне SlideLayoutPart, Это особенно странно, потому что первый макет находится в правильном месте, а последующие - нет.

Я прочитал документацию MSDN и электронную книгу Open XML Wouter van Vugt. Я сравнил свой код с отраженным кодом, и он мне кажется правильным (хотя я мог упустить много вещей, учитывая, насколько я новичок в Open XML и сложность PresentationML). У кого-нибудь есть понимание того, что может происходить здесь?

1 ответ

После долгих проб и ошибок я наконец нашел проблему. Для каждого слайда в презентации я выполнял следующие шаги:

  • добавлять SlidePart в PresentationPart
  • добавлять SlideLayoutPart в SlidePart
  • добавлять SlideMasterPart в SlideLayoutPart
  • добавлять ThemePart в SlideMasterPart
  • Если это первый случай использования слайд-мастера, добавьте круговые ссылки на макеты

Там должно быть ошибка с OpenXML SDK, потому что добавление SlideLayoutPart к SlideMasterPart Сначала вызывает проблемы пути, которые я изложил в своем вопросе. Вот почему первый макет всегда работал правильно (он был добавлен первым к слайду). Теперь я скомпоновал код так, чтобы первые четыре маркера существовали в одном цикле, затем другой цикл проходит по всем мастерам, чтобы найти все связанные макеты, и связывает только те, которые используются.

Нет ошибок проверки, и PowerPoint прекрасно открывает файл с первой попытки!

Другие вопросы по тегам