C# Замена текста в строке изменяет форматирование абзаца в Word - Interop Ассамблеи
У меня есть код, в котором я перебираю каждый абзац, представленный в текстовом документе, с использованием основных сборок взаимодействия. По сути, я занимаюсь извлечением всего текста из каждого абзаца в строку. Затем я искал в этой строке конкретные ключевые слова / фразы. Если он присутствует, он заменяется чем-то другим. Затем абзац вставляется обратно в документ.
Это прекрасно работает, однако в некоторых документах происходит новая строка между абзацами. При дальнейшем исследовании выясняется, что форматирование абзаца изменяется, то есть, после того, как расстояние между строками увеличивается с нуля до 12, а также меняются и другие вещи, включая удаление левых отступов из абзацев и т. Д.
Я хотел бы знать, есть ли способ выполнить вышеупомянутую задачу без изменения свойств абзаца при вставке текста обратно. Мой код включен ниже, чтобы показать, как я перебираю документ.
Прежде чем перейти к основному коду, у меня есть текстовое приложение и документ, открытый с использованием следующего пространства имен:
using Word = Microsoft.Office.Interop.Word
а затем следующий код
Word.Application app = new Word.Application();
Word.Document doc = app.Documents.Open(filePath, ReadOnly: false);
После открытия документа я сделал следующее:
try
{
int totalParagraphs = document.Paragraphs.Count;
string final;
for (int i = 1; i <= totalParagraphs; i++)
{
string temp = document.Paragraphs[i].Range.Text;
if (temp.Length > 1)
{
Regex regex = new Regex(findText);
final = regex.Replace(temp, replaceText);
if (final != temp)
{
document.Paragraphs[i].Range.Text = final;
}
}
}
} catch (Exception) { }
Некоторые вещи, на которые стоит обратить внимание, это то, что у меня есть оператор if с "temp.Length > 1". Я заметил, что это не что иное, как пустая строка, он по-прежнему считается абзацем, а текст внутри этого абзаца имеет длину один. При работе с пустыми строками это фактически добавляет дополнительную строку при вставке обратно, даже если замены не выполнялись. Поэтому, чтобы бороться с этим, я просто использовал это, чтобы убедиться, что в абзаце есть хотя бы одна буква, а не просто пустая строка. Таким образом, между абзацами не добавляются дополнительные пустые строки.
1 ответ
Я нашел ответ на свой вопрос. Я включил решение ниже в случае, если кто-то еще имеет такую же проблему или хотел бы ее для справки.
Что вам нужно сделать, это получить свойства формата абзаца извлеченного текста до внесения каких-либо изменений. Затем, как только абзац будет вставлен обратно, установите те же свойства, которые мы ранее извлекли для вставленного абзаца, чтобы противостоять любым изменениям, которые могли быть внесены. Полный код приведен ниже:
try
{
int totalParagraphs = document.Paragraphs.Count;
string final;
for (int i = 1; i <= totalParagraphs; i++)
{
string temp = document.Paragraphs[i].Range.Text;
float x1 = document.Paragraphs[i].Format.LeftIndent;
float x2 = document.Paragraphs[i].Format.RightIndent;
float x3 = document.Paragraphs[i].Format.SpaceBefore;
float x4 = document.Paragraphs[i].Format.SpaceAfter;
if (temp.Length > 1)
{
Regex regex = new Regex(findText);
final = regex.Replace(temp, replaceText);
if (final != temp)
{
document.Paragraphs[i].Range.Text = final;
document.Paragraphs[i].Format.LeftIndent = x1;
document.Paragraphs[i].Format.RightIndent = x2;
document.Paragraphs[i].Format.SpaceBefore = x3;
document.Paragraphs[i].Format.SpaceAfter = x4;
}
}
}
} catch (Exception) { }