Как изменить текст в текстовом поле в колонтитулах Word Interop?
Делаю модуль генерации отчета в Word. Есть шаблон, скриншоты части которого представлен на картинках. Необходимо поменять текст в текстовых полях (т.е. разработал, проверил, номер, название_р) на тот, который приходит программе на вход. Эти текстовые поля находятся в колонтитулах.
Также выделенные красным текстовые поля являются элементами управления содержимым.
Я нашел, как изменить текст в колонтитуле,если он задается обычным текстом. Но здесь внутри колонтитула создается текстовое поле, поэтому такой способ не работает.
Я перепробовал различные способы изменения текста в данной ситуации - искал Shape объекты внутри колонтитулов, пытался работать через элементы управления содержимым (спойлер - не получилось, так как interop word не видит все, что находится в колонтитулах), пытался делать банальный Find.Execute, что тоже не работало из-за такой же причины, что и с элементами управления содержимым.
Подскажите, пожалуйста, есть ли какой-то способ достать эти текстовые поля из колонтитулов и заменить в них текст?
Попытка 1
Application app = new Application();
Document doc = app.Documents.Add("C:\\Users\\User1\\Documents\\номер1.docx", Visible: false);
for (int i=0; i<r2.KeyValues.Count;i++)
{
app.Selection.Find.Execute("{"+r2.KeyValues[i].Key+"}");
var rng = app.Selection.Range;
rng.Text = r2.KeyValues[i].Value;
}
r2.KeyValues содержит список пар (ключ, значение), где ключ - это слово, которое надо поменять, значение - слово, на которое надо поменять ключ.
Попытка 2
for (int i = 0; i < r2.KeyValues.Count;i++)
{
ContentControls controls = doc.SelectContentControlsByTitle('{'+r2.KeyValues[i].Key+'}');
if (controls.Count > 0)
{
ContentControl control = controls[1];
control.Range.Text = r2.KeyValues[i].Value;
}
}
Попытки 3 и 4
Пробовал еще через Headers Footers и StoryRanges, но примеры найти не могу.
Заранее благодарю за ответ

Ответы (1 шт):
вот:
using System;
using Word = Microsoft.Office.Interop.Word;
namespace TestProjectWord
{
class Program
{
static void Main(string[] args)
{
Word.Application app = new Word.Application(); //Создаём новый Word.Application
Word.Document doc = null; //Загружаем документ
doc = app.Documents.Add(@"C:\Users\User1\Documents\номер1.docx", Visible: false);
//Задаём параметры замены и выполняем замену.
object findText = "{Что меняем}";
object replaceWith = "На что меняем";
object replace = 2;
object tm = Type.Missing;
object WH=Word.WdHeaderFooterIndex;
WH колонтитул1лист = WH.wdHeaderFooterFirstPage;
WH колонтитулысо2листа = WH.wdHeaderFooterPrimary;
WH колонтитулычетныхлистов = WH.wdHeaderFooterEvenPages;
// замена в верхнем колонтитуле
// замена в верхнем колонтитуле на первом листе
doc.Sections[1].Headers[колонтитул1лист].Range.Find.Execute(
ref findText, ref tm, ref tm, ref tm, ref tm, ref tm, ref tm, ref tm,
ref tm, ref replaceWith, ref replace, ref tm, ref tm, ref tm, ref tm);
// замена в верхнем колонтитуле на последующих листах
doc.Sections[1].Headers[колонтитулысо2листа].Range.Find.Execute(
ref findText, ref tm, ref tm, ref tm, ref tm, ref tm, ref tm, ref tm,
ref tm, ref replaceWith, ref replace, ref tm, ref tm, ref tm, ref tm);
// замена в верхнем колонтитуле на четных листах
doc.Sections[1].Headers[колонтитулычетныхлистов].Range.Find.Execute(
ref findText, ref tm, ref tm, ref tm, ref tm, ref tm, ref tm, ref tm,
ref tm, ref replaceWith, ref replace, ref tm, ref tm, ref tm, ref tm);
// замена в нижнем колонтитуле
// замена в нижнем колонтитуле на первом листе
doc.Sections[1].Footers[колонтитул1лист].Range.Find.Execute(
ref findText, ref tm, ref tm, ref tm, ref tm, ref tm, ref tm, ref tm,
ref tm, ref replaceWith, ref replace, ref tm, ref tm, ref tm, ref tm);
// замена в нижнем колонтитуле на последующих листах
doc.Sections[1].Footers[колонтитулысо2листа].Range.Find.Execute(
ref findText, ref tm, ref tm, ref tm, ref tm, ref tm, ref tm, ref tm,
ref tm, ref replaceWith, ref replace, ref tm, ref tm, ref tm, ref tm);
// замена в нижнем колонтитуле на четных листах
doc.Sections[1].Footers[колонтитулычетныхлистов].Range.Find.Execute(
ref findText, ref tm, ref tm, ref tm, ref tm, ref tm, ref tm, ref tm,
ref tm, ref replaceWith, ref replace, ref tm, ref tm, ref tm, ref tm);
//Открываем документ для просмотра.
app.Visible = true;
}
}
}
ну и ваш пример:
using System;
using Word = Microsoft.Office.Interop.Word;
namespace TestProjectWord
{
class Program
{
static void Main(string[] args)
{
Word.Application app = new Word.Application();//Создаём новый Word.Application
Word.Document doc = app.Documents.Add(
@"C:\Users\User1\Documents\номер1.docx",
Visible: false); //Загружаем документ
object replace = 2;
object tm = Type.Missing;
object WH=Word.WdHeaderFooterIndex;
WH колонтитул1лист = WH.wdHeaderFooterFirstPage;
WH колонтитулысо2листа = WH.wdHeaderFooterPrimary;
for (int i=0; i<r2.KeyValues.Count;i++)
{
object findText = "{"+r2.KeyValues[i].Key+"}"; // что меняем
object replaceWith = r2.KeyValues[i].Value; // на что меняем
// замена в нижнем колонтитуле на первом листе
doc.Sections[1].Footers[колонтитул1лист].Range.Find.Execute(
ref findText, ref tm, ref tm, ref tm, ref tm, ref tm, ref tm, ref tm,
ref tm, ref replaceWith, ref replace, ref tm, ref tm, ref tm, ref tm);
// замена в нижнем колонтитуле на последующих листах
doc.Sections[1].Footers[колонтитулысо2листа].Range.Find.Execute(
ref findText, ref tm, ref tm, ref tm, ref tm, ref tm, ref tm, ref tm,
ref tm, ref replaceWith, ref replace, ref tm, ref tm, ref tm, ref tm);
}
//Открываем документ для просмотра.
app.Visible = true;
}
}
}
wdHeaderFooterPrimary Возвращает верхний или нижний колонтитул на всех страницах, кроме первой страницы документа или раздела.
wdHeaderFooterFirstPage Возвращает первый верхний или нижний колонтитул в документе или разделе.
wdHeaderFooterEvenPages Возвращает все верхние и нижние колонтитулы на четных страницах.
файл для работы с word: Microsoft Office 2010: Primary Interop Assemblies Redistributable от Microsoft, распаковываем и получаем установочный файл, устанавливаем его и по пути c:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Word\15.0.0.0__71e9bce111e9429c\ находим Microsoft.Office.Interop.Word.dll