"тонкости" работы с поиском Msword

Тема в разделе "Lotus - Программирование", создана пользователем lmike, 26 окт 2010.

  1. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.075
    Симпатии:
    300
    история началась с того, что поля ворда неудобны для массового применения (программной подстановки)
    было решено заменить их шаблонами текста, например:
    <Field1|default value|description[example]>
    т.е. вместо поля вставляется такая конструкция
    в нотуса это заносится в виде дока (могут быть варианты) с полями:
    name value comments (где каменты включают часть description[example])
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"код для получения "полей" ворда"</div></div><div class="sp-body"><div class="sp-content">
    Код (LotusScript):
    'получение списка "шаблонов" (слов для замены) из ворд документа
    'результат в textList (ключ в хэше)
    Function GetListByTemplate(worddoc As Variant, template As String, textlist List As String) As Boolean
    Erase textlist
    On Error Goto ErrorHandler
    Dim wObj As Variant
    Dim rngToSearch As Variant
    Dim rngResult As Variant
    Dim i As Integer
    Dim s As String

    Set wObj = worddoc.Application
    Set rngToSearch = worddoc.Content
    Set rngResult = rngToSearch.Duplicate
    '.Text = ""
    rngResult.Find.Text = template 'возможный вариант: "\<*\>"
    rngResult.Find.Forward = True
    rngResult.Find.Wrap = wdFindStop
    rngResult.Find.MatchCase = False
    rngResult.Find.MatchWildcards = True
    Do While rngResult.Find.Execute()
    i = i + 1
    rngResult.Select
    s = worddoc.Application.Selection.Text
    rngResult.Collapse 0 'wdCollapseEnd
    textList(s)=""
    Loop
    Print "Occurance in Word document" & template & " #" & Cstr(i)
    GetListByTemplate=True
    ExitFunctoin:
    Exit Function
    ErrorHandler:
    Call RaiseError()
    Erase textlist
    Resume ExitFunctoin
    End Function
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"код для замены"</div></div><div class="sp-body"><div class="sp-content">
    Код (LotusScript):
    'замена "шаблонов" (ключевых слов) в документе ворда, на значения из списка
    'ключ хэша - "шаблон", значение - замена
    Function ReplaceByTemplate(replacementList List As String, worddoc As Variant) As Boolean
    On Error Goto ErrorHandler
    Dim wObj As Variant
    Dim rngToSearch As Variant
    Dim rngResult As Variant
    Dim i As Long
    Dim s As String, txt As String

    Set wObj = worddoc.Application
    Set rngToSearch = worddoc.Content
    Forall m In replacementList
    Set rngResult = rngToSearch.Duplicate
    '       s=defDelim.GetEscLeft() & Listtag(m) & defDelim.GetEscRight()
    '       s={\<} & Listtag(m) & {\>}
    s=Listtag(m)
    rngResult.Find.Text = s
    rngResult.Find.Forward = True
    rngResult.Find.Wrap = wdFindStop
    'не действует MachCase=False для шаблона \<fld_name\>
    rngResult.Find.MatchCase = False'MSWord - индусское поделие
    '       rngResult.Find.MatchWholeWord = False
    rngResult.Find.MatchWildcards = True
    txt=Cstr(m)
    rngResult.Find.Replacement.Text=txt
    rngResult.Find.Execute ,,,,,,,,,,wdReplaceAll
    i=i+1
    DbgMsg({Значение:} & Listtag(m) & ", #" & Cstr(i))
    End Forall

    ReplaceByTemplate=True
    ExitFunctoin:
    Exit Function
    ErrorHandler:
    Call RaiseError()
    Print {#} & Format(i, {000000}) & {;replace value>} & s & {;by value>} & txt
    Resume ExitFunctoin
    End Function
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"а вот далее начинаются нюанецы, кот. описаны мною в каментах"</div></div><div class="sp-body"><div class="sp-content">
    Код (LotusScript):
    ...................
    Dim templList List As String
    Call GetListByTemplate(worddoc, search, templList)
    Forall m In templList
    Dim doc As NotesDocument
    Dim rec As Variant
    Dim pattern As String
    pattern=Listtag(m)
    pattern=Mid(pattern,2,Len(pattern)-2) 'отрезаем делимитеры (предполагается 1-ин символ)
    rec=Split(pattern,FLDREC_SEP) 'сплит на имя|значение|каменты
    Dim org As String
    org=rec(0)
    'rec(0)=Trim(org) 'убираем граничные пробелы
    'с пробелами (в названиях "полей") - полюбасу траблы
    'лучше отобразить (чтобы потом исправить)

    Dim stmp As String, sUtrim As String
    sUtrim=Ucase(Trim(rec(0))) 'для перезаписи полей
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'этот блок для борьбы с реализацией программного поиска в Word
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'для последующей "нормализации" в Word документе
    'вариант точного соответствия
    'Ucase для обхода глюка ворда - не действует MachCase=False для шаблона \<fld_name\>, д.б. точное соответ.
    stmp=defDelim.GetEscLeft & defDelim.GetEscaped(pattern) & defDelim.GetEscRight
    'но - этот поиск не будет работать (по точному соответствию), если фраза разносится на несколько строк
    ' "спасибо" индусам (нирвана им в анус)
    recreplace(stmp)=defDelim.GetLeft & sUtrim & defDelim.GetRight

    'поэтому делаем ЕЩЁ и вариант с wildcard
    recreplace(defDelim.GetEscLeft & org & FLDREC_SEP & {*} & defDelim.GetEscRight)=_
    defDelim.GetLeft & sUtrim & defDelim.GetRight
    'ниже - можно (впринципе) не делать, если прдыдущее не помогло, это тоже не спасёт;)
    '       recreplace(defDelim.GetEscLeft & org & defDelim.GetEscRight)=_
    '       defDelim.GetLeft & Ucase(rec(0)) & defDelim.GetRight
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ..........................
    End Forall
    ..........................
    Call ReplaceByTemplate(recreplace, worddoc)
     
  2. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
  3. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.075
    Симпатии:
    300
    яб тоже плюнул (и плюну), но у нас корпоративная любовь к МС продуктам ;) (и согласование текста делают через ... = МСО)
    а плюну след. образом - буду втягивать текст контрактов в нотусню
    а потом -> PDF
    но это мои мечты ;) - а времени нет
     
  4. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Вот
     
  5. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.075
    Симпатии:
    300
    это слишком "простой" ПДФ ;)
    надо более продвинутый вариант делать
    схема уже оглашалась... notesdoc->DXL->SAX+FOP->PDF
     
Загрузка...

Поделиться этой страницей