:: Visual Foxpro, Foxpro for DOS
Почему иногда зависает Excel при выводе данных
Sergeynizamov
Автор

Сообщений: 76
Дата регистрации: 21.09.2018
Доброе время суток, смотрел кучу тем для вывода в электронную книгу, но так и не смог ни чего сделать с проблемой!
проблема такая, иногда зависает Excel при запуске, и спрашивает вопрос о сохранении, хотя использую команду DisplayAlerts = .f.,
Можете пожалуйста подсказать куда его вставлять, посмотрел кучу примеров!
примеры как пробовал!
Пример 1:
With LoExcel
.Workbooks.Open(alltrim(PublPoiskBlank)+"Blank.xls")
.Sheets("Лист1").Copy
.Windows("Blank.xls").Activate
.ActiveWindow.Close
.UserControl =.t.
.DisplayAlerts =.f.
.IgnoreRemoteRequests = .T.
ENDWITH
WITH LoExcel
.RANGE("A1").SELECT
.WindowState = 3
.ScreenUpdating = .T.
.Visible = .T.
.IgnoreRemoteRequests = .F.
ENDWITH
Release LoExcel

Пример 2:
With LoExcel
.Workbooks.Open(alltrim(PublPoiskBlank)+"Blank.xls")
.Sheets("Лист1").Copy
.Windows("Blank.xls").Activate
.ActiveWindow.Close
.DisplayAlerts =.f.
ENDWITH
WITH LoExcel
.RANGE("A1").SELECT
.WindowState = 3
.ScreenUpdating = .T.
.Visible = .T.
ENDWITH
Release LoExcel

Пример 3:
With LoExcel
.Workbooks.Open(alltrim(PublPoiskBlank)+"Blank.xls")
.DisplayAlerts =.f.
.Sheets("Лист1").Copy
.DisplayAlerts =.f.
.Windows("Blank.xls").Activate
.DisplayAlerts =.f.
.ActiveWindow.Close
.DisplayAlerts =.f.
ENDWITH
WITH LoExcel
.RANGE("A1").SELECT
.WindowState = 3
.ScreenUpdating = .T.
.Visible = .T.
ENDWITH
Release LoExcel
Ratings: 0 negative/0 positive
Re: Почему иногда зависает Excel при выводе данных
Sergeynizamov
Автор

Сообщений: 76
Дата регистрации: 21.09.2018
Забыл до полнить использую одну электронную книгу, в которой много листов Excel-я
Ratings: 0 negative/0 positive
Re: Почему иногда зависает Excel при выводе данных
AndyNigmatec

Сообщений: 1573
Откуда: Волгоград
Дата регистрации: 28.06.2015
Ну так навскидку ...
как тока создали экземпляр loExcel - сразу следом - .DisplayAlerts=.f. (одного раза хватит ))))



Потом, лучше уйти от .Windows("ХХХХХХХХ").Activate и всяких .ActiveWindow и .ActiveSheet - и использовать .Workbooks("ХХХХХХХ") и с листами также.

и еще как именно энтот экземпляр создаете?

к примеру выдрал у себя:

this.oExcel=CREATEOBJECT("EXCEL.APPLICATION")
this.lxlsversion=VAL(this.oExcel.Version)
this.oExcel.Visible=.F.
this.oExcel.DisplayAlerts=.F.

при таком создании не мешает и не подвисает



Исправлено 1 раз(а). Последнее : AndyNigmatec, 23.06.22 10:00
Ratings: 0 negative/0 positive
Re: Почему иногда зависает Excel при выводе данных
Sergeynizamov
Автор

Сообщений: 76
Дата регистрации: 21.09.2018
AndyNigmatec
Ну так навскидку ...
как тока создали экземпляр loExcel - сразу следом - .DisplayAlerts=.f. (одного раза хватит ))))



Потом, лучше уйти от .Windows("ХХХХХХХХ").Activate и всяких .ActiveWindow и .ActiveSheet - и использовать .Workbooks("ХХХХХХХ") и с листами также.

Цитата:
и еще как именно энтот экземпляр создаете?

к примеру выдрал у себя:

this.oExcel=CREATEOBJECT("EXCEL.APPLICATION")
this.lxlsversion=VAL(this.oExcel.Version)
this.oExcel.Visible=.F.
this.oExcel.DisplayAlerts=.F.

при таком создании не мешает и не подвисает
Не совсем вас понял про экземпляр...
Если вы про версию excel, то у каждого пользователя разные версии офиса, от 2003 до 2016
Ratings: 0 negative/0 positive
Re: Почему иногда зависает Excel при выводе данных
AndyNigmatec

Сообщений: 1573
Откуда: Волгоград
Дата регистрации: 28.06.2015
я не про версию, я про создание объекта loExcel - в приведенном коде этого не видно. Выше написал как у меня беспроблемно работает много лет.

И еще - а зачем копировать целиком листы? если их вставлять в другую книгу - то проще мувить (типа Sheets(1).Move)



Исправлено 1 раз(а). Последнее : AndyNigmatec, 23.06.22 11:01
Ratings: 0 negative/0 positive
Re: Почему иногда зависает Excel при выводе данных
AndyNigmatec

Сообщений: 1573
Откуда: Волгоград
Дата регистрации: 28.06.2015
Вообще давно сделал себе для этого отдельный класс (не шедевр, но работает) - и пользуюсь до сих пор (пока эксель не забанили окончательно в конторе, но чую скоро совсем прикроют). Если нужен - то не вопрос, закину куда скажете.
Ratings: 0 negative/0 positive
Re: Почему иногда зависает Excel при выводе данных
Sergeynizamov
Автор

Сообщений: 76
Дата регистрации: 21.09.2018
LoExcel=createobject("Excel.application") через креад
Ratings: 0 negative/0 positive
Re: Почему иногда зависает Excel при выводе данных
AndyNigmatec

Сообщений: 1573
Откуда: Волгоград
Дата регистрации: 28.06.2015
Sergeynizamov
LoExcel=createobject("Excel.application") через креад

должно норм работать, создали отдельный экземляр эксельки, убрали алертсы, скрыли от глаз юзверя - и делаем с ним что нужно. А затем когда обработка готова - можно "спросить" пользователя - а не желает ли уважаемый сэр открыть отчет - и открыть уже в том что у того на винде настроено по ShellExecute
Ratings: 0 negative/0 positive
Re: Почему иногда зависает Excel при выводе данных
Владимир Максимов

Сообщений: 14097
Откуда: Москва
Дата регистрации: 02.09.2000
"Флаги" надо устанавливать ДО выполнения той операции, которые этим флагами регулируется

Первый и второй пример - это как раз то, чего делать не надо

.ActiveWindow.Close
.DisplayAlerts =.f.

Т.е. Вы сначала пытаетесь закрыть и получаете сообщение. А то, что ПОТОМ Вы поставите флаг - уже роли не играет. Сообщение уже было вызвано
Ratings: 0 negative/0 positive
Re: Почему иногда зависает Excel при выводе данных
Sergeynizamov
Автор

Сообщений: 76
Дата регистрации: 21.09.2018
Ребята всем спасибо огромное за подсказки! и советы
Ratings: 0 negative/0 positive
Re: Почему иногда зависает Excel при выводе данных
AndyNigmatec

Сообщений: 1573
Откуда: Волгоград
Дата регистрации: 28.06.2015
Для Sergeynizamov

Прикрепил класс, не по феншую но работает.

Пример использования:

SELECT 0
CREATE CURSOR cOut (code i, name c(40), pdate d, nsum n(8,2))
INSERT INTO cOut (code, name, pdate, nsum) VALUES (25, 'Товар 1', {^2022-06-25}, 458.58)
INSERT INTO cOut (code, name, pdate, nsum) VALUES (348, 'Товар 2', {^2022-06-20}, 45400.00)
INSERT INTO cOut (code, name, pdate, nsum) VALUES (125, 'Товар 3', {^2022-06-22}, 5548.52)
INSERT INTO cOut (code, name, pdate, nsum) VALUES (25, 'Товар 1', {^2022-06-21}, 10585.30)
lcFileOut=ADDBS(JUSTPATH(SYS(16,0)))+'Test.xls'
SET CLASSLIB TO ADDBS(JUSTPATH(SYS(16,0)))+'excel_ole_export.vcx'
#INCLUDE EXCEL.H
&& скрипт обработки в листе Excel
*******************************************************************
TEXT TO lcScript NOSHOW TEXTMERGE
LPARAMETERS lcParam1, lcParam2, lcParam3
IF TYPE('lcParam1')='O'
loExcel=lcParam1
lcWbName=lcParam2
WITH loExcel.Workbooks(lcWbName).Sheets(1)
nRecCount=RECCOUNT('cOut')
=AFIELDS(a1,'cOut')
nColumnsOut=ALEN(a1,1)
RELEASE a1
.Cells(1,1).EntireRow.Insert(0)
.Rows(1).RowHeight = 20
.Rows(1).VerticalAlignment = xlCenter
.Cells(1,4).Value = "=SUBTOTAL(9,R[2]C:R["+ALLTRIM(STR(nRecCount+1))+"]C)"
.Cells(1,4).Font.Bold = .T.
ENDWITH
ENDIF
ENDTEXT
*******************************************************************
oExcelExport=CREATEOBJECT('excelexport')
WITH oExcelExport
.cNameFileOut=lcFileOut
.SheetsName0='Товар'
.cAlias='cOut'
.PrepareData()
.HeaderHeight0=36
.aXFields(1,3) = 8
.aXFields(1,4) = xlLeft
.aXFields(2,3) = 12
.aXFields(2,4) = xlLeft
.aXFields(2,2) = "@"
.aXFields(3,3) = 10
.aXFields(3,4) = xlCenter
.aXFields(3,2) = "dd/mm/yyyy;@"
.aXFields(4,3) = 10
.aXFields(4,2) = "#,##0.00"
.aXFields(1,1) = "Код"
.aXFields(2,1) = "Товар"
.aXFields(3,1) = "Дата"
.aXFields(4,1) = "Сумма"
.TextScript=lcScript
.Export0array(1)
lcFileOut=.cFileOut
.CloseExcel()
ENDWITH
RELEASE oExcelExport
IF FILE(lcFileOut)
IF MESSAGEBOX('Отчет сохранен. Желаете открыть файл отчета?',1+32+4096,'Внимание!',30000)=1
oExcelExport=CREATEOBJECT('excelexport')
oExcelExport.ShellExecute(lcFileOut,JUSTPATH(lcFileOut),"Open",1)
RELEASE oExcelExport
ENDIF
ENDIF
Ratings: 0 negative/0 positive


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

On-line: 24 kornienko_ru  (Гостей: 23)

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