Поиск в таблице word delphi

К сожалению через finddialog Вы не можете ограничить поиск только по одному столбцу, а потом Вам нужно получить значения остальных столбцов в строке, и как Вы собираетесь это сделать?:)

Если у Вас проблема с переносом данного решения в Делфи, то в честь Рождества помогу Вам примером:

Код:

В uses добавляем OleServer, COMObj

Код:

procedure TForm1.Button1Click(Sender: TObject);
var
    Word, Excel: OleVariant;  // Указатели на приложения
    Path: OleVariant;
    Text, Needle: string;
    i, j, k, c, cc: integer;
begin
    // Основные переменные
    Path:=’C:1.doc’; // Путь к исходному документу
    Needle:=’4′; // Текст для поиска в столбце

    Word:=CreateOleObject(‘Word.Application’); // Создаем экземпляр Word’a
    Word.Visible:=false; // Показываем или скрываем окно приложения
    Excel:=CreateOleObject(‘Excel.Application’); // Создаем экземпляр Excel’a
    Excel.Visible:=true; // Показываем или скрываем окно приложения
    Excel.Workbooks.Add(EmptyParam); // Создаем пустую книгу Excel’a
    c:=0; // Сбрасываем счетчик строк в Excel (можно использовать Вставку строк, но мы будем напрямую задавать значение)
    // Открываем исходный документ
    Word.Documents.Open(Path, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
    // И далее по алгоритму, проверяем что таблицы есть в документе
    if Word.ActiveDocument.Tables.Count >= 1 then begin
        // ShowMessage(‘Найдено таблиц: ‘+IntToStr(Word.ActiveDocument.Tables.Count));
        // Циклом проходим все таблицы
        for i := 1 to Word.ActiveDocument.Tables.Count do begin
            // Проходим строки текущей таблицы в первом столбце, ищем нужный текст
            for j := 1 to Word.ActiveDocument.Tables.Item(i).Rows.Count do begin
                // Выделяем полученную ячейку
                Word.ActiveDocument.Tables.Item(i).Cell(j, 1).Select;
                // Получаем значение ячейки
                Text := Word.Selection.Text;
                // Обрезаем последние 2 символа
                Text := copy(Text,0,Length(Text)-2);
                // ShowMessage(Text);
                // Сравниваем значение первой колонки с необходимым
                if Text = Needle then begin
                    Inc(c); // Переходим на следующую строку в Excel
                    cc:=1; // Сбрасываем счетчик столбцов в Excel
                    // Добавляем в Excel значение первого столбца
                    Excel.Range[Excel.Cells[c,cc],Excel.Cells[c,cc]].Select;
                    Excel.ActiveCell.FormulaR1C1 := Text;
                    // Теперь в цикле можно получить значения остальных колонок (первую пропускаем) в данной строке
                    for k := 2 to Word.ActiveDocument.Tables.Item(i).Columns.Count do begin
                        Inc(cc);
                        // Выделяем полученную ячейку из столбца k
                        Word.ActiveDocument.Tables.Item(i).Cell(j, k).Select;
                        // Получаем значение ячейки
                        Text := Word.Selection.Text;
                        // Обрезаем последние 2 символа
                        Text := copy(Text,0,Length(Text)-2);
                        // ShowMessage(Text);
                        // Теперь можно сохранить эти данные в отдельный коллектор либо сразу же вставлять в Excel
                        Excel.Range[Excel.Cells[c,cc],Excel.Cells[c,cc]].Select;
                        Excel.ActiveCell.FormulaR1C1 := Text;
                    end;
                end;

            end;
        end;
    end else begin
        ShowMessage(‘В документе отсутствуют таблицы’);
    end;

    try
      // Закрываем документ
      Word.Quit;
      //Excel.Quit;
    except
    end;
    // Убиваем приложение
    Word:=Unassigned;
    //Excel:=Unassigned;
end;

Во вложении — весь проект + исходный вордовский документ

Успехов!

0 / 0 / 0

Регистрация: 29.01.2016

Сообщений: 11

1

29.01.2016, 20:45. Показов 5765. Ответов 18


Студворк — интернет-сервис помощи студентам

Уважаемые форумчане. Подскажите пожалуйста решение такой проблемы в Делфи:
Пытаюсь создать программу по полуавтоматическому созданию документов в Ворде. Застрял на середине. Сейчас у меня стоит проблема в том, что например, при установке галочки в CheckBox — удалялся один из абзацев текста сформированного из шаблона, если галочки нет — то удаляется соответственно другой абзац из этого-же документа. Как это реализовать. Мне необходимо выйти именно на этот абзац в документе. Пытаюсь за образец поиска дать скопированный абзац — не получается.



0



Джоуи

1073 / 635 / 240

Регистрация: 05.05.2015

Сообщений: 3,546

Записей в блоге: 2

29.01.2016, 21:22

2

Дай хотя бы часть программы

Вообще, работа с вордом — сущий геморрой

Добавлено через 11 минут
Ты сказал, что работаешь с шаблоном. Тогда в шаблоне можешь поставить закладку на нужные абзацы и затем запросто обращаться к ним.
Выделяешь в ворде нужный фрагмент текста, заходишь в вставка->закладки->добавить (задав нужное имя)

Затем доступ к ним получаешь из своей проги:
WordApp.ActiveDocument.Bookmarks.Item(‘имя_закладк и’).Range



0



Val1966

0 / 0 / 0

Регистрация: 29.01.2016

Сообщений: 11

30.01.2016, 22:31

 [ТС]

3

Добрый вечер уважаемый Joey.
У меня в шаблоне допустиим есть два абзаца: в одном указано что в устройстве Wi-Fi не установлен, в другом что он есть и его номер и т.д.
Я Создаю программу по кирпичикам. Потом вставляю в создаваемую программу.

Думал что код

ПОИСК СЛОВА ИЛИ ТЕКСТА В ОТКРЫТОМ ДОКУМЕНТЕ

Delphi
1
2
3
4
5
6
7
8
var text1:string;
begin
text1:='';
text1:=InputBox('Введите текст',text1,text1);
WAP.Selection.Find.Forward:=true;
WAP.Selection.Find.Text:=text1;
if WAp.Selection.Find.Execute then messagebox(handle,'Поиск завершен успешно','внимание',0);
end;

подойдет нормально, но что-то не пошло. Отдельно код работает. А с образцом искомого текста нет.
Пытался ставить закладку в начало абзаца и в конец — что-то не получается, а мне нужно сделать функцию и для других абзацев в шаблоне документа



0



Джоуи

1073 / 635 / 240

Регистрация: 05.05.2015

Сообщений: 3,546

Записей в блоге: 2

31.01.2016, 00:55

4

А что за ошибку выдает? Или просто ничего не происходит?

Добавлено через 5 минут
Может вы вводите в InputBox действительно несуществующий в документе текст?

Добавлено через 26 минут
Можно скинуть свой документ (или просто образец) и то, что вводите в InputBox. Плюч, обратите внимание, что OLEWord работает только с Widestring, вдруг ваш InputBox возвращает не Wide-строку, а какую-то другую, например, ANSI



0



Джоуи

1073 / 635 / 240

Регистрация: 05.05.2015

Сообщений: 3,546

Записей в блоге: 2

31.01.2016, 01:03

5

У меня прекрасно работает именно ваш код



0



0 / 0 / 0

Регистрация: 29.01.2016

Сообщений: 11

31.01.2016, 10:52

 [ТС]

6

Добрый день! Я не могу решить вот такой вопрос по поиску нужной части текста:
Дело в том, что я по не знанию вставляю вместо InputBox следующее:
text1:= ‘В устройстве обнаружен Wi-Fi’ (это один абзац текста),
второй абзац текста «В устройстве Wi-Fi не обнаружен».

Эти два абзаца имеются в шаблоне документа. В зависимости от того стоит отметка в Чекбоксе или нет, программа находит нужный абзац и удаляет его из создаваемого документа. Эти два абзаца не будут вводится из InputBox, они изначально будут прописаны в коде программы.



0



Joey

Джоуи

1073 / 635 / 240

Регистрация: 05.05.2015

Сообщений: 3,546

Записей в блоге: 2

31.01.2016, 15:21

7

Val1966, Открой ворд, выдели первый абзац, зайди в меню «Вставка -> Закладка», введи имя и нажми «Добавить». Например, absaz1, затем то же со вторым абзацем. Сохрони)

Теперь из своей проги:

Delphi
1
2
3
4
5
//открытие документа...
...
if CheckBox1.Checked then
if WAP.ActiveDocument.Bookmarks.Exists('absac1') then // если найдена закладка
WAP.ActiveDocument.Bookmarks.Item('absac1').Delete;



0



0 / 0 / 0

Регистрация: 29.01.2016

Сообщений: 11

31.01.2016, 17:55

 [ТС]

8

Пишет «Invalid variant operation»

Добавлено через 4 минуты
Если вместо «word.ActiveDocument» ставлю «dok» (dok это «Dok:=Word.Documents.Open(direktoriya);» то не ругается но и ничего не делает.



0



Джоуи

1073 / 635 / 240

Регистрация: 05.05.2015

Сообщений: 3,546

Записей в блоге: 2

31.01.2016, 17:58

9

Val1966, напиши точный код, который вводишь



0



Val1966

0 / 0 / 0

Регистрация: 29.01.2016

Сообщений: 11

31.01.2016, 19:12

 [ТС]

10

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
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
87
88
89
90
91
92
93
94
95
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,ComObj, ExtCtrls, OleServer, WordXP;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Timer1: TTimer;
    Label1: TLabel;
    CheckBox1: TCheckBox;
    WordParagraphFormat1: TWordParagraphFormat;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Label1Click(Sender: TObject);
    function POISK():string;
 
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
  met1,met2,met3,met4,met5,met6,met6a, met7,met8,met9,met10,met10b:string;
  What,Which,Count,Name:Variant;
  Dok:Variant;              
  Word:Variant;           
  Table:Variant;          
  Stroka:Variant;         
  Range:Variant;
 
  
 
 
  
    direktoriya : string;
    text1:AnsiString;
implementation
 
{$R *.dfm}
 //*****************************************************************************
//                  
procedure TForm1.Button1Click(Sender: TObject);
begin
Close;             
end;
//****************************************************************************
//
 
 procedure TForm1.Button2Click(Sender: TObject);
 var
 Word:Variant;
 h:OLEVariant;
 j,lengy:integer;
 
begin
  direktoriya := ExpandFileNAme('шаблон документа1.dot');
     try
 
    Word :=CreateOleObject('Word.Application');
 
    Dok:=Word.Documents.Open(direktoriya);
    except
  ShowMessage('Шаблон не открылся');
  exit
  end;
  POISK;
  Word.Visible:=true;
  end;
{*******************************************************************************}
 
procedure TForm1.Label1Click(Sender: TObject);
begin
 if Label1.Visible then Label1.Visible:=false
else  Label1.Visible :=true;
end;
{******************************************************************************}
 
function TForm1.POISK:string;
begin
 
if CheckBox1.Checked then
if WAP.ActiveDocument.Bookmarks.Exists('vr1') then 
WAP.ActiveDocument.Bookmarks.Item('vr1').Delete;
 
end;



0



Joey

Джоуи

1073 / 635 / 240

Регистрация: 05.05.2015

Сообщений: 3,546

Записей в блоге: 2

31.01.2016, 20:08

11

Мои глазаааа…..

Не по теме:

шучу))

Пока что я вижу только два несхождения:
1. У тебя объявлены две переменные variant с ОДИНАКОВЫМ именем: Word (одна глобальная и одна локальная в Button2Click)
2. В функции POISK ты обращаешься к переменной WAP, хотя в ней ничего нету, потому что в WAP ты никакого Word.Application не создавал. Ты его создал в переменной Word. Понятно, о чем я?

И еще. Локальные переменные, насколько я знаю, уничтожаются из памяти после завершения процедуры/функции, поэтому после того, как процедура Button2Click закончится, в переменной Word у тебя больше ничего не останется. Поэтому вот здесь:

Delphi
1
2
3
procedure TForm1.Button2Click(Sender: TObject);
var
Word:Variant;

удали вот эту строчку Word:Variant;

P.s. Когда пишешь здесь код, используй теги Delphi (для Lazarus-кода вполне подходит), а то модераторы заругают

Добавлено через 14 минут
Вот твой измененный код (если не заработает, отпишись):

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
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
87
88
89
unit Unit1;
 
interface
 
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,ComObj, ExtCtrls, OleServer, WordXP;
 
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Timer1: TTimer;
Label1: TLabel;
CheckBox1: TCheckBox;
WordParagraphFormat1: TWordParagraphFormat;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Label1Click(Sender: TObject);
function POISK():string;
 
private
{ Private declarations }
public
{ Public declarations }
end;
 
var
Form1: TForm1;
 
met1,met2,met3,met4,met5,met6,met6a, met7,met8,met9,met10,met10b: string;
What,Which,Count,Name:Variant;
Dok:Variant;
WAP:Variant;
Table:Variant;
Stroka:Variant;
Range:Variant;
 
direktoriya : string;
text1:AnsiString;
 
implementation
 
{$R *.dfm}
//*****************************************************************************
//
procedure TForm1.Button1Click(Sender: TObject);
begin
Close;
end;
//****************************************************************************
//
 
procedure TForm1.Button2Click(Sender: TObject);
var
h:OLEVariant;
j,lengy:integer;
 
begin
direktoriya := ExpandFileNAme('шаблон документа1.dot');
try
WAP :=CreateOleObject('Word.Application');
Dok := WAP.Documents.Open(direktoriya);
except
ShowMessage('Шаблон не открылся');
exit
end;
POISK;
Word.Visible:=true;
end;
{*******************************************************************************}
 
procedure TForm1.Label1Click(Sender: TObject);
begin
if Label1.Visible then Label1.Visible:=false
else Label1.Visible :=true;
end;
{******************************************************************************}
 
function TForm1.POISK:string;
begin
  if CheckBox1.Checked then
    if WAP.ActiveDocument.Bookmarks.Exists('vr1') then
      WAP.ActiveDocument.Bookmarks.Item('vr1').Delete;
  if not CheckBox1.Checked then
    if WAP.ActiveDocument.Bookmarks.Exists('vr2') then
      WAP.ActiveDocument.Bookmarks.Item('vr2').Delete;
end;

Я изменил Word на WAP. Странно, что компилятор вообще позволил тебе воспользоваться зарезервированным словом Word, которое вроде означает 2 или 4 байта, не помню
И почему у тебя переменная vr1 нигде не объявлена?



0



0 / 0 / 0

Регистрация: 29.01.2016

Сообщений: 11

31.01.2016, 20:27

 [ТС]

12

В функции поиск я обращаюсь к открытому документу — dok.
Удалил Word:variant; Ничего не изменилось.
Прошу прощения не совсем понимаю , что значит теги Delphi???

Добавлено через 6 минут
Ничего не изменилось

Добавлено через 18 секунд
Нет ничего не изменилось



0



Joey

Джоуи

1073 / 635 / 240

Регистрация: 05.05.2015

Сообщений: 3,546

Записей в блоге: 2

31.01.2016, 22:20

13

Вот ты сам написал:

Цитата
Сообщение от Val1966
Посмотреть сообщение

Delphi
88
89
90
91
92
93
function TForm1.POISK:string;
begin
if CheckBox1.Checked then
if WAP.ActiveDocument.Bookmarks.Exists('vr1') then
WAP.ActiveDocument.Bookmarks.Item('vr1').Delete;
end;

И где здесь обращение к Dok.

Да и вообще, я же переделал твой код и написал тебе, попробуй его:

Цитата
Сообщение от Joey
Посмотреть сообщение

Вот твой измененный код (если не заработает, отпишись):



0



Джоуи

1073 / 635 / 240

Регистрация: 05.05.2015

Сообщений: 3,546

Записей в блоге: 2

31.01.2016, 22:24

14

Цитата
Сообщение от Val1966
Посмотреть сообщение

что значит теги Delphi

Когда пишешь сообщение на этом форуме и приводишь довольно большой код программы, нужно его выделить и нажать кнопку delphi на панели набора сообщения

Миниатюры

Поиск заданного текста в документе Word
 



0



0 / 0 / 0

Регистрация: 29.01.2016

Сообщений: 11

02.02.2016, 11:18

 [ТС]

15

Joey. К сожалению присланный Вами код не сработал



0



13094 / 5875 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

02.02.2016, 12:22

16

Val1966, удаление закладки не приведёт к удалению связанного с ней диапазона (и соответствующего текста). Надо удалить или очистить диапазон закладки — тогда удалится соответствующий текст.

Пример обработки документа MS Word с использованием закладок: Как записать данные в файл MS Word



1



Val1966

0 / 0 / 0

Регистрация: 29.01.2016

Сообщений: 11

02.02.2016, 15:00

 [ТС]

17

Большое спасибо за помощь всем. Сделал так:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//   ФУНКЦИЯ ПОИСКА ТЕКСТА В ШАБЛОНЕ И ЕГО УДАЛЕНИЕ
//сначала в шаблоне выделяем абзац который возможно будет удален и добавляем его
//в закладки(например 'vr1'), также выделяем другой абзац и добавляем его в
//закладки (например 'vr2'), сохраняем шаблон
function TForm1.POISK:string;
var
ud1,ud2,ud3:variant;  //рабочая переменная
rng1,rng2:variant;    //рабочая переменная
 
begin
 if CheckBox1.Checked then    // выстяляем уловие и если оно выполняется то
 begin
 bm1:=dok.Bookmarks.Item('vr1');  //переходим на закладку 'vr1'
 rng1:=bm1.Range;            //ссылаемся на диапазон связанный с закладкой 'vr1'
 rng1.Delete                 //удаляем диапазон связанный с этой закладкой
 end
 else                       //если условие не выполнено то
 begin
 bm2:=dok.Bookmarks.Item('vr2');   //переходим на закладку 'vr2'
 rng2:=bm2.Range;         //ссылаемся на диапазон связанный с закладкой 'vr2'
 rng2.Delete;             //удаляем диапазон связанный с этой закладкой
 end;
 end;



0



Джоуи

1073 / 635 / 240

Регистрация: 05.05.2015

Сообщений: 3,546

Записей в блоге: 2

02.02.2016, 19:40

18

Цитата
Сообщение от Mawrat
Посмотреть сообщение

удаление закладки не приведёт к удалению связанного с ней диапазона (и соответствующего текста)

Точно. Мое упущение



0



Mawrat

13094 / 5875 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

03.02.2016, 11:18

19

Val1966, а почему «dok», а не «doc»? И желательно переменные, предназначенные для OLE взаимодействия, объявлять с типом OleVariant. Это гарантирует, что при OLE взаимодействии будут использованы только те типы, которые соответствуют спецификации COM.
Предлагаю сделать так:

Delphi
1
2
3
4
5
6
7
8
9
  //Выбираем нужную закладку.
  if CheckBox1.Checked then
    bm := doc.Bookmarks['vr1']
  else
    bm := doc.Bookmarks['vr2'];
  //Обработка закладки.
  rng := bm.Range;
  bm.Delete;
  rng.Delete;



0



I assume you’re asking mainly how to find the table, rather than how to change the contents of the table afterwards. How to do this depends on the criteria you want to use to find the table of interest.

On the face of it, you should be able to navigate to a given table using the Goto method of MS Word’s Selection object. However, there is a problem with that (see at the end of this answer) in detecting when the operation has failed because Goto didn’t locate the correct table.

If the table of interest is preceded in the document by an identifying text label, you could simply search for the label and, if found, navigate forwards from that, like this example which finds the table after the label ‘Table3’:

procedure TForm1.Button4Click(Sender: TObject);
var
  AFileName : String;
  MSWord,
  Document : OleVariant;
  Found : WordBool;
begin
  AFileName := 'd:aaad7officeautoTables.Docx';

  MSWord := CreateOleObject('Word.Application');
  MSWord.Visible := True;
  Document := MSWord.Documents.Open(AFileName);

  MSWord.Selection.Find.Text :='Table3';
  Found := MSWord.Selection.Find.Execute;
  if Found then begin
    MSWord.Selection.MoveDown( Unit:=wdLine, Count:=1);
  end;
end;

As written, the «if Found …» block merely places the cursor on the first character of the first cell of the table. Once in the table, you can alter its contents however you like.

If you want to find out how to do something like insert an image in a table cell, go to the Developer tab on Word’s ribbon, record a macro that does what you want and then use Edit from the Macros pop-up to look at it — it’s usually fairly easy then to cut’n paste it into Delphi and edit it into the equivalent Delphi code. Same goes for other methods of finding the table you want — record a macro then translate it.

To find the Nth table in a document and plant the cursor in its top left cell, you can do this:

procedure TForm1.Button2Click(Sender: TObject);
var
  AFileName : String;
  MSWord,
  Document,
  Tables,
  Table : OleVariant;
  TableNo : Integer;
begin
  AFileName := 'd:aaad7officeautoTables.Docx';

  MSWord := CreateOleObject('Word.Application');
  MSWord.Visible := True;
  Document := MSWord.Documents.Open(AFileName);

  TableNo := 3;

  Tables := Document.Tables;

  if TableNo <= Tables.Count then begin
    Table := Tables.Item(TableNo);
    Table.Select;
    MSWord.Selection.MoveLeft( Unit:=wdCharacter, Count:=1);
  end;

end;

Btw, in Word’s Find dialog, on the Goto tab, there is Table entry in the Go to what listbox. You can call that in code using something like

MSWord.Selection.GoTo(What:= wdGoToTable, Which:=wdGoToFirst, Count:=3);  

The problem with it is how to check in code whether it succeeded. Unlike Find, which returns a WordBool, Goto returns a Range object. If you try to use it to go to the 10th table in a document which only contains 2 tables, there is no error raised, but the returned range is the last table in the document. I haven’t yet found a way to check from the returned Range whether Goto succeeded without checking some text associated with the table which could have been found using Find in the first place. Of course, if the document is guaranteed to contain the table you’re looking for, this problem with Goto probably needn’t concern you.

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

На первый взгляд, вы должны иметь возможность переходить к данной таблице, используя метод Goto объекта Selection MS Word. Однако существует проблема с этим (см. В конце этого ответа) при обнаружении сбоя операции, потому что Goto не нашел правильную таблицу.

Если интересующей таблице предшествует идентифицирующая текстовая метка в документе, вы можете просто выполнить поиск метки и, если она будет найдена, перейти от нее вперед, как в этом примере, где таблица находится после метки ‘Table3’:

procedure TForm1.Button4Click(Sender: TObject);
var
  AFileName : String;
  MSWord,
  Document : OleVariant;
  Found : WordBool;
begin
  AFileName := 'd:aaad7officeautoTables.Docx';

  MSWord := CreateOleObject('Word.Application');
  MSWord.Visible := True;
  Document := MSWord.Documents.Open(AFileName);

  MSWord.Selection.Find.Text :='Table3';
  Found := MSWord.Selection.Find.Execute;
  if Found then begin
    MSWord.Selection.MoveDown( Unit:=wdLine, Count:=1);
  end;
end;

Как написано, блок «if Found …» просто помещает курсор на первый символ первой ячейки таблицы. Оказавшись в таблице, вы можете изменить ее содержимое по своему усмотрению.

Если вы хотите узнать, как сделать что-то вроде вставки изображения в ячейку таблицы, перейдите на вкладку «Разработчик» на ленте Word, запишите макрос, который делает то, что вы хотите, а затем используйте Изменить из < strong> Macros , чтобы посмотреть на него — обычно довольно легко вырезать и вставить его в Delphi и отредактировать в эквивалентный код Delphi. То же самое и с другими методами поиска нужной таблицы — запишите макрос, а затем переведите его.

Чтобы найти N-ю таблицу в документе и установить курсор в ее левую верхнюю ячейку, вы можете сделать это:

procedure TForm1.Button2Click(Sender: TObject);
var
  AFileName : String;
  MSWord,
  Document,
  Tables,
  Table : OleVariant;
  TableNo : Integer;
begin
  AFileName := 'd:aaad7officeautoTables.Docx';

  MSWord := CreateOleObject('Word.Application');
  MSWord.Visible := True;
  Document := MSWord.Documents.Open(AFileName);

  TableNo := 3;

  Tables := Document.Tables;

  if TableNo <= Tables.Count then begin
    Table := Tables.Item(TableNo);
    Table.Select;
    MSWord.Selection.MoveLeft( Unit:=wdCharacter, Count:=1);
  end;

end;

Между прочим, в диалоговом окне поиска Word на вкладке Goto в списке Go to what есть запись Table. Вы можете вызвать это в коде, используя что-то вроде

MSWord.Selection.GoTo(What:= wdGoToTable, Which:=wdGoToFirst, Count:=3);  

Проблема в том, как проверить в коде, удалось ли это. В отличие от Find, который возвращает WordBool, Goto возвращает объект Range. Если вы попытаетесь использовать его для перехода к 10-й таблице в документе, который содержит только 2 таблицы, ошибки не возникнет, но возвращаемый диапазон будет последней таблицей в документе. Я еще не нашел способ проверить из возвращенного диапазона, удалось ли Goto, без проверки некоторого текста, связанного с таблицей, который можно было бы найти с помощью Find в первую очередь. Конечно, если документ гарантированно содержит искомую таблицу, проблема с Goto, вероятно, вас не волнует.


3

MartynA
2 Дек 2015 в 08:38


Форум программистов Vingrad

Модераторы: MetalFan

Поиск:

Ответ в темуСоздание новой темы
Создание опроса
> Поиск в Ворде фразы и вставка ее в Дельфи 

:(

   

Опции темы

Artem2005
Дата 9.1.2005, 13:43 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Новичок

Профиль
Группа: Участник
Сообщений: 4
Регистрация: 16.12.2004

Репутация: нет
Всего: нет

Делаю программу по тестированию, и необходимо что-бы в дельфи вставлялся конкретный вопрос находящийся в doc файле

PM MAIL   Вверх
<Spawn>
Дата 11.1.2005, 06:34 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Око кары:)
****

Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: нет
Всего: 64

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

———————

«Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать» — Николай Безруков.

PM MAIL ICQ   Вверх
Artem2005
Дата 11.1.2005, 14:26 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Новичок

Профиль
Группа: Участник
Сообщений: 4
Регистрация: 16.12.2004

Репутация: нет
Всего: нет

Дапустим я набираю вопрос в Ворде, и что дальше?

PM MAIL   Вверх
Medved
Дата 11.1.2005, 14:58 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Эксперт
****

Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: нет
Всего: 154

Действительно старнный подход. Логика приложения строиться в зависимости от того, в каком редакторе будут набираться вопросы. А вы мне вот скажите, как будет стоиться приложение, если вопросы будете набирать ну например в PhotoShop?

———————

http://extreme.sport-express.ru/
…и неважно сколько падал, важно сколько ты вставал…

PM MAIL WWW ICQ Skype GTalk   Вверх
Darksquall
Дата 27.1.2005, 12:38 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Опытный
**

Профиль
Группа: Участник
Сообщений: 326
Регистрация: 22.1.2004
Где: Москва

Репутация: 1
Всего: 4

Хоть и странно, но отвечаю.
Положим на форму кнопку, WordApplications и WordDocument (вкладка Servers).

Пишем Функцию поиска слова.

Код

Function Tform1.Find(St:string):string;
var a, b: OleVariant;
j, ilengy: Integer;
Nashli:boolean;
begin
Nashli:=false;
       ilengy:=Length(WordDocument1.Range.Text);
       j:=0;
       repeat
               a:=j;
               b:=j+Length(st);
               if WordDocument1.Range(a,b).Text=st then Nashli:=true;
       inc(j);
       until (j>=ilengy-Length(st)) or Nashli;
       if Nashli then Find:=WordDocument1.Range(a,b).Text;
end;

И не забываем добавить функцию в класс TForm1

Теперь подключаемся к Doc файлу через компоненты со вкладки Servers, WordApplications и WordDocument.

Код

procedure TForm1.Button1Click(Sender: TObject);
var
DocName,ConfConv,ReadOnly,AddToRecFiles,Psw,PswTmp,Revert,WritePsw,WritePswTmp,
 Fmt,replace,star :OleVariant;
begin
DocName:='word1.doc';//имя файла
ConfConv:=False;
ReadOnly:=False;
AddToRecFiles:=False;
Psw:='';
PswTmp:='';
Revert:=False;
WritePsw:='';
WritePswTmp:='';
Fmt:=wdOpenFormatAuto;
replace:=wdReplaceAll;
WordApplication1.Connect;
WordApplication1.Visible:=false;//не включаем видимость Ворда
WordApplication1.Documents.Open(DocName, ConfConv, ReadOnly, AddToRecFiles,
 Psw, PswTmp, Revert, WritePsw, WritePswTmp, Fmt, EmptyParam,EmptyParam);
WordDocument1.ConnectTo(WordApplication1.ActiveDocument);
// Ищем, а затем выводим на экран
Showmessage(Form1.Find('Да здравствует Ленин!'));
//не забываем закрыть word
WordDocument1.Close;
WordApplication1.Disconnect;
end;

smile

Это сообщение отредактировал(а) Darksquall — 27.1.2005, 12:41

———————

www.bankcards.su

PM WWW ICQ   Вверх



















Ответ в темуСоздание новой темы
Создание опроса
Правила форума «Delphi: ActiveX/СОМ/CORBA»

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »

Like this post? Please share to your friends:
  • Поиск в таблице excel по фильтру
  • Поиск в массиве такого же значения excel
  • Поиск в таблице excel по нескольким столбцам
  • Поиск в массиве по критерию excel
  • Поиск в таблице excel на макбуке