Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
DriftSoft
0 / 0 / 0
Регистрация: 22.08.2013
Сообщений: 17
1

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

06.09.2013, 10:48. Просмотров 1433. Ответов 5
Метки нет (Все метки)

Сделал программу для выгрузки текста в шаблон 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2013, 10:48
Ответы с готовыми решениями:

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

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

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

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

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

5
naked.gen
14 / 14 / 8
Регистрация: 14.06.2012
Сообщений: 33
06.09.2013, 13:15 2
Возможно, это поможет. Собирал по крупицам решение подобной проблемы:
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
67 / 67 / 7
Регистрация: 14.03.2012
Сообщений: 201
06.09.2013, 13:22 3
Вот как это было реализовано в одном из моих проектов:

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
DriftSoft
0 / 0 / 0
Регистрация: 22.08.2013
Сообщений: 17
06.09.2013, 13:50  [ТС] 4
Спасибо, работает. Я так понимаю что заменять может только определенное количество переменных, или до бесконечности?
Если можно, подскажите как сделать чтобы можно было выбирать путь для открытия шаблона и путь для сохранения.
0
sashk0
67 / 67 / 7
Регистрация: 14.03.2012
Сообщений: 201
06.09.2013, 14:13 5
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
DriftSoft
0 / 0 / 0
Регистрация: 22.08.2013
Сообщений: 17
06.09.2013, 14:44  [ТС] 6
Благодарю, буду реализовывать. Очень помогли.
0
06.09.2013, 14:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2013, 14:44

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

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

Поиск текста по документу и замена его на свой текст
Вот есть маркер в Вворде типа $FIO$-2е штуки. В одну надо записывать Фамилию Имя Отчество полностью...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru