1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление

Из лотуса в ворд

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

  1. lionk

    lionk Well-Known Member

    Репутация:
    0
    Регистрация:
    5 апр 2007
    Сообщения:
    310
    Симпатии:
    3
    Сразу сорри за поднятие темы которую и так часто поднимают.

    По форуму искал решений нашол много, старых и не очень но окончательной реализации которая меня устроила ненашол.

    хочу зделать так:
    есть документ(лотус) "Форма печати" в котором лежит оле обект вордовского документа в которм нужно заменить поля на значения из лотус документа что выгружаем.

    вод код кнопки печати
    и он не работает, не возможно достучатся к обекту ворда, он есть но ниже уровня word.Application.document опустится нельзя.

    разбирался как єто делается в екселе там документ сохраняется на диск, инициализируется и потом сохранение убивается.

    добавил механизм сохранения и переоткрытия, всё зарабоало, но открывается мой док и ещё один, и на диске остаётся файл, удалить его нельзя бо занят вордом.

    нужно чтобы небыло лишнего дока в памяти и на диске.
    я думаю что такой механизм у когото давно реализован, поделитесь хотябы инициализацией.
    и ещё у когото есть описание всех подкласов функций и свойств обекта Ворд, ато как слепой щенок мыкаюсь.

    Код:
    			Set formdoc=GetPrintFormByAlias ("Word") 
    If formdoc Is Nothing Then
    Print "doc for report is Nothing !"
    Exit Sub
    End If
    
    Set rtitem=formdoc.GetfirstItem("PrintFormBody")	
    Set object=rtitem.EmbeddedObjects(0)
    Print "Инициализация " & object.Class & " ..."
    
    Set worddoc=object.Activate(False)
    
    Set word=worddoc.Application
    
    
    v=Evaluate(|@Unique+".doc"|)
    Path=word.Path+"\"+Cstr(v(0))
    Call worddoc.SaveAs(path)
    
    Call word.Application.documents.Open(path)
    
    'Kill Path		
    
    worddoc.FormFields(1).result = "!!!!!!!!!!!!!!!!!!!!!!"
    
    worddoc.Application.Visible = True
     
  2. morpheus

    morpheus скриптописец

    Репутация:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    3.915
    Симпатии:
    1
    lionk
    Так-с .. я не осилиил, вроде как направление правильное ( тоже что и Set wordApp = CreateObject ("Word.Application") )
    Детальное описания методов/свойств классов сматрите в справке к VBA
    Можете также ознакомиться с нашими наработками
     
  3. lionk

    lionk Well-Known Member

    Репутация:
    0
    Регистрация:
    5 апр 2007
    Сообщения:
    310
    Симпатии:
    3
    Morpheus
    я это всё читал
    нужно чтобы файл не сохранялся на диске, или у вас есть механизм подчистки?
    а что за справка VBA?
     
  4. morpheus

    morpheus скриптописец

    Репутация:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    3.915
    Симпатии:
    1
    ну это можно просто убить файл ( средствами лотуса kill )

    перед этим надо ыйти из ворда через вордовский Quit

    Вот это и есть Call word.Application.documents.Open(path) - VBA ( Visual Basic for Applications ). Когда устанавливаете офис, поставте галочку справка по VBA там всё детально расписанно

    ну и шо такое VBA
     
  5. oxystile

    oxystile Гость

    Репутация:
    0
    так а у Вас ворд документ создается на основе шаблона?
    у меня на сервере лежат шаблоны (.dot) в них я забила поля
    а через Script library поля эти заполняются:
    bookmark01="enternumber" -поле в документе
    .Selection.GoTo wdGoToBookmark, , , bookmark01
    .Selection.TypeText ishnumber
    если у Вас похожая задача, то могу расписать подробнее
     
  6. lionk

    lionk Well-Known Member

    Репутация:
    0
    Регистрация:
    5 апр 2007
    Сообщения:
    310
    Симпатии:
    3
    oxystile
    кинь код
    как ты создаёш новый документ на основе шаблона
     
  7. morpheus

    morpheus скриптописец

    Репутация:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    3.915
    Симпатии:
    1
    lionk
    Код:
    Sub OpenExcel( FilePath )
    Print "Відкриття Excel..."
    Set exApp = CreateObject("Excel.Application")
    If exApp Is Nothing Then Messagebox "Не встановленний Excel!!!", 0 + 16 , "Друк"
    exApp.Visible = False ' видно или нет
    Call exApp.Workbooks.Add( FilePath )
    Set exWb = exApp.ActiveWorkBook
    Set Sh = exWb.Sheets(1)
    End Sub
    где FilePath - путь к шаблону
     
  8. oxystile

    oxystile Гость

    Репутация:
    0
    см. в ScriptLibraries
    (файл прицеплен)

    сам шаблон .dot с полями не удалось прицепить, пишет "нет прав на прицепку таких вложений"
     

    Вложения:

    • example.zip
      Размер файла:
      21,6 КБ
      Просмотров:
      24
  9. morpheus

    morpheus скриптописец

    Репутация:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    3.915
    Симпатии:
    1
    архивируйте
     
  10. oxystile

    oxystile Гость

    Репутация:
    0
    шаблон, оставила фактически только поля :)
     

    Вложения:

    • Soft.rar
      Размер файла:
      6,1 КБ
      Просмотров:
      23
  11. lionk

    lionk Well-Known Member

    Репутация:
    0
    Регистрация:
    5 апр 2007
    Сообщения:
    310
    Симпатии:
    3
    спасибо за пример.

    там ты просто открываеш документ с сервера.

    в екселе создают книгу на оспове книги Call exApp.Workbooks.Add( FilePath )

    а в ворде word.Application.documents.add(path) - открывает док в рамках приложения занимая тем самым файл
    который мне надо удалить

    вопрос дня
    как создать новый документ на основе другого документа?
     
  12. Гость

    Репутация:
    0
    Да разные есть способы. Что конкретно Вам надо? Можно же не на основе шаблона создавать, а на основе прикрепленного doc файла. Можно хоть открыть любой doc документ и скопировать все его содержимое в новый документ. По-моему Вам были даны исчерпывающие ответы и даже примеры.
     
  13. lionk

    lionk Well-Known Member

    Репутация:
    0
    Регистрация:
    5 апр 2007
    Сообщения:
    310
    Симпатии:
    3
    Ерюков Алексей
    я хочу создавать на основе шаблона что находится на локальном диске, и поєтому прямой вопрос

    как програмно создать ворд документ на основе другого документа такми образом, чтобы шаблонный документ после зоздания был освобождён вордом и мог быть удалён?
     
  14. Sandr

    Sandr Гость

    Репутация:
    0
    Выкладываете шаблон (как обычний аттач) по нужному Вам пути (обычно используют темповые папки), делаете с выложенным файлом что хотите и открываете пользователю.
    С самим шаблоном ничего при этом не произойдет...
     
  15. Гость

    Репутация:
    0
    Вы же сами написали в первом своем сообщении, что у Вас есть документ, в котором ваш шаблон. Насколько я понял он у вас там приаттачен. Вам надо выполнить совет Sandr и будет Вам счастье!
    Вот что то вроде того:

    Код:
    	Set TemplateDoc = db.GetProfileDocument("($BlankTemplate)")	
    If TemplateDoc Is Nothing Then
    Messagebox "Профильный документ не найден", MB_OK + MB_ICONSTOP, "ERROR!"
    Exit Sub
    End If
    
    Set rtitem = TemplateDoc.GetFirstItem("Document")
    If rtitem Is Nothing Then
    Messagebox "Шаблон не найден, проверьте настроики шаблона", MB_OK, "Внимание"
    Exit Sub
    End If
    
    path = "путь к Вашему файлу(обычно Temp папка)"
    
    Set TemplateObject = rtitem.EmbeddedObjects(0)
    Call TemplateObject.ExtractFile (path & "\document.doc")
    
    'Создание Word-документа
    
    Dim wordObject As Variant
    
    Set wordObject = CreateObject("Word.Application") 'Создание объекта Word'a
    Call wordObject.documents.add(path & "\document.doc") 'открытие документа
    Set WordDoc = wordObject.activedocument 'Активация объекта
    WordObject.Visible = False 'Сделать видимым окно Word'a
    Set Word = WordDoc.Application
    и дальше уже распоряжайтесь с ним по своему усмотрению
     
  16. lionk

    lionk Well-Known Member

    Репутация:
    0
    Регистрация:
    5 апр 2007
    Сообщения:
    310
    Симпатии:
    3
    вот пример базы с печатью.
    кажется нашол причину по которой не работает.

    проблема в том что обект документа освобождается после выполнения кода кнопки "печать"

    как протестить:
    если запустить печать в обычном режиме получаю пустое окно ворда.

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

    может ктото подскажет как побороть єтот глюк?

    PS Если всё заработает обязуюсь на форуме выложить качественный пример выгрузки в ворд (преимуществом которого есть централизованое хранение всех документов-шаблонов в одной базе и отсутсвие необходимости работы с шаблонами на файловом уровне(предварительное сохранение на винте или копирование с сервера))
     

    Вложения:

    • toword.rar
      Размер файла:
      50 КБ
      Просмотров:
      23
  17. Гость

    Репутация:
    0
    Тут два варианта. Первый (менее возможный, скорее всего я Вас не понял) - у Вас WordObject.Visible = True выполняется до заполнения документа. Но это вряд ли. и второй вариант: вам вашу переменную под ворд надо описать в глобальных переменных, а не на кнопке, так как после завершения выполняемых действий по нажатию кнопки все переменные обнуляются. Попробуйте переменную сделать глобальной.
     
  18. lionk

    lionk Well-Known Member

    Репутация:
    0
    Регистрация:
    5 апр 2007
    Сообщения:
    310
    Симпатии:
    3
    в примере переменные глобальные,
    находятся в секции globals:delaration формы. обявлены так
    Dim object As Variant
    Dim worddoc As Variant
    Dim word As Variant

    как более глобально их обявить я незнаю :(
     
  19. Гость

    Репутация:
    0
    дальше уже некуда...
     
Загрузка...

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