Как создать оглавление с помощью OpenXML SDK 2.0? - PullRequest
10 голосов
/ 19 марта 2012

Используя SDK, я создаю документы Word, содержащие отчеты. Эти документы должны иметь оглавление. У кого-нибудь есть полное решение, которому я могу следовать, чтобы понять, как это сделать?

(Я прочитал все на http://openxmldeveloper.org/)

Ответы [ 3 ]

9 голосов
/ 19 марта 2012

Взгляните на Четвертый и последний снимок экрана в серии по добавлению / обновлению оглавления в документах OpenXML WordprocessingML Эрика Уайта.

Надеюсь, это поможет!

ОБНОВЛЕНИЕ:


Согласно FAQ на форумах MSDN Я вижу, что эта функция не поддерживается:

8) Как создать оглавление (оглавление) в документе Word?

Open XML SDK 2.0 не поддерживает эту функцию. Но вы можете создать небольшое оглавление через приложение Word и отразить части оглавления с компонентом Document Reflector в инструменте повышения производительности Open XML SDK, чтобы увидеть, как программно генерировать оглавление. Для получения более подробной информации, пожалуйста, обратитесь к:


ОБНОВЛЕНИЕ 2


Основываясь на наших комментариях ниже, я мог бы предложить использовать этот сценарий:

  1. Вы вручную создаете пустой файл DOCX и вставляете в него оглавление.
  2. Затем вы сохраняете этот файл и открываете его в OpenXML SDK 2.0 Tool, который предоставляет вам код C # для создания такого пустого файла с заполнителем TOC внутри.
  3. Затем вы программно сбрасываете все данные, которые вам нужны, в этот файл DOCX и сохраняете его.
  4. Кроме того, вам потребуется предоставить механизм, который будет автоматически обновлять TOC после сброса данных (или один раз).документ открыт).Для этого есть несколько вариантов - см. Скриншоты 3-5 по ссылке на пост Эрика Уайта, который я предоставил выше.В частности, я думаю, вы должны обратить ваше внимание на 5-й один - " Показывает, как использовать макрос AutoOpen для обновления оглавления при каждом открытии любого документа, содержащего оглавление".

Все это выглядит немного сложнее, но я надеюсь, что это поможет.

3 голосов
/ 23 марта 2012

Спасибо Дмитрию Павлову (@DmitryPavlov) за помощь.

Я не хочу давать ответ на свой вопрос, но это просто для иллюстрации шагов, которые я предпринял.

Совет для всех, кто интересуется, - посмотреть экранирование из 5 частей Эрика Уайта - Изучение оглавления в документах Word XML OpenprocessingML . Здесь есть вся информация о добавлении и обновлении оглавления (гораздо больше).

Мое решение состояло в том, чтобы использовать Шаблон (просто обычный пустой документ, в котором были стили для всего, что мне было нужно: заголовок 1-5, стиль оглавления и т. Д.). Это особенно полезно в качестве быстрого решения проблемы стилей (в новом документе с оглавлением будет создан новый style.xml; в этом файле есть некоторые дополнительные данные; в результате иерархия в оглавлении не ожидается - т.е. заголовок 2 является дочерним для заголовка 1, заголовок 3 является дочерним для заголовка 2 и т. д.).

Таким образом:

  1. Создайте документ Word и добавьте все элементы, которые, как вы ожидаете, будут добавлены позже программно (например, Заголовок 1-5, Оглавление и т. Д.). Удалите все содержимое и сохраните документ (причина заключается в создании стилей для всех необходимых элементов).

  2. Я лично добавил шаблон (файл, созданный на шаге 1) в качестве ресурса в моем проекте.

  3. В своем коде создайте новую копию шаблона (это будет фактический файл, над которым вы будете работать). Я использовал:

    byte[] stream = Properties.Resources.Template;
    File.WriteAllBytes(@"D:\Template.docx", stream);
    File.Copy(@"D:\Template.docx", @"D:\New.docx");
    
  4. Сбросить все данные в этом документе.

  5. Добавьте исходные файлы из скриншотов 2, 3 или 4 в свой проект (см. Скриншот 3) - в конце этих постов вы найдете ссылку для загрузки TocAdder .zip . Или просто добавьте ссылку на TocAdder.dll .

  6. Вставьте оглавление. Просто пример:

    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);
    }
    
  7. Заменить стили во вновь созданном документе на стили из шаблона. Вы можете использовать этот ресурс из 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);
    
  8. При желании можно использовать один из методов, описанных в скриншоте 3, 4 или 5, чтобы обойти проблему с модальным диалоговым окном, которое выдает Word.

Надеюсь, это кому-нибудь пригодится.

1 голос
/ 18 февраля 2019

Если у вас есть поле TOC, это приведет к его обновлению при открытии документа в Word (тело является ссылкой на тело документа):

DocumentFormat.OpenXml.Wordprocessing.SimpleField f;
f = new SimpleField();
f.Instruction="sdtContent";
f.Dirty = true;
body.Append(f);
...