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

lionk

Well-Known Member
05.04.2007
310
3
#1
Сразу сорри за поднятие темы которую и так часто поднимают.

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

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

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

morpheus

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

lionk

Well-Known Member
05.04.2007
310
3
#3
Morpheus
я это всё читал
нужно чтобы файл не сохранялся на диске, или у вас есть механизм подчистки?
а что за справка VBA?
 

morpheus

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

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

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

ну и шо такое VBA
 
O

oxystile

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

lionk

Well-Known Member
05.04.2007
310
3
#7
oxystile
кинь код
как ты создаёш новый документ на основе шаблона
 

morpheus

скриптописец
07.08.2006
3 915
1
#8
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

Гость
#9
см. в ScriptLibraries
(файл прицеплен)

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

Вложения

O

oxystile

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

Вложения

  • 6.1 КБ Просмотры: 23

lionk

Well-Known Member
05.04.2007
310
3
#12
спасибо за пример.

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

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

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

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

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

lionk

Well-Known Member
05.04.2007
310
3
#14
Ерюков Алексей
я хочу создавать на основе шаблона что находится на локальном диске, и поєтому прямой вопрос

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

Sandr

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

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

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

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

lionk

Well-Known Member
05.04.2007
310
3
#17
вот пример базы с печатью.
кажется нашол причину по которой не работает.

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

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

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

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

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

Вложения

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

lionk

Well-Known Member
05.04.2007
310
3
#19
в примере переменные глобальные,
находятся в секции globals:delaration формы. обявлены так
Dim object As Variant
Dim worddoc As Variant
Dim word As Variant

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