Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как организовать поиск в документе Word посредством Delphi?

48K
05 января 2010 года
Pinkygirl
12 / / 23.10.2009
Имеется документ Word. В нем находится несколько таблиц. Нужно организовать поиск по первому столбцу. При нахождении нужной ячейки, нужно всю строку, в которой она находится, переместить в Exel. Сам алгоритм понимаю, не могу реализовать в Delphi. Помогите, пожалуйста!!!:confused:
50K
06 января 2010 года
public_morozov
45 / / 06.01.2010
Вообще для решения подобных задач лучше всего использовать встроенный в офисные приложения редактор макросов + msdn или встроенный offline developer help по объектам (включаете запись макросов, производите нужные операции и далее смотрите как это делается в VisualBasic. А уже после переносите в используемую IDE, слегка корректируя синтаксис)

В данном случае Вам необходим объект Table. Получается следующий макрос:

Код:
' Проверяем что таблицы есть в документе
    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


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

Вам нужно перенести данный код в Делфи, в целом переносится все кроме циклов, ну и функцию обрезания символов тоже можно переложить на Делфи. Теперь Вы можете получить все необходимые данные, и без проблем вставить их в Эксель (надеюсь)
48K
09 января 2010 года
Pinkygirl
12 / / 23.10.2009
В общем я сейчас пробую немного другой вариант, хочу использовать finddialog, но он как будто бы не привязывается к самому документу. Не могу понять причину. Если мой вариант не пойдет, буду пробовать Ваш. Огромное спасибо за подробное объяснение. Отпишусь скоро.
50K
09 января 2010 года
public_morozov
45 / / 06.01.2010
К сожалению через 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;


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

Успехов!
48K
10 января 2010 года
Pinkygirl
12 / / 23.10.2009
Спасибо огромное, очень помогло, все работает!!! Отзыв оставила:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог