Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 22.08.2013
Сообщений: 17

Как сделать чтобы замена текста в WORD производилась по всему документу

06.09.2013, 10:48. Показов 4055. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сделал программу для выгрузки текста в шаблон Word с переменными. Как сделать чтобы все переменные в текте заменялись? получается что переменная {doc} в самом верху заменилась, а все остальные переменные {doc} которые ниже остались неизменными.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using Word = Microsoft.Office.Interop.Word;
 
namespace WindowsFormsApplication9
{
    public partial class Form1 : Form
    {
        private readonly string TemplateFileName = @"C:\Шаблоны\Договор.doc";
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            var kontr = textBox1.Text;
            var dog = textBox2.Text;
            var data1 = dateTimePicker1.Text;
            var data2 = dateTimePicker2.Text;
            var ruk = comboBox1.Text;
            var f = textBox3.Text;
            var i = textBox4.Text;
            var o = textBox5.Text;
            var datar = dateTimePicker3.Text;
            var gr = comboBox2.Text;
            var prbez = comboBox3.Text;
            var izj = comboBox4.Text;
            var datab = dateTimePicker4.Text;
            var dataot = dateTimePicker5.Text;
            var datado = dateTimePicker6.Text;
            var prof = textBox8.Text;
            var chas = textBox9.Text;
            var summa = textBox10.Text;
            var richtext = richTextBox1.Text;
 
            
            //TODO: Word Export
            var wordApp = new Word.Application();
            wordApp.Visible = false;
 
            try
            {
                var wordDocument = wordApp.Documents.Open(TemplateFileName);
                ReplaceWordStub("{dog}", dog, wordDocument);
                ReplaceWordStub("{kontr}", kontr, wordDocument);
                ReplaceWordStub("{data1}", data1, wordDocument);
                ReplaceWordStub("{data2}", data2, wordDocument);
                ReplaceWordStub("{ruk}", ruk, wordDocument);
                ReplaceWordStub("{f}", f, wordDocument);
                ReplaceWordStub("{i}", i, wordDocument);
                ReplaceWordStub("{o}", o, wordDocument);
                ReplaceWordStub("{datar}", datar, wordDocument);
                ReplaceWordStub("{gr}", gr, wordDocument);
                ReplaceWordStub("{prbez}", prbez, wordDocument);
                ReplaceWordStub("{izj}", izj, wordDocument);
                ReplaceWordStub("{datab}", datab, wordDocument);
                ReplaceWordStub("{dataot}", dataot, wordDocument);
                ReplaceWordStub("{datado}", datado, wordDocument);
                ReplaceWordStub("{prof}", prof, wordDocument);
                ReplaceWordStub("{chas}", chas, wordDocument);
                ReplaceWordStub("{summa}", summa, wordDocument);
                ReplaceWordStub("{richtext}", richtext, wordDocument);
                
                wordDocument.SaveAs(@"c:\result.doc");
                wordApp.Visible = true;
            }
            catch
            {
                MessageBox.Show("Произошла ошибка");
            }
        }
        private void ReplaceWordStub(string StubToReplace, string text, Word.Document wordDocument)
        {
            var range = wordDocument.Content;
            range.Find.ClearFormatting();
            range.Find.Execute(FindText: StubToReplace, ReplaceWith: text);
        }
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.09.2013, 10:48
Ответы с готовыми решениями:

Как сделать сортировку по всему документу
добрый день мне нужно отсортировать данные в колонке, так что б данные сортировались со всей строкой

Поиск и замена по всему документу
Всем привет. Подскажите, почему не работает замена? Текст в документе находит, выделяет, но не заменяет. Dim objword As Object Dim...

Excel замена символов в формулах по всему документу
Здравствуйте! Подскажите пожалуйста функцию которая ищет определенные символы в документе Excel по всему листу и если находит заменяет на...

6
15 / 15 / 8
Регистрация: 14.06.2012
Сообщений: 33
06.09.2013, 13:15
Возможно, это поможет. Собирал по крупицам решение подобной проблемы:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
        public void ReplaceAllStrings(string strToFind, string replaceStr, Word._Document _document)
        {
 
            // обьектные строки для Word
            object strToFindObj = strToFind;
            object replaceStrObj = replaceStr;
            // диапазон документа Word
            Word.Range wordRange;
            //тип поиска и замены
            object replaceTypeObj;
 
            replaceTypeObj = Word.WdReplace.wdReplaceAll;
 
            try
            {
                // обходим все разделы документа
                for (int i = 1; i <= _document.Sections.Count; i++)
                {
                    // берем всю секцию диапазоном
                    wordRange = _document.Sections[i].Range;
 
                    /*
                    Обходим редкий глюк в Find, ПРИЗНАННЫЙ MICROSOFT, метод Execute на некоторых машинах вылетает с ошибкой "Заглушке переданы неправильные данные / Stub received bad data"  Подробности: [url]http://support.microsoft.com/default.aspx?scid=kb;en-us;313104[/url]
                    // выполняем метод поиска и  замены обьекта диапазона ворд
                    wordRange.Find.Execute(ref strToFindObj, ref wordMissing, ref wordMissing, ref wordMissing, ref wordMissing, ref wordMissing, ref wordMissing, ref wordMissing, ref wordMissing, ref replaceStrObj, ref replaceTypeObj, ref wordMissing, ref wordMissing, ref wordMissing, ref wordMissing);
                    */
 
                    Word.Find wordFindObj = wordRange.Find;
 
 
                    object[] wordFindParameters = new object[15] { strToFindObj, _missingObj, _missingObj, _missingObj, _missingObj, _missingObj, _missingObj, _missingObj, _missingObj, replaceStrObj, replaceTypeObj, _missingObj, _missingObj, _missingObj, _missingObj };
 
                    wordFindObj.GetType().InvokeMember("Execute", BindingFlags.InvokeMethod, null, wordFindObj, wordFindParameters);
                }
            }
            catch (Exception error)
            {
                throw new Exception("Ошибка при выполнении замене всех строк  в документе Word.  " + error.Message + " (ReplaceAllStrings)");
            }
        }
1
 Аватар для sashk0
72 / 72 / 7
Регистрация: 14.03.2012
Сообщений: 201
06.09.2013, 13:22
Вот как это было реализовано в одном из моих проектов:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
                var wordApp = new Word.Application {Visible = false};
                var wordDocument = wordApp.Documents.Open("путь_к_файлу_ворда");
 
                //поиск и замена переменными 
                ReplaceWordString("искомое_значение_в_ворде", myVar, wordDocument);
 
        private static void ReplaceWordString(string stubToReplace, string text, Word.Document wordDocument)
        {
            wordDocument.Activate();
            object missing = Type.Missing;
            foreach (Word.Range tmpRange in wordDocument.StoryRanges)
            {
                tmpRange.Find.Text = stubToReplace;
                tmpRange.Find.Replacement.Text = text;
                tmpRange.Find.Wrap = Word.WdFindWrap.wdFindContinue;
                object replaceAll = Word.WdReplace.wdReplaceAll;
                tmpRange.Find.Execute(ref missing, ref missing, ref missing,
                                      ref missing, ref missing, ref missing, ref missing,
                                      ref missing, ref missing, ref missing, ref replaceAll,
                                      ref missing, ref missing, ref missing, ref missing);
            }
        }
1
0 / 0 / 0
Регистрация: 22.08.2013
Сообщений: 17
06.09.2013, 13:50  [ТС]
Спасибо, работает. Я так понимаю что заменять может только определенное количество переменных, или до бесконечности?
Если можно, подскажите как сделать чтобы можно было выбирать путь для открытия шаблона и путь для сохранения.
0
 Аватар для sashk0
72 / 72 / 7
Регистрация: 14.03.2012
Сообщений: 201
06.09.2013, 14:13
DriftSoft, Заменять можно хоть сколько переменных, это замена не переменных, а замена меток даже, я бы так сказал.

Открытие и Сохранение вордовского файла:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//Открываем
                var dialog = new OpenFileDialog()
                             {
                                 Filter = "Word файлы(*.docx)|*.docx",
                                 Title = "Открыть Wprd файл",
                             };
                if (dialog.ShowDialog() == DialogResult.OK)
                {
                var wordApp = new Word.Application;
                var wordDocument = wordApp.Documents.Open(dialog.FileName);
                }
 
//сохраняем
                var dialog = new SaveFileDialog
                             {
                                 Filter = "Word files (*.doc)|*.doc",
                                 Title = "Сохранить документ как Word-файл"
                             };
 
            if (dialog.ShowDialog() == DialogResult.OK)
            {
                wordDocument.SaveAs(dialog.FileName);
             }
Как-то так, тут могут быть ошибки, но в целом что-то такое должно быть.
1
0 / 0 / 0
Регистрация: 22.08.2013
Сообщений: 17
06.09.2013, 14:44  [ТС]
Благодарю, буду реализовывать. Очень помогли.
0
5 / 3 / 2
Регистрация: 14.03.2018
Сообщений: 227
17.06.2020, 22:14
Взял код у sashk0, в документе как выглядит, прикрепил картинку.
И вдруг тут ошибка: System.NullReferenceException: "Ссылка на объект не указывает на экземпляр объекта."
и никак не могу исправить, в чем ошибка ребят? помогите плиз.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 private readonly string TemplateFileName = @"С:\Новая папка\6.docx";//путь к файлу
 
 
        private void ReplaceWordsStub(string stubToReplace, string text, Word.Document wordDocument)
        {
            wordDocument.Activate();
            object missing = Type.Missing;
            foreach (Word.Range tmpRange in wordDocument.StoryRanges)
            {
                tmpRange.Find.Text = stubToReplace;
                tmpRange.Find.Replacement.Text = text;
                tmpRange.Find.Wrap = Word.WdFindWrap.wdFindContinue;
                object replaceAll = Word.WdReplace.wdReplaceAll;
                tmpRange.Find.Execute(ref missing, ref missing, ref missing,
                                      ref missing, ref missing, ref missing, ref missing,
                                      ref missing, ref missing, ref missing, ref replaceAll,
                                      ref missing, ref missing, ref missing, ref missing);
            }
        }
        private void button3_Click(object sender, EventArgs e)
        {
            var wordApp = new Word.Application { Visible = false };
            var wordDocument = wordApp.Documents.Open(TemplateFileName);
            //поиск и замена переменными 
            ReplaceWordsStub("{naimUsl}", dataGridView1["Наименование услуги", dataGridView1.CurrentRow.Index].Value.ToString(), wordDocument);//здесь ругает
        }
Изображения
 
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.06.2020, 22:14
Помогаю со студенческими работами здесь

Нумерация строк в TB для Find/Replace по всему документу Word
Здравствуйте! У меня возник вопрос как лучше сделать, нумерацию строк в textbox'ах, в небольшом макросе мультизамены, т.е допустим...

Как сделать чтобы производилась сортировка?
Разработать Windows-приложение Составить программу, которая выдает справочную информацию о продаваемых ноутбуках. Программа должна: 1....

Как сделать, чтобы по клику на img или на чём то ещё, производилась отправка на сервер?
Наверно такой вопрос уже задавался, но я честно не смог найти его на форуме. Как сделать, чтобы по клику на img или на чём то ещё,...

Как осуществить поиск по всему Excel документу?
Всем добрые сутки!! Програмировал в VB последний раз 6 лет назад, тут нужно макрос написать! Переменной Set rgResult =...

Отмена автонумерации и замена на фиксированную нумерацию по всему документе Word 2010
Господа гуру, помогите пожалуйста, у меня проблема : есть документ на 4 тис. страниц. В нем проставлена нумерация строк, которая сбивает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru