Спасибо Дмитрию Павлову (@DmitryPavlov) за помощь.
Я не хочу давать ответ на свой вопрос, но это просто для иллюстрации шагов, которые я предпринял.
Совет для всех, кто интересуется, - посмотреть экранирование из 5 частей Эрика Уайта - Изучение оглавления в документах Word XML OpenprocessingML . Здесь есть вся информация о добавлении и обновлении оглавления (гораздо больше).
Мое решение состояло в том, чтобы использовать Шаблон (просто обычный пустой документ, в котором были стили для всего, что мне было нужно: заголовок 1-5, стиль оглавления и т. Д.). Это особенно полезно в качестве быстрого решения проблемы стилей (в новом документе с оглавлением будет создан новый style.xml; в этом файле есть некоторые дополнительные данные; в результате иерархия в оглавлении не ожидается - т.е. заголовок 2 является дочерним для заголовка 1, заголовок 3 является дочерним для заголовка 2 и т. д.).
Таким образом:
Создайте документ Word и добавьте все элементы, которые, как вы ожидаете, будут добавлены позже программно (например, Заголовок 1-5, Оглавление и т. Д.). Удалите все содержимое и сохраните документ (причина заключается в создании стилей для всех необходимых элементов).
Я лично добавил шаблон (файл, созданный на шаге 1) в качестве ресурса в моем проекте.
В своем коде создайте новую копию шаблона (это будет фактический файл, над которым вы будете работать). Я использовал:
byte[] stream = Properties.Resources.Template;
File.WriteAllBytes(@"D:\Template.docx", stream);
File.Copy(@"D:\Template.docx", @"D:\New.docx");
Сбросить все данные в этом документе.
Добавьте исходные файлы из скриншотов 2, 3 или 4 в свой проект (см. Скриншот 3) - в конце этих постов вы найдете ссылку для загрузки TocAdder .zip . Или просто добавьте ссылку на TocAdder.dll .
Вставьте оглавление. Просто пример:
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 с помощью Open XML SDK 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);
При желании можно использовать один из методов, описанных в скриншоте 3, 4 или 5, чтобы обойти проблему с модальным диалоговым окном, которое выдает Word.
Надеюсь, это кому-нибудь пригодится.