Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/23: Рейтинг темы: голосов - 23, средняя оценка - 4.57
1 / 1 / 0
Регистрация: 08.03.2013
Сообщений: 114
1

Microsoft.Office.Interop.Word поиск текста

13.08.2019, 13:53. Показов 4549. Ответов 9
Метки нет (Все метки)

Здравствуйте.

Есть документ Word. В нем есть текст:
Код
Категория возрастная: дети
Пол: любой
Фаза: острая
Стадия: легкая степень тяжести
Мне нужно найти текст
Код
Пол:
и в переменную string FindSex поместить текст "любой".

Как я понимаю, можно воспользоваться вот таким классом для поиска вхождения искомого текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void FindAndReplace(Microsoft.Office.Interop.Word.Application doc, object findText)
        {
            //options
            object matchCase = false;
            object matchWholeWord = true;
            object matchWildCards = false;
            object matchSoundsLike = false;
            object matchAllWordForms = false;
            object forward = true;
            object format = false;
            object matchKashida = false;
            object matchDiacritics = false;
            object matchAlefHamza = false;
            object matchControl = false;
            object read_only = false;
            object visible = true;
            object replace = 2;
            object wrap = 1;
            //execute find and replace
            doc.Selection.Find.Execute(ref findText, ref matchCase, ref matchWholeWord,
                ref matchWildCards, ref matchSoundsLike, ref matchAllWordForms, ref forward, ref wrap, ref format, ref replace, ref replace,
                ref matchKashida, ref matchDiacritics, ref matchAlefHamza, ref matchControl);
        }
А каким способом лучше получить искомое значение?

В моем примере это одно слово до конца абзаца, но по тексту видно, что в других частях документа, искомый текст может быть и одним словом, и выражением. У всех есть один общий признак - конец текста это конец абзаца с вхождением искомого текста.

Прошу совета как лучше сделать поиск текста. На данный момент я склоняюсь к поиску искомого текста, далее вычисление конечного индекса и далее выборка текста от конечного индекса +1 символ и до конца параграфа. Но мне это кажется не оптимальным решением.

Добавлено через 4 часа 6 минут
Сделал вот такой парсер.

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
private void Btn_LoadWord_Click(object sender, EventArgs e)
        {
            DocX docxLoad = DocX.Load(listBox1.Items[0].ToString());
 
            var paragraphsList = docxLoad.Paragraphs;
            var paragraphsText = paragraphsList[2];
            label3.Text = paragraphsText.Text;
 
            var aaa = docxLoad.FindAll("Категория возрастная:");
 
            string findText = "Категория возрастная:";
 
            //docxLoad.FindAll("Категория возрастная:")
 
            label4.Text = aaa.Count().ToString();
            label4.Text = aaa[0].ToString();
 
            label5.Text = docxLoad.Text.Substring(aaa[0], 100);
 
            label6.Text = paragraphsList.Count.ToString();
 
            for (int i=0; i < paragraphsList.Count; i++)
            {
                string paragraphsForText = paragraphsList[i].Text;
                int indexLast = paragraphsForText.LastIndexOf(findText);
                int indexOf = paragraphsForText.IndexOf(findText);
 
                //Console.WriteLine("Paragraph # " + i);
                //Console.WriteLine("indexLast # " + indexLast);
                //Console.WriteLine(paragraphsForText);
 
                if (indexLast >= 0)
                {
                    label7.Text = "Paragraph # " + i;
                    label8.Text = "indexLast # " + indexLast;
                    label9.Text = "indexOf #" + indexOf;
                    label10.Text = (indexOf + findText.Length).ToString();
                    label11.Text = paragraphsForText.Substring(indexOf + findText.Length).Trim();
                }
            }
 
        }
Он не оптимален, т.к. приходиться делать перебор всех параграфов в документе и в каждом выискивать текст. Плюсом является то, что я через подстроку сразу получаю искомое.

Можно искать сразу во всем документе и найти индекс начала вхождения. Но как после этого выбрать текст только до конца абзаца - пока так и не понял.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.08.2019, 13:53
Ответы с готовыми решениями:

Microsoft.Office.Interop.Word поиск и возвращение значений
Доброе время суток. Занят разработкой парсера между экселем и вордом. Автоматизация работы в...

Альтернатива Microsoft.Office.Interop.Word
Если альтернатива пространства Microsoft.Office.Interop.Word?Мне нужно выложить программу на сервер...

Microsoft.Office.Interop.Word сохранение файла
Требуется сохранение файла. Как это сделать? try { _document =...

Как установить компонент microsoft.office.interop.word?
Скачал компонент microsoft.office.interop.word Как его установить?

9
88 / 62 / 18
Регистрация: 09.12.2015
Сообщений: 173
13.08.2019, 16:54 2
How to: Programmatically search for and replace text in documents
0
1 / 1 / 0
Регистрация: 08.03.2013
Сообщений: 114
14.08.2019, 10:11  [ТС] 3
Цитата Сообщение от BlackEric Посмотреть сообщение
How to: Programmatically search for and replace text in documents
Это первое, что я прочитал. Всегда начинаю с офдокументации, там большинство ответов на вопросы.

К сожалению, именно этот метод мне не подошел. Либо я не понял принцип работы. Но тут пример который подходит для замены текста, а не его поиска и извлечения данных после искомого текста. Т.к. он дает информацию есть текст или нет, но не дает ни индекса параграфа, ни индекса текста. Т.е. абсолютно не информативен для дальнейшей работы с текстом.

Но всё равно спасибо большое за ответ.
0
88 / 62 / 18
Регистрация: 09.12.2015
Сообщений: 173
14.08.2019, 11:00 4
Найденный текс выделяется и вы можете его забрать себе в переменную, если я правильно понял, что вам нужно.
0
1 / 1 / 0
Регистрация: 08.03.2013
Сообщений: 114
14.08.2019, 16:34  [ТС] 5
Цитата Сообщение от BlackEric Посмотреть сообщение
Найденный текс выделяется и вы можете его забрать себе в переменную, если я правильно понял, что вам нужно.
А мне как раз нужно забирать не найденный текст, а текс который идет после найденного текста и до перевода строки (конца абзаца).

Да, я пытался видоизменять этот пример и приспособить его, но ничего, что работало бы без ошибок, сделать так и не смог.
0
88 / 62 / 18
Регистрация: 09.12.2015
Сообщений: 173
14.08.2019, 18:23 6
Что-то типа

string text = doc.Range(app.Selection.End, doc.Paragraph.End).Text;

Не помню как конец абзаца будет. Давно писал.
0
0 / 0 / 1
Регистрация: 02.03.2020
Сообщений: 8
28.02.2021, 14:49 7
BlackEric, помогите. такая же проблема, только мне нужен текст с найденного элемента, до другого найденного элемента
0
Модератор
9447 / 6667 / 1863
Регистрация: 21.04.2018
Сообщений: 19,947
Записей в блоге: 2
28.02.2021, 14:53 8
Цитата Сообщение от Stanislav3 Посмотреть сообщение
BlackEric, помогите
Его последние посещение форума более года назад.
0
88 / 62 / 18
Регистрация: 09.12.2015
Сообщений: 173
28.02.2021, 19:55 9
Вам нужно использовать два Range объекта для поиска. Nак что один из диапазонов может быть расширен за счет включения другого.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Application word = new Application();
word.Visible = true;
object findtext = "start";
object findtext2 = "end";
Document d2 = word.Documents.Open(@"Path");
Range range = d2.Content;
Range rngEnd = null;
 
range.Find.Execute(ref findtext, ref missing, ref missing, ref missing, ref
  missing, ref missing, ref missing, ref missing, ref missing, 
  ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
rngEnd = range.Duplicate;
 
rngEnd.Find.Execute(ref findtext2, ref missing, ref missing, ref 
  missing, ref missing, ref missing, ref missing, ref missing, ref missing, 
  ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
range.End = rngEnd.End;
 
targetDocument.Paragraphs.Last.Range.FormattedTExt = range.FormattedText;
//range.Copy();
1
0 / 0 / 1
Регистрация: 02.03.2020
Сообщений: 8
03.03.2021, 23:14 10
Добавлено через 2 минуты
Спасибо, я почти все понял, кроме этого:
Цитата Сообщение от BlackEric Посмотреть сообщение
C#
19
targetDocument.Paragraphs.Last.Range.FormattedTExt = range.FormattedText;
помогите пожалуйста, как вставить выделенный текст между start и end в другой файл в место текста {q1}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.03.2021, 23:14

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Microsoft.Office.Interop.Word работает только на одном ПК
Вот не могу понять в чем проблема, работал дома надо проектом, который импортирует данные в Word и...

В visual studio не видно Microsoft.Office.Interop.Word
у меня в visual studio не видно Microsoft.Office.Interop.Word В чём проблема?

Невозможно привести COM-объект типа Microsoft.Office.Interop.Word
Здравствуйте! Есть проблема из частых: &quot;вчера работало, сегодня нет&quot;. Моя программа сохраняла отчет...

Найти и заменить слова в документе (doc) без Microsoft.Office.Interop.Word
Добрый день! Существует ли способ с помощью оного я мог бы найти и заменить слова в файле (doc)...


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

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

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