Как создать оглавление с помощью OpenXML SDK 2.0?
используя SDK, я создаю документы Word, содержащие отчеты. Эти документы должны иметь оглавление. У кого-нибудь есть полное решение, которому я могу следовать, чтобы понять, как это сделать?
(Я прочитал все на http://openxmldeveloper.org/)
2 ответов
посмотреть четвертый и последний экран-бросание последовательно при добавлении / обновлении TOC в документах OpenXML WordprocessingML Эрик Уайт.
надеюсь, что это поможет!
обновление:
согласно FAQ из форумов MSDN я вижу, что эта функция не поддерживается:
8) как создать TOC (оглавление) в документе Word?
Open XML SDK 2.0 не поддерживает эту функцию. но можно создать небольшой TOC через приложение Word и отражает части TOC с документом Компонент Reflector в инструменте производительности Open XML SDK, чтобы узнать, как создайте TOC программно. для получения более подробной информации, пожалуйста, см.:
обновление 2
основываясь на наших комментариях ниже, я мог бы предложить использовать этот сценарий:
- вы вручную создаете пустой файл DOCX и вставляете в него TOC.
- затем вы сохраняете этот файл и открываете его в OpenXML SDK 2.0 Tool, который предоставляет вам с кодом C# для создания такого пустого файла с заполнителем TOC внутри.
- затем вы программно очищаете все данные, необходимые для этого файла DOCX, и сохраняете его.
- кроме того, вам нужно будет предоставить механизм, который будет автоматически обновлять TOC после сброса данных (или после открытия документа). Есть несколько вариантов сделать это-см. Экран-бросает 3-5 из ссылки на Eric White post, которую я предоставил выше. Особенно, я думаю, вы должны обратить внимание на 5-й один -"показывает, как использовать макрос AutoOpen для обновления TOC при открытии любого документа, содержащего TOC".
все это выглядит немного сложно, но я надеюсь, что помогает.
спасибо Дмитрий Павлов (@DmitryPavlov) за помощь.
Я не хочу давать ответ на свой собственный вопрос, но это просто для иллюстрации шагов, которые я предпринял.
совет для тех, кто заинтересован, чтобы посмотреть 5-часть экрана-литой Эрик Уайт -изучение таблиц содержания в документах WordprocessingML Open XML. Это имеет всю информацию относительно добавления и обновления TOC (am гораздо больше).
мой решение состояло в том, чтобы использовать шаблон (просто обычный пустой документ, который имел стили для всего, что мне нужно: заголовок 1-5, стиль TOC и т. д.). Это особенно полезно в качестве быстрого решения проблемы стилей (новый документ, который имеет Оглавление, будет иметь новый стиль.xml создан; этот файл имеет некоторые дополнительные данные; в результате иерархия в TOC не так, как ожидалось-т. е. Заголовок 2 является дочерним заголовком заголовка 1, Заголовок 3 является дочерним заголовком заголовка 2, так далее.).
таким образом:
создайте документ Word и добавьте все элементы, которые вы ожидаете добавить позже программно (например, заголовок 1-5, оглавление и т. д.). Удалите все содержимое и сохраните документ (причина этого-создание стилей для всех необходимых элементов).
Я лично добавил шаблон (файл, созданный на шаге #1) в качестве ресурса в моем проекте.
-
In ваш код, создайте новую копию шаблона (это будет фактический файл, над которым вы будете работать). Я использовал:
byte[] stream = Properties.Resources.Template; File.WriteAllBytes(@"D:\Template.docx", stream); File.Copy(@"D:\Template.docx", @"D:\New.docx");
очистите все данные в этом документе.
добавьте исходные файлы из screen-cast 2, 3 или 4 в свой проект (для этого см. screen-cast 3) - в конце этих сообщений вы найдете ссылку для загрузки TocAdder.zip. Или просто добавьте ссылку на TocAdder.dll файлы.
-
вставьте TOC. Просто пример:
using (WordprocessingDocument wdoc = WordprocessingDocument.Open(@"D:\New.docx", true)) { XElement firstPara = wdoc .MainDocumentPart .GetXDocument() .Descendants(W.p) .FirstOrDefault(); TocAdder.AddToc(wdoc, firstPara, @"TOC \o '1-3' \h \z \u", null, null); }
-
замените стили во вновь созданном документе на стили из шаблона. Вы можете использовать этот ресурс из MSDN:замена частей стилей в документах Word 2010 с помощью пакета SDK Open XML 2.0. Опять же, пример:
string fromDoc = @"D:\Template.docx"; string toDoc = @"D:\New.docx"; var node = WDExtractStyles(fromDoc, false); if (node != null) WDReplaceStyles(toDoc, node, false); node = WDExtractStyles(fromDoc); if (node != null) WDReplaceStyles(toDoc, node);
необязательно используйте один из методов, описанных в screen-cast 3, 4 или 5 в чтобы обойти проблему с модальным диалоговым окном, которое ставит Word.
надеюсь, это будет полезно для кого-то.