Как я могу экспортировать часть файла DOCX и сохранить ту же нумерацию абзаца? - PullRequest
0 голосов
/ 11 января 2019

TL; DR:

Как я могу зафиксировать нумерацию абзаца как часть текста и экспортировать его в DOCX?


Задача

У меня есть документ, который разбит на разделы и подразделы, который читается аналогично набору государственных законов (Statute 208, с подразделами Statute 208.1, Statute 208.2 и т. Д.). Мы создали это, изменив файл numbering.xml в ZIP-архиве .docx.

Я хочу экспортировать «подраздел» (208.5) и его текст в отдельный файл .docx. Моя надстройка VSTO экспортирует текст достаточно хорошо, но нумерация сбрасывает в 208.1. Это действительно имеет некоторый смысл, поскольку теперь это первый абзац с этим <ilvl> в документе.

PDF работает нормально

Как ни странно, я могу вызвать функцию Word.Range *1023* и просто экспортировать этот выбор в PDF - даже сохранив нумерацию. Это привело меня к попытке «визуализировать» выделение, возможно, так, как оно будет напечатано, чтобы выбросить его в новый файл .docx, но я также не понял этого.


Что я пробовал:

  • Range.ExportFragment() с использованием wdFormatStrictOpenXMLDocument и wdFormatDocumentDefault в качестве значений wdSaveType.

    • Они экспортируют, но также сбрасывают нумерацию.
  • Document.PrintOut() с использованием PrintToFile = true и допустимым именем файла. Теперь я понимаю, что это, буквально, генерирует «инструкции по распечатке» и не вводит новый файл по пути filename с какой-либо допустимой файловой структурой.

    • Просто не работает. :)
  • Application.Selection.XML для переменной content и вызов Document.Content.InsertXML(content) для вновь добавленного объекта Document.

    • По-прежнему сбрасывает нумерацию.

Раздел кода для контекста

using Word = Microsoft.Office.Interop.Word;

Word.Range range = Application.ActiveDocument.Range(startPosition, endPosition);
range.Select();

//export to DOCX?
Application.Selection.Range.ExportFragment(
    filename, Word.WdSaveFormat.wdFormatDocumentDefault);

Ответы [ 2 ]

0 голосов
/ 11 января 2019

По этой (устаревшей) ссылке есть некоторая полезная информация, которая должна работать с текущими API-интерфейсами Word: https://forums.windowssecrets.com/showthread.php/27711-Determining-which-ListTemplates-item-is-in-use-(VBA-Word-2000)

Информация по этой ссылке предполагает, что вы можете создать имя / дескриптор для вашего ListTemplate, чтобы вы могли ссылаться на него в коде - при условии, что ваши маркеры в стиле статута связаны с именованным стилем для документа. Идея состоит в том, чтобы сначала назвать ListTemplate, связанный со стилем маркера статута для активного документа, а затем ссылаться на это имя при доступе к коллекции ListLevels.

Например, у вас может быть код, который выглядит примерно так:

ActiveDocument.Styles("StatutesBulletStyle").ListTemplate.Name = "StatuteBulletListTemplate";

После вышеуказанного задания вы можете обратиться к шаблону по имени:

ActiveDocument.ListTemplates("StatuteBulletListTemplate").ListLevels(1).StartAt = 5;

Использование вышеуказанной техники больше не требует попытки выяснить, что такое активный шаблон ...

Это помогает?

0 голосов
/ 11 января 2019

Вы можете использовать ConvertNumbersToText (wdNumberAllNumbers) перед экспортом, затем _Document.Undo() или закрыть без сохранения после экспорта.

...