#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. Потрясающе, это исправило эту конкретную проблему. Я все еще получаю связанную проблему. Если есть таблица, которая следует вместо списка, она фактически вставляет текст в первую ячейку таблицы. Действительно странно. Есть мысли по этому поводу?