история началась с того, что поля ворда неудобны для массового применения (программной подстановки)
было решено заменить их шаблонами текста, например:
<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">
<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">
<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">
было решено заменить их шаблонами текста, например:
<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">
Код:
'получение списка "шаблонов" (слов для замены) из ворд документа
'результат в 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
Код:
'замена "шаблонов" (ключевых слов) в документе ворда, на значения из списка
'ключ хэша - "шаблон", значение - замена
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
Код:
...................
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)