Стиль вставки параметров взаимодействия слов после и следующей строки

#c# #ms-word #ms-office #office-interop

#c# #ms-word #ms-office #office-взаимодействие

Вопрос:

Я перебираю абзацы существующего документа MS Word и вставляю абзацы текста после заголовков определенного уровня, но когда я вставляю текст, они наследуют часть стиля из абзаца ниже и / или следующий элемент запутывается. Вот мой код:

 foreach (Word.Paragraph paragraph in doc.Paragraphs)
{
    if (paragraph.get_Style(); != null amp;amp; paragraph.get_Style() =="Heading 2")
    {
        paragraph.Range.InsertParagraphAfter();
        paragraph.Next().Reset();                            
        paragraph.Next().Range.Text = "New Text"
        paragraph.Next().set_Style("My Style");
    }
}
  

Это работает хорошо, за исключением случаев, когда у меня есть следующее

Заголовок 2

  • Элемент списка
  • Элемент списка
  • Элемент списка

Мой конечный результат выглядит так:

Заголовок 2

Новый текст

  • Элемент списка

  • Элемент списка
  • Элемент списка

Обратите внимание на дополнительную пустую точку маркера. Это моя проблема.

Ответ №1:

это сработало для меня с Word 2013

 using Microsoft.Office.Interop.Word;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {
            Application app = new Application();
            var doc = app.Documents.Open(@"C:usersmhaincdesktoptest.docx");

            foreach (Microsoft.Office.Interop.Word.Paragraph paragraph in doc.Paragraphs)
            {
                if (paragraph.get_Style() != null amp;amp; paragraph.get_Style().NameLocal == "Heading 2")
                {
                    paragraph.Range.InsertParagraphAfter();
                    paragraph.Next().Range.Text = "New Textrn";
                    paragraph.Next().Reset();
                    paragraph.Next().set_Style("Normal");

                }
            }
            doc.Save();
            doc.Close();

        }
    }
}
  

Обратите внимание, что я изменил порядок добавления текста и вызова сброса и добавил символы r n (перевод строки) в конец текста (без перевода строки он также уничтожил мои списки, но он удалял маркер из первого элемента списка, я не мог воспроизвести ваше поведениес вашим кодом :))

Вышеупомянутый код не будет работать корректно, если таблица следует за заголовком в стиле заголовка 2 в вашем документе.

Для этого я создал код, который правильно создаст абзац над вашей таблицей.

 using Microsoft.Office.Interop.Word;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {
            Application app = new Application();
            var doc = app.Documents.Open(@"C:usersmhaincdesktoptest.docx");

            foreach (Microsoft.Office.Interop.Word.Paragraph paragraph in doc.Paragraphs)
            {
                if (paragraph.get_Style() != null amp;amp; paragraph.get_Style().NameLocal == "Heading 2")
                {
                    bool afterTableSplit = false;
                    if (paragraph.Next().Range.Tables.Count > 0)
                    {
                        //add dummy row to the table
                        object firstRow = paragraph.Next().Range.Tables[1].Rows[1];
                        firstRow = paragraph.Next().Range.Tables[1].Rows.Add(ref firstRow);
                        //split the table after the dummy row
                        paragraph.Next().Range.Tables[1].Split(2);
                        //delete the dummy row table
                        paragraph.Next().Range.Tables[1].Delete();
                        afterTableSplit = true;
                    }
                    paragraph.Range.InsertParagraphAfter();
                    paragraph.Next().Range.Text = "New Text";
                    if (!afterTableSplit) paragraph.Next().Range.Text  = "rn";
                    paragraph.Next().Reset();
                    paragraph.Next().set_Style("Normal");

                }
            }
            doc.Save();
            doc.Close();

        }
    }
}
  

Комментарии:

1. Потрясающе, это исправило эту конкретную проблему. Я все еще получаю связанную проблему. Если есть таблица, которая следует вместо списка, она фактически вставляет текст в первую ячейку таблицы. Действительно странно. Есть мысли по этому поводу?