Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Delphi: Система, Windows API > Помогите получить значения из Wordа


Автор: JonyBest 12.10.17, 11:52
Есть документ Word. В документе выгрузка из базы данных. В тексте куча гамна, периодически в тексте проходит строка типа
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Фамилия Иванов      Имя Петр      Отчество Иванович

Нужно эти данные вставить в sql.
Нужную строку по признаку "Фамилия" осуществляю по коду
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     function FindInDoc(const aWdDoc : Variant; const aSearchText : String) : Variant;
    const
      wdFindStop = 0; //Завершить поиск при достижении границы диапазона.
    var
      wdRng, wdFind : Variant;
    begin
      VarClear(Result);
      //Диапазон, охватывающий всё содержимое документа.
      wdRng := aWdDoc.Content;
     
      //Настройка поиска.
      wdFind := wdRng.Find;
      //wdFind.ClearFormatting;
      wdFind.Text := aSearchText;
      //True - поиск вести от начала - к концу диапазона.
      wdFind.Forward := True;
      //wdFindStop - завершить поиск при достижении границы диапазона.
      //wdFind.Wrap := wdFindStop;
     
      //Поиск текста.
      if wdFind.Execute then Result := wdRng;
    end;


Как выбрать следующее слово за найденным? Типа Word.ActiveDocument.Words?

Автор: Fr0sT 12.10.17, 16:01
Если это именно строчка (т.е. заканчивается переводом строки), то брать от найденного начала до конца параграфа, выкусывать строку целиком, а потом крутить ее в коде как захочется

Автор: leo 14.10.17, 05:46
Цитата JonyBest @
Как выбрать следующее слово за найденным?

Покопаться в хэлпе для Word VBA и найти\выбрать метод(ы) перемещения Range или Selection на следующее слово.
Например, по простому можно сделать так
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    R.Collapse wdCollapseEnd  'передвигаем на конец выделения
    R.Move wdWord, 1  'передвигаем на начало следующего слова
    R.MoveEnd wdWord, 1 'расширяем до конца слова, включая хвостовые пробелы

Но при этом нужно учитывать, что 1) будет выбрано следующее слово вместе со всеми хвостовыми пробелами (в строке их можно отсечь функцией TrimRight), 2) если фамилия или имя являются составными (несколько слов через дефис), то будет выбрано только первое слово до дефиса. Поэтому для сложных слов вместо простого MoveEnd можно использовать MoveEndUntil до одного из заданных символов конца слова. Например
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    R.MoveEndUntil " .;" + vbTab

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)