Как я могу узнать, является ли список Word списком маркеров или числовым списком?

Я читаю документ Word (преобразовываю его в HTML) и хочу знать, какой тип у каждого абзаца (по крайней мере, так я думаю, я хочу сделать это как).

Мой код выглядит так

Application application = new Application();
var doc = application.Documents.Open("D:\\myDoc.docx");

for (int i = 0; i < doc.Paragraphs.Count; i++)
{
     Console.WriteLine($"{doc.Paragraphs[i + 1].Range.ParagraphStyle.NameLocal}");
}

Это выводит заголовок 1, нормальный и список абзаца, например. Итак, мой вопрос. Я не могу видеть, является ли Абзац списка списком или числовым списком. Вопрос, Как я могу узнать, какого типа список?

2 ответа

Решение

Использование Range.ListFormat.ListType который может иметь следующие значения:

// Summary:
//     Specifies a type of list.
public enum WdListType
{
    // Summary:
    //     List with no bullets, numbering, or outlining.
    wdListNoNumbering = 0,
    //
    // Summary:
    //     ListNum fields that can be used in the body of a paragraph.
    wdListListNumOnly = 1,
    //
    // Summary:
    //     Bulleted list.
    wdListBullet = 2,
    //
    // Summary:
    //     Simple numeric list.
    wdListSimpleNumbering = 3,
    //
    // Summary:
    //     Outlined list.
    wdListOutlineNumbering = 4,
    //
    // Summary:
    //     Mixed numeric list.
    wdListMixedNumbering = 5,
    //
    // Summary:
    //     Picture bulleted list.
    wdListPictureBullet = 6,
}

Может быть недостаточно различать два списка Word. Я не знаю, что именно означает "Изложенный список", но похоже, что числовые списки и маркированные списки находятся в этой категории.

Так что ты можешь сделать?

Вариант 1. Вы можете использовать Range.ListFormat.ListString определить, какой текст помечает список. Это может быть пуля, число, треугольник или все, что определено в файле слов. Но это не очень хорошая идея, потому что вы никогда не знаете, какое значение хранится там, поэтому вы не можете сравнить его.

Вариант 2. Вы можете использовать перечисление WdListNumberStyle, хотя это немного сложно. Я постараюсь объяснить. Есть свойство под названием Range.ListFormat.ListTemplate.ListLevels который хранит форматы списка для всех возможных уровней списка. Обычные списки имеют формат уровня 1, а вложенные списки имеют форматы от 2 до 9 соответственно (кажется, что вы можете определить 9 различных форматов для вложенных списков в MS Word). Итак, что вам нужно, это получить первый элемент Range.ListFormat.ListTemplate.ListLevels собственности и проверьте его NumberStyle свойство (см. ссылку выше). Однако так как ListLevels поддерживает только IEnumerable интерфейс вы не можете получить определенный элемент. Вы можете использовать что-то вроде этого:

private static Word.WdListNumberStyle GetListType(Word.Range sentence)
{
    foreach (Word.ListLevel lvl in sentence.ListFormat.ListTemplate.ListLevels)
    {
        return lvl.NumberStyle;
    }
}

или, более конкретно

private static Word.WdListNumberStyle GetListType(Word.Range sentence, byte level)
{
    foreach (Word.ListLevel lvl in sentence.ListFormat.ListTemplate.ListLevels)
    {
        if (level == 1)
            return lvl.NumberStyle;
        level--;
    }
}

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

Другие вопросы по тегам