:: Visual Foxpro, Foxpro for DOS
Отчет в Excel
rud

Сообщений: 640
Откуда: Москва
Дата регистрации: 02.09.2000
Создаю из VFP 9.0 отчет в Excel через Createobject('Excel.Application') и т.д. Если в это время открыть какой-нибудь экселевский файл и закрыть его, отчет не формируется. Что делать?



Исправлено 1 раз(а). Последнее : rud, 06.05.19 10:00
Ratings: 0 negative/0 positive
Re: Отчет в Excel
Перминов Игорь

Сообщений: 1591
Откуда: Красная Орловка
Дата регистрации: 16.09.2001
Работать через activeworkbook
Ниже кусок из класса
LPARAMETERS lcFile as Character, lbShow as Boolean, lvSheets as Variant
IF PCOUNT()=2
lvSheets = 1
ENDIF
LOCAL oExcel as "excel.application" OF "excel.application", loErr as Exception
STORE NULL TO oExcel, loErr, this.exception
IF ISNULL(oExcel)
STORE NULL TO oExcel, loErr
TRY
oExcel = createobject("excel.application")
CATCH TO loErr
this.exception = loErr
oExcel = NULL
ENDTRY
IF ISNULL(oExcel)
RETURN .F.
ENDIF
ENDIF
this.oexcel = oExcel
IF UPPER(JUSTEXT(lcFile)) = "XLT" OR UPPER(JUSTEXT(lcFile)) = "XLTX"
llErr = .F.
TRY
This.activeworkbook = oExcel.Workbooks.Add(lcFile).Sheets(lvSheets)
CATCH TO loErr
this.exception = loErr
llErr = .T.
ENDTRY
IF llErr
this.oexcel = .NULL.
RETURN (.F.)
ENDIF
ELSE
llErr = .F.
TRY
This.activeworkbook = oExcel.Workbooks.Open(lcFile).Sheets(lvSheets)
CATCH TO loErr
this.exception = loErr
llErr = .T.
ENDTRY
IF llErr
this.oexcel = .NULL.
RETURN (.F.)
ENDIF
ENDIF
This.activeprinter = oExcel.ActivePrinter
*This.activeworkbook.Application.Sheets(1).Select()
IF lbShow = .F.
oExcel.ActiveWorkbook.Date1904 = .F.
oExcel.ActiveWorkbook.Saved = .T.
oExcel.ScreenUpdating = .F.
*oExcel.IgnoreRemoteRequests = .T. && DDE запросы
oExcel.DisplayAlerts=.F.
oExcel.ReferenceStyle = -4150 && xlR1C1 xlA1
oExcel.ActiveWindow.View = 1
oExcel.EnableEvents=.T.
this.GetExcelProcessID()
This.xls_viewmode = oExcel.ActiveWindow.View
ENDIF
IF lbShow
*oExcel.ScreenUpdating = .T.
*This.activeworkbook.Visible = lbShow
* This.xls_visible = lbShow
oExcel.Visible = lbShow
ENDIF


------------------
Без коментариев..
Ratings: 0 negative/1 positive
Re: Отчет в Excel
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Заблокировать тот экземпляр экселя в котором ты работаешь от взаимодействия с пользователем (чтобы открываемые пользователем книжки запускались в отдельной копии экселя).
loXl = CREATEOBJECT("Excel.Application")
loXl.DisplayAlerts = .F.
loXl.IgnoreRemoteRequests = .T. && Это ключевая настройка - при её отключении этот экземпляр не будет использоваться для открытия документов пользователем из проводника и т.п.
loXl.ScreenUpdating = .F.
loXl.Workbooks.Open(m.tcReportFile) && шаблон
... && заполняем шаблон
loXl.ScreenUpdating = .T.
loXl.ActiveWorkbook.SaveAs(m.tcReportFile, xlWorkbookNormal) && сохраняем созданный отчёт
loXl.IgnoreRemoteRequests = .F. && не забываем вернуть настройки назад
loXl.DisplayAlerts = .T.
loXl.Quit()
&& далее созданный файл отчёта лучше всего открыть через ShellExecute() - НЕ НАДО его показывать в том же экземпляре в котором он и создавался.


------------------
WBR, Igor




Исправлено 1 раз(а). Последнее : Igor Korolyov, 06.05.19 15:09
Ratings: 0 negative/1 positive
Re: Отчет в Excel
rud

Сообщений: 640
Откуда: Москва
Дата регистрации: 02.09.2000
Спасибо, буду пробовать.
Ratings: 0 negative/0 positive
Re: Отчет в Excel
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
Igor Korolyov
loXl = CREATEOBJECT("Excel.Application")
Где-то обсуждалось, что для того, что б новый экземпляр не присосался к уже поднятому в системе, лучше заменить CREATEOBJECT на NEWOBJECT.

А вот уже имеющийся экземпляр, да, надо заизолировать.



Исправлено 2 раз(а). Последнее : pasha_usue, 07.05.19 07:15
Ratings: 0 negative/1 positive
Re: Отчет в Excel
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Как раз наоборот, это при помощи GetObject (при том там чуть по разному в зависимости от запрашиваемого офисного приложения) можно "присосаться к экземпляру уже поднятому в системе". CreateObject равно как и NewObject всегда буду создавать новый экземпляр. В части COM объектов разницы между этими функциями нет, разница лишь для фоксовых классов, и заключается в том что NewObject будет внутренне делать "set classlib/proc to" перед созданием, и обратное "отключение библиотеки" после.
P.S. Ну ещё есть нюанс при создании не объекта Excel.Application а какого-нибудь Excel.Sheet - тут реально созданный объект будет жить внутри ранее запущенной копии экселя (ну вот так оно задумано) - опять же независимо от того создан он через createobject или newobject.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Отчет в Excel
of63

Сообщений: 25244
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
() Про GetObject Паша_Ушуе не говорил...
Ratings: 0 negative/0 positive
Re: Отчет в Excel
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
И что? Я уточнил по всем 3-м функциям используемым при автоматизации.


------------------
WBR, Igor
Ratings: 0 negative/0 positive


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

On-line: 21 akvvohinc Артём  (Гостей: 19)

© 2000-2024 Fox Club 
Яндекс.Метрика