Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.99/89: Рейтинг темы: голосов - 89, средняя оценка - 4.99
8 / 8 / 4
Регистрация: 11.07.2012
Сообщений: 200
1

Работа с MS Word из Delphi.

11.07.2012, 03:41. Показов 16564. Ответов 7

Помогите !!! перерыл весь инет но так и не нашел ответа разрешения моей проблемы.

Задача - есть готовый документ word - нужно найти в нем слово к примеру "ФИО" и после него
вставить значение из базы данных.

Да никаких проблем :
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
      a:=1;
      st:=Length(WordDocument1.Range.Text); \\весь текст
      s:=Length('ФИО');  \\ текущее слово
      or i:=1 to st-s do
      begin
           j:=i;
           k:=i+s;
          if WordDocument1.Range(j,k).Text='ФИО' then
          begin
           DBEdit15.Text:=WordDocument1.Range(j,k).Text;
           b:=k+5;\\ отодвинемся от найденного ФИО на 5 символов
          end;
      end;
    
      se:=Length(DBEdit1.Text); \\ длина того что будем вставлять после фио
      c:=b+se;
      WordDocument1.Range(b,c).Cut; \\ это чтоб документ не менялся в смысле количества символов
      WordDocument1.Range(a,b).InsertAfter(DBEdit1.Text);\\ собственно встовляем
и все бы замечательно и работает но если в документе нет таблиц
а в моем она есть и стоит перед искомым мной ФИО - в результате:
Delphi
1
          if WordDocument1.Range(j,k).Text='ФИО' then
выдает ошибку предельных значений диапозона
я так понимаю range - застревает в ячейках таблицы
как это обойти ?
как с 1 го символа до послелнего перебрать весь документ и игнорировать при этом где эти
символы находятся в таблице или нет?

может selection поможет но опять же прежде чем, что либо выделить это надо сперва найти
 Комментарий модератора 
Теги кода добавлены модератором. По правилам форума, код должен быть оформлен соответствующими тегами. Для оформления кода Delphi следует выделить этот код и на панели редактирования сообщения нажать кнопку: "DELPHI".


Добавлено через 3 часа 4 минуты
В общем как я понял надо прыгать по документу используя
Delphi
1
   WordApplication1.Selection.MoveDown(EmptyParam,con,EmptyParam);
или
Delphi
1
    WordApplication1.Selection.Move(con,con2);
так как методы range применимы только для непрерывных кусков текста

но как это сделать ?
если кто сталкивался покажите на примере для документа:

1 идет кусок текст
2 стоит таблица (число строк и столбцов я заранее не знаю)
3 дальше текст и тд.

как в таком документе найти заданное слово если оно может быть
до таблицы
в ячейке таблицы
после таблицы

таблиц может быть несколько и я заранее не знаю их параметров
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.07.2012, 03:41
Ответы с готовыми решениями:

Работа с word в delphi
Делаю технологическую практику по delphi+FoxPro. Все сделал, сегодня показал преподу, теперь нужно...

Работа в Word через Delphi
Нужно заменить часть текста на зачёркнутый. То есть выбираем участок текста W.Selection.Start:=a;...

Работа с документами Word в Delphi
Добрый день народ. Имеется 6 документов Word. В каждом документе я назначил закладки в тех...

Работа с word через delphi
Нужно через delphi в документе word выделенные строки скопировать в начало документа. Эти строки...

7
498 / 251 / 56
Регистрация: 16.06.2011
Сообщений: 902
11.07.2012, 04:58 2
Попробуйте так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
  public
    { Public declarations }
function WordFindAndInsert(FindText, ReplacementText: String): Boolean;
....
 
function WordFindAndInsert(FindText, ReplacementText: String): Boolean;
  const wdReplaceAll=2;
begin
  W.Selection.Find.Text:=FindText;
  W.Selection.Find.Replacement.Text:=ReplacementText;
  WordFindAndInsert:=W.Selection.Find.Execute(Replace:=wdReplaceAll);
end;
И применение:
Delphi
1
2
// ищем в документе строку "###date$" и заменяем ее текущей датой:
  WordFindAndInsert('###date$', DateToStr(Now));
Плюс вот Вам юнит для работы с MSWord:
Вложения
Тип файла: rar MyWord.rar (3.0 Кб, 419 просмотров)
1
8 / 8 / 4
Регистрация: 11.07.2012
Сообщений: 200
11.07.2012, 18:45  [ТС] 3
HyperZen - спасибо, чувствую истина где то рядом.
НО в таком виде код применить у меня не получается.
1. Почему то интерпритатор делфи не приемлет команды
Delphi
1
2
3
4
5
    
 
 WordApplication1.Selection.Find.Text:=FindText;
  WordApplication1.Selection.Find.Replacement.Text:=ReplacementText;
  WordFindAndInsert:=WordApplication1.Selection.Find.Execute(Replace:=wdReplaceAll);
когда они находятся в теле функции хотя в моих процедурах я спокойно обращаюсь
к WordApplication1 компонент на форме присутствует - в чем дело не пойму
2. Я поместил этот код в процедуру но теперь интерпритатор не пропускает

Delphi
1
2
3
 
 
 WordApplication1.Selection.Find.Execute(Replace:=wdReplaceAll);
конкретно не понятна запись
Delphi
1
 Replace:=wdReplaceAll
в общем виде параметры такие
Delphi
1
2
3
4
5
WordApplication1.Selection.Find.Execute( FindText, EmptyParam2, EmptyParam3,
                                              EmptyParam4, EmptyParam5, EmptyParam6,
                                              EmptyParam7, EmptyParam8, EmptyParam9,
                                              EmptyParam10,EmptyParam11,EmptyParam12,
                                              EmptyParam13,EmptyParam14,EmptyParam15);
какие из 15 ти параметров кроме первого нужны для моих целей ума не приложу
рабочих примеров нет а в справочниках.... у меня скоро мозг вскипит в этом буреломе

наверно
Delphi
1
 const wdReplaceAll=2;
как то ограничивает метод Execute до двух
параметров или всем параметрам присваевает 2 ?

Может быть Replace надо както отдельно задекларировать ?

Добавлено через 1 час 5 минут
вопрос №1 снимается - банально синтаксис не дописал к заголовку функции TForm3.
а вот вопрос с параметрами актуален , наткнулся на такой код:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Function TForm3.FindAndPasteTextDoc(findtext,pastetext:string):boolean;
begin
  FindAndPasteTextDoc:=true;
  try
    W.Selection.Find.Forward:=true;
    W.Selection.Find.Text:= findtext;
    if W.Selection.Find.Execute then
      begin
      W.Selection.Delete;
      W.Selection.InsertAfter (pastetext);
      end
    else
      FindAndPasteTextDoc:=false;
  except
    FindAndPasteTextDoc:=false;
  end;
end;
здесь Execute вообще без параметров - у меня такое не катит
может потому что здесь
Delphi
1
 W:=CreateOleObject('Word.Application');
а у меня
Delphi
1
2
3
4
5
6
7
8
FileName:='C:\Word\DOC\01 Предварительное обследование\01 НАРЯД-ЗАКАЗ предвар.обследование (квартиры) СС-монтаж.doc';
      WordApplication1.Connect;
      WordApplication1.Documents.Open(FileName,EmptyParam, EmptyParam, EmptyParam,
                                             EmptyParam, EmptyParam, EmptyParam,
                                             EmptyParam, EmptyParam, EmptyParam,
                                             EmptyParam, EmptyParam, EmptyParam,
                                             EmptyParam, EmptyParam);
      WordDocument1.ConnectTo(WordApplication1.ActiveDocument);
0
13077 / 5862 / 1706
Регистрация: 19.09.2009
Сообщений: 8,807
11.07.2012, 21:00 4
Есть ещё способ решения с использованием механизма закладок (Bookmarks) в MS Word:
1. Как заполнить файл MS Word через делфи?
2. Нужна программа с исходником, которая будет работать с MS Word c шаблоном "Письмо".
0
8 / 8 / 4
Регистрация: 11.07.2012
Сообщений: 200
12.07.2012, 00:08  [ТС] 5
закладки это конечно все интересно но мне не подходит
моя цель универсальная программа работающая с любыми заранее не подготовленными для нее
документами

да и с другой стороны решение найдено осталось его просто дожать

по сути то, что мне нужно делается одной командой
Delphi
1
  WordApplication1.Selection.Find.Execute(Replace:=wdReplaceAll);
куда еще проще

вот пожалуйста еще нашел по теме
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function SeekInsertInText(SText, IText : string):boolean; {функция поиска и замены}
begin
WordApp1.Selection.Find.ClearFormat ting;
WordApp1.Selection.Find.Replacement .ClearFormatting;
WordApp1.Selection.Find.Text:=SText ;
WordApp1.Selection.Find.Replacement .Text:=IText;
WordApp1.Selection.Find.Forward:=Tr ue;
WordApp1.Selection.Find.Wrap:=wdFin dContinue;
WordApp1.Selection.Find.Format:=Fal se;
WordApp1.Selection.Find.MatchCase:= False;
WordApp1.Selection.Find.MatchWholeW ord:=False;
WordApp1.Selection.Find.MatchWildca rds:=False;
WordApp1.Selection.Find.MatchAllWor dForms:=False;
WordApp1.Selection.Find.Execute(Replace:=wdReplaceAll);
end;
Всё хорошо ищет и заменяет. -// у него
а у меня Undeclared indentifare "Replace"
ну и как где и каким образом его обьявит - уже как только не пробовал

а вариации на тему

Delphi
1
2
3
WordApplication1.Selection.Find.Execute( SText, False, False, False,
                                                False, False, True,
                                                wdFindContinue, False);
вообще игра в рулетку

Добавлено через 51 минуту
а вот еще нашел в сети товарища по несчастью

Здравствуйте.
Помогите новичку в Delphi. Пробую скомпилировать следующий код, который очень распространен в Интернете (поиск и замена текста в MS Word) но немного видоизмененный:

Delphi
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
use Word97, ...
...
function TWordObject.StringReplace(SearchString, ReplaceString: string): Boolean;
const
  wdFindContinue = 1;
  wdReplaceOne = 1;
  wdReplaceAll = 2;
  wdDoNotSaveChanges = 0;
 
begin
  Result := False;
  try
    { Initialize parameters}
    FWordApp.Selection.Find.ClearFormatting;
    FWordApp.Selection.Find.Replacement.ClearFormatting;
    FWordApp.Selection.Find.Text := SearchString;
    FWordApp.Selection.Find.Replacement.Text := ReplaceString;
    FWordApp.Selection.Find.Forward := True;
    FWordApp.Selection.Find.Wrap := wdFindContinue;
    FWordApp.Selection.Find.Format := False;
    FWordApp.Selection.Find.MatchCase := False;
    FWordApp.Selection.Find.MatchWholeWord := False;
    FWordApp.Selection.Find.MatchWildcards := False;
    FWordApp.Selection.Find.MatchSoundsLike := False;
    FWordApp.Selection.Find.MatchAllWordForms := False;
    { Perform the search}
    FWordApp.Selection.Find.Execute(Replace := wdReplaceAll);
    Result := True;
  finally
    { Quit Word }
 
  end;
end;
Дает ошибку: Undeclared identifier: 'Replace'

Убился уже пытаться заставить все это работать, но не получается. Если указываю параметры Execute при вызове - появляются другие ошибки.
Посмотрел Word97.pas - есть аргумент Replace, вроде бы вызов соответствует описанию.

Использую Delphi 7 Enterprise ( build 4.453).

Подскажите, что не так? Где что-то упущено?

Заранее спасибо.


во во я тоже - убился а ведь у кого то работает и без проблем

Добавлено через 19 минут
вообще кто нибудь может внятно объяснить
Delphi
1
2
3
4
  wdFindContinue = 1;
  wdReplaceOne = 1;
  wdReplaceAll = 2;
  wdDoNotSaveChanges = 0;
что это за плюшки и как они влияют на Execute
эти константы строго определены или их можно менять ?

Добавлено через 50 минут
вот нашел на нашем форуме:

Цитата Сообщение от Антон555 Посмотреть сообщение
и на строке replace:=wdReplaceAll вылетает ошибка "Undeclared identifier wdReplaceAll"
Что это может быть?
Этот фрагмент кода предполагает, что вы используете компоненты WordApplication и WordDocument. При добавлении их на форму, в uses будут добавлены необходимые модули, где определена wdReplaceAll.

у меня на форме есть эти компоненты
и в uses есть все
Delphi
1
2
3
4
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, jpeg, ExtCtrls, Mask, DBCtrls, Grids, DBGrids, WordXP,
  OleServer,MyWord;
тогда какого .........
0
13077 / 5862 / 1706
Регистрация: 19.09.2009
Сообщений: 8,807
12.07.2012, 00:09 6
Цитата Сообщение от kebot Посмотреть сообщение
что это за плюшки и как они влияют на Execute
эти константы строго определены или их можно менять ?
Я недавно публиковал код поиска и замены в MS Word: Время в созданном документе ворда Это полностью работающий код.
А как узнать значение констант и как пишется подобный код, но на примере MS Excel, написано здесь:
Как писать на Delphi программы для работы с приложениями MS Office.
Цитата Сообщение от kebot Посмотреть сообщение
Этот фрагмент кода предполагает, что вы используете компоненты WordApplication и WordDocument.
Я никогда не пользуюсь этими компонентами. Всегда работаю через CreateOleObject() (с использованием модуля ComObj).
2
8 / 8 / 4
Регистрация: 11.07.2012
Сообщений: 200
12.07.2012, 21:18  [ТС] 7
Огромное спасибо код действительно рабочий и работает как надо

Этот пример мне помог понять суть проблемы все дело действительно в
компонентах с вкладки servers

через создание объекта все работает
через компоненты - replace не понимается интерпретатором хотя модуль ComObj у меня тоже был
подключен но видать по этому сценарию он не задействован

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

Добавлено через 19 часов 44 минуты
Все хорощо - код работае вот только раньше я знал как применить форматирование к
заменяемому тексту потому что мой алгоритм вычислял начальный и конечный символы (b) и (c)

Delphi
1
 WordDocument1.Range(b,c).Font.Underline:=1;
а при таком способе
Delphi
1
     wdRng.Find.Execute(Replace:=wdReplaceAll);
получается подчеркнуть только весь текст в документе как применить форматирование
к найденному фрагменту ни как не соображу
0
13077 / 5862 / 1706
Регистрация: 19.09.2009
Сообщений: 8,807
12.07.2012, 21:54 8
Цитата Сообщение от kebot Посмотреть сообщение
получается подчеркнуть только весь текст в документе как применить форматирование к найденному фрагменту
Форматирование текста замены настраивается с помощью объекта Replacement:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const
...
  wdUnderlineSingle = 1;
...
begin
...
  //Настройка формата для текста замены.
  wdRng.Find.Replacement.ClearFormatting;
  wdRng.Find.Replacement.Font.Bold := True;
  wdRng.Find.Replacement.Font.Size := 12;
  wdRng.Find.Replacement.Font.Underline = wdUnderlineSingle;
  //Текст замены.
  wdRng.Find.Replacement.Text := 'Текст замены';
  
  //Поиск и замена всех вхождений шаблона.
  wdRng.Find.Execute(Replace:=wdReplaceAll);
...
end;
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.07.2012, 21:54

Работа с шаблоном Word из Delphi
Помогите пожалуйста нужно чтобы из 2 Edit полей и Memo поля текст втавлялся в шаблон Word при...

Работа с файлами Word из delphi 2007
Делаю курсовой проект приложение которое будет обрабатывать заявки, от рабочих передавать замам и...

Работа с документом Word через Ole в Delphi
Как можно скопировать текст из одного документа и вставить в определенное место в другом??? Как...

Работа метода Word.Selection.Find при поиске в документе Word
Дорого времени суток! никак не могу разобраться в механизме работы range.find Запускаю: ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru