• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы lionk
  • Дата начала
L

lionk

Сразу сорри за поднятие темы которую и так часто поднимают.

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

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

вод код кнопки печати
и он не работает, не возможно достучатся к обекту ворда, он есть но ниже уровня 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
 
M

morpheus

lionk
Так-с .. я не осилиил, вроде как направление правильное ( тоже что и Set wordApp = CreateObject ("Word.Application") )
Детальное описания методов/свойств классов сматрите в справке к VBA
Можете также ознакомиться с нашими наработками
 
L

lionk

Morpheus
я это всё читал
нужно чтобы файл не сохранялся на диске, или у вас есть механизм подчистки?
а что за справка VBA?
 
M

morpheus

нужно чтобы небыло лишнего дока в памяти и на диске.
ну это можно просто убить файл ( средствами лотуса kill )

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

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

 
O

oxystile

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

lionk

oxystile
кинь код
как ты создаёш новый документ на основе шаблона
 
M

morpheus

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 - путь к шаблону
 
O

oxystile

см. в ScriptLibraries
(файл прицеплен)

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

Вложения

  • example.zip
    21,6 КБ · Просмотры: 133
O

oxystile

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

Вложения

  • Soft.rar
    6,1 КБ · Просмотры: 127
L

lionk

спасибо за пример.

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

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

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

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

Guest

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

lionk

Ерюков Алексей
я хочу создавать на основе шаблона что находится на локальном диске, и поєтому прямой вопрос

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

Sandr

Ерюков Алексей
я хочу создавать на основе шаблона что находится на локальном диске, и поєтому прямой вопрос

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

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

Guest

Ерюков Алексей
я хочу создавать на основе шаблона что находится на локальном диске, и поєтому прямой вопрос

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

Вы же сами написали в первом своем сообщении, что у Вас есть документ, в котором ваш шаблон. Насколько я понял он у вас там приаттачен. Вам надо выполнить совет 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

и дальше уже распоряжайтесь с ним по своему усмотрению
 
L

lionk

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

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

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

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

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

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

Вложения

  • toword.rar
    50 КБ · Просмотры: 127
G

Guest

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

lionk

в примере переменные глобальные,
находятся в секции globals:delaration формы. обявлены так
Dim object As Variant
Dim worddoc As Variant
Dim word As Variant

как более глобально их обявить я незнаю :(
 
Мы в соцсетях:

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