Генерация файлов 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 прекрасно открывает файл с первой попытки!