C #: вставка и отступ маркеров в закладке в текстовом документе с использованием библиотек Office Interop - PullRequest
0 голосов
/ 25 июня 2018

Вот моя дилемма.Мне было поручено создать определенный раздел существующего текстового документа на основе пользовательского ввода веб-интерфейса.Серверная часть системы написана на C # с частью, которая редактирует текстовый документ, используя пространство имен Microsoft.Office.Interop.Word.

В основном, они выбирают из списка доступных инструкций, каждая из которых имеет тип string, который затем будет использоваться для генерации инструктивной части документа, где каждая отдельная инструкция является еще одним маркером в списке.Эта часть отлично работает.Моя проблема в том, что инструкции могут содержать символ \, который необходимо заменить на отступ или эквивалент нажатия клавиши TAB во время нахождения в маркере, если документ был открыт в word.Пока я могу заставить его вставлять маркеры в середину списка просто отлично, он продолжает нумеровать их соответствующим образом, как и ожидалось.Кикер в том, что я не могу заставить их отступать по мере необходимости.

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

var bookmark = "bookMarkName";
var docPath = @"c:\temp\Template.docx";
var app = new Application();
var doc = app.Documents.Open(docPath);
var range = doc.Bookmarks[bookmark].Range;
var listTemplate = range.ListFormat.ListTemplate;

range.ListFormat.ApplyListTemplate(listTemplate);

string[] bulletList = new string[] {
    @"Point A",
    @"\Point B",
    @"\Point C",
    @"\\Point D",
    @"Point E"
}

var count = bulletList.Length;

for (var i = 0; i < count; i++)
{
    var listLevel = 0;
    var currentItem = bulletList[i];
    var item = currentItem.Replace(@"\", "");

    if (i < count - 1)
        item = item + "\n";

    listLevel += currentItem.ToList().Where(x => x == '\\').Select(x => x).Count();

    for (var x = 0; x < listLevel; x++)
    {
        range.ListFormat.ListIndent();
    }

    range.InsertAfter(item);
}

doc.SaveAs(@"c:\temp\" + DateTime.Now.Ticks + ".docx");
doc.Close();

Таким образом, вывод моего кода должен быть:

  • 1Точка A
    • 1.1 Точка B
    • 1.2 Точка C
      • 1.2.1 Точка D
  • 2Точка E

Это первый раз, когда мне действительно приходилось работать с библиотеками Office Interop, поэтому я уверен, что что-то здесь не хватает.Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

У меня нет Office Interop на моем компьютере, но вы можете попробовать создать список с помощью DocX, записать его в файл, а затем вставить этот список в ваш документ из указанного файла.

Что-то вродеthis:

using System.Collections.Specialized;
...
...

DocX doc = DocX.Create("bullet-text.docx");

var firstItem = bulletList[0];
var firstItemLevel = firstItem.ToList().Count(c => c == '\\');
// Using full Namespace to avoid ambiguous reference error.
Xceed.Words.NET.List list = doc.AddList(firstItem.Replace("\\", ""), firstItemLevel, ListItemType.Numbered);

for (var i = 1; i < count; i++)
{
    var currentItem = bulletList[i];
    var item = currentItem.Replace(@"\", "");
    int listLevel = currentItem.ToList().Count(c => c == '\\')

    doc.AddListItem(list, item, listLevel, ListItemType.Numbered);

}

doc.InsertList(list);

doc.Save();

// Collapse the range to the end, as to not overwrite it. Unsure if you need this
range.Collapse(WdCollapseDirection.wdCollapseEnd);

// Insert into the selected range
range.InsertFile(Environment.CurrentDirectory + "\\bullet-text.docx");

Ссылки, которые я могу канализовать:

Вложенные маркированные списки в Novacode docx

Как встроить файл в слово docx?

Свернуть

Вставить файл

0 голосов
/ 29 июня 2018

Пожалуйста, используйте этот код, но сначала Добавьте DocX DLL

 using (var document = DocX.Create(@"docs\Lists.docx"))
    {
        var numberedList = document.AddList("First List Item.", 0, ListItemType.Numbered);
                //Add a numbered list starting at 2
        document.AddListItem(numberedList, "Second List Item.");
        document.AddListItem(numberedList, "Third list item.");
        document.AddListItem(numberedList, "First sub list item", 1);

        document.AddListItem(numberedList, "Nested item.", 2);
        document.AddListItem(numberedList, "Fourth nested item.");

        var bulletedList = document.AddList("First Bulleted Item.", 0, ListItemType.Bulleted);
        document.AddListItem(bulletedList, "Second bullet item");
        document.AddListItem(bulletedList, "Sub bullet item", 1);
        document.AddListItem(bulletedList, "Second sub bullet item", 2);
        document.AddListItem(bulletedList, "Third bullet item");

        document.InsertList(numberedList);
        document.InsertList(bulletedList);
        document.Save();
        Console.WriteLine("\tCreated: docs\\Lists.docx");
    }

Найти Ссылка отсюда

...