К сожалению через 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
Уважаемые форумчане. Подскажите пожалуйста решение такой проблемы в Делфи:
0 |
Джоуи 1073 / 635 / 240 Регистрация: 05.05.2015 Сообщений: 3,546 Записей в блоге: 2 |
|
29.01.2016, 21:22 |
2 |
Дай хотя бы часть программы Вообще, работа с вордом — сущий геморрой Добавлено через 11 минут Затем доступ к ним получаешь из своей проги:
0 |
Val1966 0 / 0 / 0 Регистрация: 29.01.2016 Сообщений: 11 |
||||
30.01.2016, 22:31 [ТС] |
3 |
|||
Добрый вечер уважаемый Joey. Думал что код ПОИСК СЛОВА ИЛИ ТЕКСТА В ОТКРЫТОМ ДОКУМЕНТЕ
подойдет нормально, но что-то не пошло. Отдельно код работает. А с образцом искомого текста нет.
0 |
Джоуи 1073 / 635 / 240 Регистрация: 05.05.2015 Сообщений: 3,546 Записей в блоге: 2 |
|
31.01.2016, 00:55 |
4 |
А что за ошибку выдает? Или просто ничего не происходит? Добавлено через 5 минут Добавлено через 26 минут
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, они изначально будут прописаны в коде программы.
0 |
Joey Джоуи 1073 / 635 / 240 Регистрация: 05.05.2015 Сообщений: 3,546 Записей в блоге: 2 |
||||
31.01.2016, 15:21 |
7 |
|||
Val1966, Открой ворд, выдели первый абзац, зайди в меню «Вставка -> Закладка», введи имя и нажми «Добавить». Например, absaz1, затем то же со вторым абзацем. Сохрони) Теперь из своей проги:
0 |
0 / 0 / 0 Регистрация: 29.01.2016 Сообщений: 11 |
|
31.01.2016, 17:55 [ТС] |
8 |
Пишет «Invalid variant operation» Добавлено через 4 минуты
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 |
|||
0 |
Joey Джоуи 1073 / 635 / 240 Регистрация: 05.05.2015 Сообщений: 3,546 Записей в блоге: 2 |
||||||||
31.01.2016, 20:08 |
11 |
|||||||
Мои глазаааа….. Не по теме: шучу)) Пока что я вижу только два несхождения: И еще. Локальные переменные, насколько я знаю, уничтожаются из памяти после завершения процедуры/функции, поэтому после того, как процедура Button2Click закончится, в переменной Word у тебя больше ничего не останется. Поэтому вот здесь:
удали вот эту строчку Word:Variant; P.s. Когда пишешь здесь код, используй теги Delphi (для Lazarus-кода вполне подходит), а то модераторы заругают Добавлено через 14 минут
Я изменил Word на WAP. Странно, что компилятор вообще позволил тебе воспользоваться зарезервированным словом Word, которое вроде означает 2 или 4 байта, не помню
0 |
0 / 0 / 0 Регистрация: 29.01.2016 Сообщений: 11 |
|
31.01.2016, 20:27 [ТС] |
12 |
В функции поиск я обращаюсь к открытому документу — dok. Добавлено через 6 минут Добавлено через 18 секунд
0 |
Joey Джоуи 1073 / 635 / 240 Регистрация: 05.05.2015 Сообщений: 3,546 Записей в блоге: 2 |
||||
31.01.2016, 22:20 |
13 |
|||
Вот ты сам написал:
И где здесь обращение к Dok. Да и вообще, я же переделал твой код и написал тебе, попробуй его:
Вот твой измененный код (если не заработает, отпишись):
0 |
Джоуи 1073 / 635 / 240 Регистрация: 05.05.2015 Сообщений: 3,546 Записей в блоге: 2 |
|
31.01.2016, 22:24 |
14 |
что значит теги Delphi Когда пишешь сообщение на этом форуме и приводишь довольно большой код программы, нужно его выделить и нажать кнопку delphi на панели набора сообщения Миниатюры
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, удаление закладки не приведёт к удалению связанного с ней диапазона (и соответствующего текста). Надо удалить или очистить диапазон закладки — тогда удалится соответствующий текст.
1 |
Val1966 0 / 0 / 0 Регистрация: 29.01.2016 Сообщений: 11 |
||||
02.02.2016, 15:00 [ТС] |
17 |
|||
Большое спасибо за помощь всем. Сделал так:
0 |
Джоуи 1073 / 635 / 240 Регистрация: 05.05.2015 Сообщений: 3,546 Записей в блоге: 2 |
|
02.02.2016, 19:40 |
18 |
удаление закладки не приведёт к удалению связанного с ней диапазона (и соответствующего текста) Точно. Мое упущение
0 |
Mawrat 13094 / 5875 / 1706 Регистрация: 19.09.2009 Сообщений: 8,808 |
||||
03.02.2016, 11:18 |
19 |
|||
Val1966, а почему «dok», а не «doc»? И желательно переменные, предназначенные для OLE взаимодействия, объявлять с типом OleVariant. Это гарантирует, что при OLE взаимодействии будут использованы только те типы, которые соответствуют спецификации COM.
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 |
|
||
Новичок Профиль Репутация: нет
|
Делаю программу по тестированию, и необходимо что-бы в дельфи вставлялся конкретный вопрос находящийся в doc файле |
||
|
|||
<Spawn> |
|
||
Око кары:) Профиль
Репутация: нет
|
Какой то странный подход. Почему не создать простенькую базу для хранения вопросов? ——————— «Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать» — Николай Безруков. |
||
|
|||
Artem2005 |
|
||
Новичок Профиль Репутация: нет
|
Дапустим я набираю вопрос в Ворде, и что дальше? |
||
|
|||
Medved |
|
||
Эксперт Профиль
Репутация: нет
|
Действительно старнный подход. Логика приложения строиться в зависимости от того, в каком редакторе будут набираться вопросы. А вы мне вот скажите, как будет стоиться приложение, если вопросы будете набирать ну например в PhotoShop? ——————— http://extreme.sport-express.ru/ |
||
|
|||
Darksquall |
|
||||
Опытный Профиль
Репутация: 1
|
Хоть и странно, но отвечаю. Пишем Функцию поиска слова.
И не забываем добавить функцию в класс TForm1 Теперь подключаемся к Doc файлу через компоненты со вкладки Servers, WordApplications и WordDocument.
Это сообщение отредактировал(а) Darksquall — 27.1.2005, 12:41 ——————— www.bankcards.su |
||||
|
|||||
|
Правила форума «Delphi: ActiveX/СОМ/CORBA» | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) |
0 Пользователей: |
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема » |