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

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

06.09.2013, 10:48. Просмотров 1927. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.09.2013, 10:48
Ответы с готовыми решениями:

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

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

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

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

5
15 / 15 / 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
69 / 69 / 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
0 / 0 / 0
Регистрация: 22.08.2013
Сообщений: 17
06.09.2013, 13:50  [ТС] 4
Спасибо, работает. Я так понимаю что заменять может только определенное количество переменных, или до бесконечности?
Если можно, подскажите как сделать чтобы можно было выбирать путь для открытия шаблона и путь для сохранения.
0
69 / 69 / 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
0 / 0 / 0
Регистрация: 22.08.2013
Сообщений: 17
06.09.2013, 14:44  [ТС] 6
Благодарю, буду реализовывать. Очень помогли.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.09.2013, 14:44

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

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

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