Word.Application и области редактирования

seoman2

Green Team
17.02.2010
507
1
BIT
72
Вот еще вопрос на тему VBA в лотусскрипте.
Есть у меня вба скрипт.

никак не получается перевести его на лоотус.
проблема:
Set myRange = worddoc.Range( mStart%,mEnd% ) - работает.
хочу сделать объект Selection
Dim sel As Variant
Set sel = myRange.Select - тут никак не придумаю (((
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
И как на лотусскрипт перевести строку
Selection.Find.Execute Replace := wdReplaceAll
тоже не ясно.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
рабочий код по замене
Код:
'замена "шаблонов" (ключевых слов) в документе ворда, на значения из списка
'ключ хэша - "шаблон", значение - замена
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
'       Do While rngResult.Find.Execute()
'           i = i + 1
'           rngResult.Select
'           worddoc.Application.Selection.Text=m
'           rngResult.Collapse 0 'wdCollapseEnd
'       Loop
        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
на входе - хэш из "что"->"на что" меняем
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
решение не имеющее идиотских МС объектов
и не имеющее ограничение на длину замен/поиска, форматирование и т.п.
в контексте теста - просто заменяет текст
форматирование можно, но не делал
 
Последнее редактирование:

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
изменения, в коде по ссылке, для болда (т.е. заменит текст, да еще и сделает болдом)
Java:
    private void paragraphReplace(XWPFRun r) {
        String text = r.getText(0);
        if (text != null) {
            for(Map.Entry<String, String> entry : map.entrySet()) {
                if(entry.getKey().length()>0) {
                    if (text.contains(entry.getKey())) {
                        text=text.replace(entry.getKey(), entry.getValue());
                        System.out.println("Replacement:"+entry.getKey()+"|"+entry.getValue());
                        r.setBold(true);
                        r.setText(text, 0);
                    }
                }
            }
        }
    }
r.setBold(true);
делов-то, если не надо текст заменять убираем r.setText(text, 0);
дописывать либу не вижу смысла - цель не ясна
 
A

Anatoly

А там точно через Bookmark? Может в доке определены пользовательские поля? Которые CustomDocumentProperties.
Перед тем как считывать/присваивать значение неплохо-бы проверить наличие по имени.
Что-то вроде:
Код:
Forall prop In WApp.ActiveDocument.CustomDocumentProperties
    If prop.Name=N Then
        prop.Value=V
        Exit Forall
    End If
End Forall
 
Последнее редактирование модератором:

seoman2

Green Team
17.02.2010
507
1
BIT
72
рабочий код по замене
Можно пример вызова функции ReplaceByTemplate ?
Чё то не работает
Код:
Dim b As String
b = "b"
xxxxxxxxxx = ReplaceByTemplate(b, worddoc)
......

Function ReplaceByTemplate(replacementList  As String, worddoc As Variant) As Boolean
Ну еще везде Listtag постирал.

А в чем ошибка тут -
неясно, все отрабатывает, а в ворде ничё не меняется (
 
Последнее редактирование:

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
Ну еще везде Listtag постирал.
ну там же видно - она по List и бежит
его наполнить надо - как в описании ф-ции - ключ->значение (что менять->на что менять)
Код:
Dim lst List As String
lst({поменяй меня})={заменилось я!}
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
В ворде ставлю в тексте буковку b, хочу заменить её на <b>...

Dim myList List As String
myList ("b") = "<b>"
xxxxxxxxxx = ReplaceByTemplate(myList , worddoc)

ничё не меняется в ворд файле....

If rngResult.Find.Found = True Then
Print "Найдено совпадение"
- печатает что есть совпадение...
 
Последнее редактирование:

seoman2

Green Team
17.02.2010
507
1
BIT
72
Да и в принципе, как можно в {поменяй меня} засунуть выражение для всех жирных символов?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
Да и в принципе, как можно в {поменяй меня} засунуть выражение для всех жирных символов?
да - можно
но как часто бывает - у вас нет четкого понимания задачи и средств решения
список вопросов:
  • почему надо менять именно выделенные жирным
  • выделенные жирным содержат текст, какое решение принять (т.е. какой текст замены д.б.)
  • почему выделение жирным является признаком замены
  • как организован весь процесс от создания шаблона/формирования/хранения/изменения...
вы смотрели ссылки https://github.com/opensagres/xdocreport/wiki как там организован процесс шаблонизации и обработки?
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
Есть у меня понимание.
Я хочу VBA скрипт, который как макрос работает правильно:
Код:
 Selection.Find.ClearFormatting
    Selection.Find.Font.Bold = True
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "(<*>)"
        .Replacement.Text = "<b>\1</b>"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
перевести на лотусскрипт.
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
  • почему надо менять именно выделенные жирным - хочу помечать тегом <b> все жирные слова. Глобально - сделать свой конверт области дока с word в html.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
Я хочу VBA скрипт, который как макрос работает правильно:
это и есть ошибка, ну т.е. совершенно не задача касательно LDN
у меня нет проблем с КОМ, там есть нюансы...
а у вас эти проблемы возникают "часто" - так может престать пользоваться технологией, кот. вам неудобна?!
Или задачу озвучить вне привязке к вашему желанию испольльзовать ВБА
перевести на лотусскрипт.
зачем - если, как утверждаете, это работает - пользуйте ВБА (вызывайте Shell из ЛС)
получается странная ситуация - берете чисто МС движок, для целей не связанных с LDN и зачем-то тянете это в ЛС
Глобально - сделать свой конверт области дока с word в html.
это никак не связано с ЛС
мало того - в POI есть готовый конвертор в html из ворд документа
и появится вопрос - кто и какими средствами будет выделять область в документе

Как уже упоминал выше - нужен весь процесс, а не кусок процесса, с упоминанием ср-в, возможно не подходящих к случаю
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
вызывайте Shell из ЛС - одного макроса? причем надо будет создавать макрос в ворде?

Весь процесс: в лотусе есть вложение word. В ворде есть между двумя закладками текст. Мне нужно его сконвертить в html со всякой жирностью и прочим форматированием.
Потом этот html я использую в итоговом XML файле (он форируется на основе части полей лотусового документа, часть из ворда), который подписываю ЭЦП,
 

savl

Lotus Team
28.10.2011
2 625
314
BIT
545
@seoman2 не проще ли было:
1. взять вложение
2. выгрузить на диск.
3. на LS через COM обратиться к этому файлу
4. Сохранить файл как HTML/XML:
Можно в ворде начать записывать макрос или найти рефы как это сделать.
5. делаем дальше что нужно.

@lmike не будет он java использовать.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
одного макроса? причем надо будет создавать макрос в ворде?
и что пугает, по вашему - вызов КОМ из нотусни лучше?
мало того - можете писать на чем угодно (не обязательно в ворде и не обязательно макрос)
есть такая шняга - ws - виндовзскрипт и там все пироги из МСявых обектов
пишете на нем скрипт, скармливаете вордятину, результат суёте - куда требуется
Весь процесс: в лотусе есть вложение word. В ворде есть между двумя закладками текст
для POI (для КОМа - копия в буфер и вставка в новый файл, сохранение как хтмл) - поиск по граничным тегам (в вашем случае "закладки") получения текста с форматированием и копирование в новый док, конвертация в
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
@lmike не будет он java использовать.
дык и с КОМ-ом, сколько я вижу здесь посты - ничего не получается, просто КОМ ворда - это совершенно не профильная тема для текущего раздела
Смысл здесь спрашивать?!
Написать-то (уверен) могут и здесь (решение), но учитывая что "там" что-то свое и с особенностями - смысл "тратить время" отсутствует
яж выложил пример замены/получения текста (на КОМ-е) - толку-то...
 

garrick

Lotus Team
26.10.2009
1 367
152
BIT
364
Весь процесс: в лотусе есть вложение word. В ворде есть между двумя закладками текст. Мне нужно его сконвертить в html со всякой жирностью и прочим форматированием.
Потом этот html я использую в итоговом XML файле (он форируется на основе части полей лотусового документа, часть из ворда), который подписываю ЭЦП,
А зачем оно в ворде? Откуда оно там? Может быть рассмотреть вариант хранения этого текста в другом виде?
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
garrick - докумнетооборот у нас уже уже такой - лотус испоьлзуется как транспорт между людьми ворд документов.

Что за POI ?

Сделал сохранение в htm лотусскриптом на основе макроса

Код:
    WordApp.ChangeFileOpenDirectory "C:\XML\"
    Call    worddoc.SaveAs ("1234.htm", wdFormatFilteredHTML,False, "",True,"",False,False,False,False,False )
И не пашет. Что за (( Параметр wdFormatFilteredHTML - не отрабатывает.
 
Последнее редактирование:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!