' Проверяем что таблицы есть в документе
If ActiveDocument.Tables.Count >= 1 Then
' Циклом проходим все таблицы
For i = 1 To ActiveDocument.Tables.Count
' Проходим строки текущей таблицы в первом столбце, ищем нужный текст
For j = 1 To ActiveDocument.Tables(i).Rows.Count
' Получаем значение ячейки
Text = ActiveDocument.Tables(i).Cell(j, 1)
' Удаляем последние символы (можно средствами делфи, скорей всего там переводы строки)
Text = Mid(Text, 1, Len(Text) - 2)
If Text = "Что ищем" Then
MsgBox "Найдено"
' Теперь в цикле можно получить значения остальных колонок (первую пропускаем) в данной строке
For k = 2 To ActiveDocument.Tables(i).Columns.Count
' Получаем значение ячейки из столбца k, убираем последние символы
Text2 = ActiveDocument.Tables(i).Cell(j, k)
Text2 = Mid(Text2, 1, Len(Text2) - 2)
' Вывод значения
MsgBox Text2
Next k
End If
Next j
Next i
End If
Как организовать поиск в документе Word посредством Delphi?
Имеется документ Word. В нем находится несколько таблиц. Нужно организовать поиск по первому столбцу. При нахождении нужной ячейки, нужно всю строку, в которой она находится, переместить в Exel. Сам алгоритм понимаю, не могу реализовать в Delphi. Помогите, пожалуйста!!!:confused:
В данном случае Вам необходим объект Table. Получается следующий макрос:
Код:
Данный код проходит все найденные таблицы в документе, в каждой из таблиц проходит строки первого столбца, сравнивает их с нужным текстом, если нужный текст найден, проходит остальные столбцы в строке.
Вам нужно перенести данный код в Делфи, в целом переносится все кроме циклов, ну и функцию обрезания символов тоже можно переложить на Делфи. Теперь Вы можете получить все необходимые данные, и без проблем вставить их в Эксель (надеюсь)
В общем я сейчас пробую немного другой вариант, хочу использовать 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;
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;
Во вложении - весь проект + исходный вордовский документ
Успехов!
Спасибо огромное, очень помогло, все работает!!! Отзыв оставила:)