Страница 1 из 8

Как закрыть WORD после передачи в него данных?

Добавлено: 25 Март 2022, 14:30
mpn2
Всем привет.
Пришлось написать выгрузку в WORD (Clarion 6.3 шаблоны Синявского). Никогда не писал, поэтому пишу методом научного тыка.
Столкнулся с тем, что надо после передачи данных в WORD не только закрыть документ но и корректно закрыть WORD.

Подскажите: а как корректно закрыть WORD???

Код: Выделить всё

   Loc:WordFileName = Clip(CONF:Path_Shablon_WORD)                              ! Каталог и имя шаблонного документа
   Loc:SaveFileName = Clip(CONF:Path_Save_WORD) &'вх.'& Clip(UCH:Number) &'.doc'! Каталог для хранения файлов  + имя
  
   feqOLE=create(0,CREATE:Ole)                                                  ! создали OLE-контрол
   feqOLE{Prop:Create} = 'Word.Application'                                     ! сказали, что этот контрол использует Word
   feqOLE{Prop:ReportException} = TRUE                                          ! для отладки - показываем все сообщения об ошибках OLE
   feqOLE{'Visible'} = 1                                                        ! показали Word
   feqOLE{'Documents.Open("'& clip(Loc:WordFileName) &'")'}                     ! Открываем шаблон документа


!Работаем с файлом заполняем данные
!==============================================================================================================================
   do Find_Replace


!Сохраняем файл WORD
!==============================================================================================================================
   feqOLE{'Application.Selection.GoTo(11, 1)'}                                  ! встали на начало документа
   feqOLE{'Application.ActiveDocument.SaveAs("'& Clip(Loc:SaveFileName) &'")'}  ! сохранили документ под другим именем






   if CONF:Close_File then                                                      ! Закроем документ если надо
          feqOLE{'Documents.Close()'}                                              ! Закрываем документ
          
       ??????? А КАК закрыть WORD ??????                                      ! ??????? А КАК закрыть WORD 
   
   end




   ! уничтожили OLE-контрол ---------------------------------
   loop 3 times
      destroy(feqOLE) ! уничтожили OLE-контрол
   end
   !---------------------------------------------------------

Как закрыть WORD после передачи в него данных?

Добавлено: 25 Март 2022, 15:13
Дед Пахом
Можно TerminateProcess api, можно WMI командой Terminate. Если есть WinEvent или OddJob от Capesoft, то там должно быть что-то подходящее.

Как закрыть WORD после передачи в него данных?

Добавлено: 25 Март 2022, 15:25
Дед Пахом
mpn2 писал(а): 25 Март 2022, 14:30 ! уничтожили OLE-контрол ---------------------------------
loop 3 times
destroy(feqOLE) ! уничтожили OLE-контрол
end
Хотя этот кусок по идее должен убить процесс.

Как закрыть WORD после передачи в него данных?

Добавлено: 25 Март 2022, 15:54
kreator
У меня вот так:

Код: Выделить всё

 ?Word{'AppClose'}
 ?Word{PROP:Deactivate}
В Экселе вот так - 'Workbooks.Close'.
Понятно, после всего. Destroy вряд ли закроет. Хотя не факт.
Ещё замечание. Пример кочует от одного к другому. Ему сто лет и никто творчески к нему не подходит. Дестроя достаточного одного!!! А "feqOLE{'Visible'} = 1" катастрофически снижает скорость обработки и ещё вдобавок показывает пользователю ненужные вещи.

Как закрыть WORD после передачи в него данных?

Добавлено: 25 Март 2022, 15:57
Дед Пахом
kreator писал(а): 25 Март 2022, 15:54 Дестроя достаточного одного!
Не увидел, что 3 раза вызывается DESTROY, я думал что речь про PROP:Deactivate.

Как закрыть WORD после передачи в него данных?

Добавлено: 25 Март 2022, 16:29
Игорь Столяров
mpn2 писал(а): 25 Март 2022, 14:30 feqOLE{'Application.ActiveDocument.SaveAs("'& Clip(Loc:SaveFileName) &'")'}
Время идёт, лучше замените для совместимости с современными релизами на:

Код: Выделить всё

  feqOLE{'Application.ActiveDocument.SaveAs2("'& Clip(Loc:SaveFileName) &'")'}

Как закрыть WORD после передачи в него данных?

Добавлено: 25 Март 2022, 17:02
kreator
Да, время идёт, а Вы всё сохраняете в .doc.

Как закрыть WORD после передачи в него данных?

Добавлено: 25 Март 2022, 17:28
Игорь Столяров
kreator писал(а): 25 Март 2022, 17:02 Да, время идёт, а Вы всё сохраняете в .doc.
Можно и явно указать формат сохранения DOCX:

Код: Выделить всё

  feqOLE{'Application.ActiveDocument.SaveAs2("' & Clip(Loc:SaveFileName) & '",16)'}
но лучше этого не делать. Я поясню. Если поклонник таланта г-на Синявского юзает офисный пакет
времён выпуска шаблонов его имени - то для него формат по умолчанию DOC, а если Office 365 - то DOCX.
Вот и всё. И от расширения имени файла с документом это не зависит ... :)

Как закрыть WORD после передачи в него данных?

Добавлено: 25 Март 2022, 18:29
kreator
Игорь Столяров писал(а): 25 Март 2022, 17:28 И от расширения имени файла с документом это не зависит ...
Как это? А как сохранить в другие форматы? Например, в rtf?

Как закрыть WORD после передачи в него данных?

Добавлено: 25 Март 2022, 18:58
RaFaeL
RTF лучше создавать прямой записью в файл, без ОЛЕ
viewtopic.php?p=40286#p40286

Как закрыть WORD после передачи в него данных?

Добавлено: 25 Март 2022, 19:21
Игорь Столяров
RaFaeL писал(а): 25 Март 2022, 18:58 RTF лучше создавать прямой записью в файл, без ОЛЕ
Та косой тот класс RTF, как заяц. Я в той же ветке сырость решения показывал ... :(
kreator писал(а): 25 Март 2022, 18:29 А как сохранить в другие форматы? Например, в rtf?
Вот здесь все поддерживаемые форматы для SaveAs2: https://docs.microsoft.com/ru-ru/office ... saveformat
Смотрите, пока ещё пускают нашего брата к сокровищам цивилизации ... ;)

Как закрыть WORD после передачи в него данных?

Добавлено: 25 Март 2022, 19:22
SergioRaguzini
Привет Всем!

Есть еще одна, непонятная для меня ситуация при работе с Word, когда после экспорта отчета в файл MsWord и дальнейшим PROP:Deactivate, в Диспетчере задач Windows остается работающим в фоне процесс winword.exe хотя окно Word закрыто и внешне вроде бы это ничему не мешает. И хрен бы с этим, при перезагрузке Windows, Диспетчер задач все равно очистится и на обычном рабочем месте такое даже и не заметишь, Однако, лет пять назад, на круглосуточно работающем ПК, в висящей в трее программе пришлось за один раз сразу формировать больше 100 word-файлов (файлы для каждого пациента, содержат ФИО, рекомендации и т.п.) и потом они рассылаются через e-mail или REST-приложениие. Через несколько дней ПК начинает "тупить" когда в Диспетчере задач таких winword.exe уже несколько тысяч. Т.е. PROP:Deactivate не "убивает" сам процесс. Пришлось получать список запущенных процессов winword.exe и закрывать их принудительно (для этого, когда пользователь завопил "караул", пришлось сделать в течении часа на AutoIt exe-утилитку командной строки, нормально работает и переделывать ее теперь лень)

kreator писал(а): 25 Март 2022, 17:02 Да, время идёт, а Вы всё сохраняете в .doc
Прошу подсказки, как, например, в С6.3 получить готовый PDF-файл без Preview, так чтобы потом можно было выполнять с ним стандартные файловые операции (например, "копировать"). Или файл иного формата, который бы обычный пользователь мог бы без труда открыть на ПК или мобильном телефоне.

Спасибо

Как закрыть WORD после передачи в него данных?

Добавлено: 25 Март 2022, 19:29
Игорь Столяров
SergioRaguzini писал(а): 25 Март 2022, 19:22 Прошу подсказки, как, например, в С6.3 получить готовый PDF-файл без Preview
Пардон. А PDF файл с чем ? Вы хотите экспортировать в него REPORT или сами создать его содержание ?

Как закрыть WORD после передачи в него данных?

Добавлено: 25 Март 2022, 19:36
Игорь Столяров
SergioRaguzini писал(а): 25 Март 2022, 19:22 непонятная для меня ситуация при работе с Word
Это детская ошибка, сто лет назад её обсуждали подробно.
Нужно корректно завершить документ и закрыть приложение Microsoft Word.
А вот потом уже гасить объект и контрол. ;)

Как закрыть WORD после передачи в него данных?

Добавлено: 25 Март 2022, 19:41
SergioRaguzini
Игорь Столяров писал(а): 25 Март 2022, 19:29 Пардон. А PDF файл с чем ? Вы хотите экспортировать в него REPORT или сами создать его содержание ?
Ну да - экспортировать REPORT