Office.Interop.Word и списки с подуровнями - PullRequest
0 голосов
/ 19 декабря 2018

Я искал в интернете документацию, которая позволила мне создавать списки.При этом мне не удалось найти какую-либо документацию, которая позволила бы мне создавать `списки в списках.

Я пытался использовать встроенный рекордер макросов, но по какой-то причине онведет себя по-разному при записи и когда не записывается (например, когда я создаю элемент списка и нажимаю клавишу ВВОД +, он не создает подсписок).

Я нашел сообщение MSDN "The Wordmeister's"что помогло мне составить список, но списки в списках не очень хорошо работают для меня.

            Word.Paragraph p2 = doc.Paragraphs.Add();
            Word.Range p2rng = p2.Range;
            object oTrue = true;
            object oFalse = false;
            object oListName = "TreeList";

            Word.ListTemplate lstTemp = doc.ListTemplates.Add(ref oTrue, ref oListName);
            int l;

            p2rng.ParagraphFormat.TabIndent(1);
            p2rng.Text = "Rates:\r\nLevel 1\rLevel 1.1\rLevel 1.2\rLevel 2\rLevel 2.1\rLevel 2.1.1";

            l = 1;
            lstTemp.ListLevels[l].NumberFormat = "%" + l.ToString() + ".";
            lstTemp.ListLevels[l].NumberStyle = Word.WdListNumberStyle.wdListNumberStyleArabic;
            lstTemp.ListLevels[l].NumberPosition = wordApp.CentimetersToPoints(0.5f * (l - 1));
            lstTemp.ListLevels[l].TextPosition = wordApp.CentimetersToPoints(0.5f * l);
            l = 2;
            lstTemp.ListLevels[l].NumberFormat = "%" + (l - 1).ToString() + ".%" + l.ToString() + ".";
            lstTemp.ListLevels[l].NumberStyle = Word.WdListNumberStyle.wdListNumberStyleArabic;
            lstTemp.ListLevels[l].NumberPosition = wordApp.CentimetersToPoints(0.5f * (l - 1));
            lstTemp.ListLevels[l].TextPosition = wordApp.CentimetersToPoints(0.5f * l);
            l = 3;
            lstTemp.ListLevels[l].NumberFormat = "%" + (l - 2).ToString() + "%" + (l - 1).ToString() + ".%" + l.ToString() + ".";
            lstTemp.ListLevels[l].NumberStyle = Word.WdListNumberStyle.wdListNumberStyleArabic;
            lstTemp.ListLevels[l].NumberPosition = wordApp.CentimetersToPoints(0.5f * (l - 1));
            lstTemp.ListLevels[l].TextPosition = wordApp.CentimetersToPoints(0.5f * l);
            object oListApplyTo = Word.WdListApplyTo.wdListApplyToWholeList;
            object oListBehavior = Word.WdDefaultListBehavior.wdWord10ListBehavior;

            p2rng.ListFormat.ApplyListTemplate(lstTemp, ref oFalse, ref oListApplyTo, ref oListBehavior);

Весь кредит Синди Мейстер за этот код, он лишь немного изменен, чтобы работать для моего использованияcase.

Выше приведено следующее:

enter image description here

В основном, как вы создаете многоуровневые списки (как на следующем изображении) со списками в списках?

enter image description here

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

На самом деле невозможно создать «список в списке» в Word.

Что вы можете сделать, это поместить статический текст на уровне списка перед динамическим числом.Это та же идея, что и при использовании «Chapter» или «Section» перед номером уровня, за исключением того, что в этом случае это должен быть символ маркера.

Место для определения этого на основе примера кода ввопрос:

lstTemp.ListLevels[l].NumberFormat = "%" + l.ToString() + ".";

как часть строки NumberFormat, другими словами.Для symobls это потребует преобразования из шестнадцатеричного или десятичного Unicode в тип данных String.Например, для сплошной круглой маркировки и контура круглой маркировки для уровней 1 и 2 соответственно (жесткое кодирование уровня списка для ясности):

char Symbol1 = (char)9679;
char Symbol2 = (char)9675;
lstTemp.ListLevels[1].NumberFormat = Symbol1.ToString() + "\t%" + l.ToString() + ".";
lstTemp.ListLevels[2].NumberFormat = Symbol2.ToString() + "\t%" + 2.ToString() + ".";
0 голосов
/ 20 декабря 2018

Давайте попробуем предоставить ответ, который не удаляется.

Обновленный пример списка в списках, предоставленный @Jaberwocky, может быть достигнут с использованием метода, который я объяснил в предыдущем посте.

MS-Word: перекрестная ссылка на пользовательский тип ссылки

Чтобы применить вышеупомянутое к конкретному экземпляру, требуемому @Jaberwock, нам нужно изменить числовые форматы шаблонов списка, с которыми связаны стили.,Я буду использовать Word для настройки стилей и требуемого многоуровневого списка, а затем включу короткий макрос VBA, который показывает, как изменить формат номера списка.

В соответствии с приведенной выше ссылкой, нам сначала нужно создать наши стили,Для эмуляции списка в приведенном выше примере нам нужно определить два стиля.Я определил «ListWithinList 1» и «ListWithinList 2».

Ключевыми настройками для этих двух стилей являются установка уровня контура на 1 и 2 соответственно и установка соответствующих позиций табуляции.Я использовал вкладки на 1,2,3 и 4 см.Добавьте текст в документ Word и примените стили.Я включил панель навигации на рисунке ниже, чтобы мы могли видеть отступы из-за уровня структуры стилей

enter image description here

Следующий шагсостоит в том, чтобы определить многоуровневый список и связать каждый уровень с соответствующим стилем

Настройки для уровня контура 1

enter image description here

Настройки для уровня контура2

enter image description here

Наш текст теперь выглядит следующим образом

enter image description here

IДо этого момента Word использовался во избежание утомительной программной настройки стилей и шаблонов списков.

Давайте теперь изменим формат нумерации списка, используя фрагмент VBA.

Option Explicit

Public Sub AddTextToListNumber()

Dim my_prefix(1 To 2)                   As String
Dim my_index                            As Long

    my_prefix(1) = ChrW(&H25AA) & vbTab ' small black square
    my_prefix(2) = ChrW(&H25AB) & vbTab ' small white square

    For my_index = 1 To 2

        With ActiveDocument.Styles("ListWithinList " & CStr(my_index)).ListTemplate.ListLevels(my_index)
            .numberformat = my_prefix(my_index) & .numberformat
        End With
    Next

End Sub  

Если мы запустим приведенный выше код, то текст в нашем документе станет

enter image description here

Что выглядит немного некрасиво из-за остановки вкладки 1 см.

Если выше есть что-то неясное, добавьте комментарий, и, если возможно, я обновлю ответ.

НЕТTE: Нам не требовался код VBA для завершения настройки форматов списка, поскольку мы могли использовать соответствующие комбинации клавиш Alt + XXXX для вставки символов в поле числового формата диалогового окна многоуровневого списка.

...