:: Visual Foxpro, Foxpro for DOS
передача данных из VFP в Excel долго идёт
DrDiesel7373
Автор

Сообщений: 267
Откуда: Алчевск
Дата регистрации: 21.02.2006
Привет, коллеги !

В результате работы программы формируется временный курсор (ALL1) (Все поля текстовые 10 шт) Вывожу его для отчёта в Excel:
SELECT ALL1
CALCULATE CNT() TO i0
GO TOP
WAIT 'Ожидайте. Идёт передача отчёта в Microsoft Excel !' WINDOW NOWAIT AT 20,50
PRIVATE XLApp, XLSheet
LOCAL loBook , loRange
#DEFINE xlWBATWorksheet -4167
#DEFINE xlCenter -4108 && и овер много других DEFINE...
XLApp = CREATEOBJECT('excel.application')
XLApp.VISIBLE = .F.
loBook = m.XLApp.workbooks.Add(xlWBATWorksheet)
XLSheet = m.loBook.Sheets(1)
XLApp.ActiveWindow.WINDOWSTATE = xlMaximized && 2
XLApp.Caption='Печать выборки по замечаниям на '+DTOC(DATE())+ ' ЧАО Экоэнегрия'
XLSheet = XLApp.ActiveSheet
WITH XLSheet
m.XLSheet.Rows(1).NumberFormat = "@"
m.XLSheet.Rows(1).HorizontalAlignment = xlCenter
m.XLSheet.Rows(1).VerticalAlignment = xlTop
m.XLSheet.Rows(1).WrapText = .T.
m.XLSheet.Rows(1).Font.Bold = .T.
.Cells(1,1).Value = " № "
.Cells(1,2).Value = "Выдано:"
.Cells(1,3).Value = "KKS"
.Cells(1,4).Value = "Код"
.Cells(1,5).Value = "Объект"
.Cells(1,6).Value = "Дефект"
*** еще 4 поля (не важно) ****
**** вывести данные ****
FOR k=1 TO i0
.Cells(k+1,1).Value= ALL1.NPP
.Cells(k+1,2).Value= ALL1.ADtVyd
.Cells(k+1,3).Value= ALL1.kks
.Cells(k+1,4).Value= ALL1.KodDef
.Cells(k+1,5).Value= RTRIM(ALL1.ObjName)
**** еще аналогичных 5 передач ***
SKIP
ENDFOR
*** нарисовать рамку ******
loRange =m.XLSheet.Range(m.XLSheet.Cells(1,1).Address+":"+m.XLSheet.Cells(i0+1,10).Address)
loRange.Borders(xlEdgeLeft).Weight = xlThin
loRange.Borders(xlEdgeTop).Weight = xlThin
loRange.Borders(xlEdgeBottom).Weight = xlThin
loRange.Borders(xlEdgeRight).Weight = xlThin
loRange.Borders(xlInsideVertical).Weight = xlThin
loRange.Borders(xlInsideHorizontal).Weight = xlThin
ENDWITH
XLApp.Cells.Select
XLApp.Selection.Columns.AutoFit
XLApp.Selection.Font.Size = 8
XLSheet.RANGE("A1").select
** выделить ячейки на 2 снизу от конца таблицы и объединить ****
loRange = m.XLSheet.Range(m.XLSheet.Cells(i0+3,3).Address+":"+m.XLSheet.Cells(i0+3,6).Address)
loRange.WrapText = .F.
loRange.Orientation = 0
loRange.MergeCells = .T.
XLSheet.Cells(i0+3,3).Value= "Статистика замечаний от "+DTOC(DATE())
*** обвести линией ячейки объединенные и с подписями ***
loRange.Borders(xlEdgeLeft).Weight = xlThin
loRange.Borders(xlEdgeTop).Weight = xlThin
loRange.Borders(xlEdgeBottom).Weight = xlThin
loRange.Borders(xlEdgeRight).Weight = xlThin
loRange.Borders(xlInsideVertical).Weight = xlThin
loRange.Borders(xlInsideHorizontal).Weight = xlThin
WITH XLSheet.PageSetup
.Orientation = xlLandscape
.LeftMargin = XLApp.InchesToPoints(0.1)
.RightMargin = XLApp.InchesToPoints(0.1)
.TopMargin = XLApp.InchesToPoints(0.15)
.BottomMargin = XLApp.InchesToPoints(0.15)
.HeaderMargin = XLApp.InchesToPoints(0.1)
.FooterMargin = XLApp.InchesToPoints(0.1)
.PrintHeadings = .F.
.PrintGridlines = .F.
ENDWITH
XLApp.VISIBLE = .t.

Выводится правильно. Но на машине на работе выводится довольно шустро (до 5-7 сек)
Это всего лишь 10 строк временного курсора. Как бы всё равно многовато, но пока незаметно.
Дома - этот же совсем маленький курсор выводится аж до 20-30 сек !
Время расторможения не зависит от того, открыт эксель или нет..

В чём может быть причина ? ( ДОма офис 2003. На работе почти везде 2007-2010 )
ПРимер запускался и там и там из VFP-9 в его среде.

Железо , ОФИС или некоторая криворукость кода ?


------------------
Шушпанчики улыбаются так, что с нижнего этажа пожарные прибегают (с)
Ratings: 0 negative/0 positive
Re: передача данных из VFP в Excel долго идёт
dimuhametov

Сообщений: 1562
Откуда: Костанай
Дата регистрации: 01.11.2008
forum.foxclub.ru


------------------
Незнание делает жизнь такой интересной.
Ratings: 0 negative/0 positive
Re: передача данных из VFP в Excel долго идёт
AndyNigmatec

Сообщений: 1573
Откуда: Волгоград
Дата регистрации: 28.06.2015
Даже не используя чего-либо специального, а работая также как и вы через ole-автоматизацию, возможно значительно ускорить вывод - для этого всего лишь не нужно поячеечно заливать туда данные - а либо добавить сразу все массивом, либо выгрузить в промежуточный текстовый (например csv) файл, который уже посредством ole открыть-разукрасить.

И еще одно такое наблюдение (не утверждение, а именно наблюдение) - вывод на машине с офисом-2003 происходит шустрее.

Еще одно З.Ы. - может быть в вашем случае удобнее будет использовать готовые шаблоны в эксель - куда лишь останется только передать сами данные (желательно блоками) - а все форматирование уже подготовлено в самом шаблоне.



Исправлено 3 раз(а). Последнее : AndyNigmatec, 20.03.17 06:37
Ratings: 0 negative/0 positive
Re: передача данных из VFP в Excel долго идёт
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
AndyNigmatec
Даже не используя чего-либо специального, а работая также как и вы через ole-автоматизацию, возможно значительно ускорить вывод - для этого всего лишь не нужно поячеечно заливать туда данные - а либо добавить сразу все массивом, либо выгрузить в промежуточный текстовый (например csv) файл, который уже посредством ole открыть-разукрасить.
И еще одно такое наблюдение (не утверждение, а именно наблюдение) - вывод на машине с офисом-2003 происходит шустрее.

Еще одно З.Ы. - может быть в вашем случае удобнее будет использовать готовые шаблоны в эксель - куда лишь останется только передать сами данные (желательно блоками) - а все форматирование уже подготовлено в самом шаблоне.
10 строчек? По 10 элементов? 25-30 секунд. Не здесь собака порылась.
Скорей всего, долго поднимается сам экземпляр офиса. Тем более, что присоединение к существующему экземпляру выполняется быстро. А почему он долго поднимается. Ну может плагинами всякими обвис. Или просто от старости (;Ж
Ratings: 0 negative/0 positive
Re: передача данных из VFP в Excel долго идёт
DrDiesel7373
Автор

Сообщений: 267
Откуда: Алчевск
Дата регистрации: 21.02.2006
AndyNigmatec
Даже не используя чего-либо специального, а работая также как и вы через ole-автоматизацию, возможно значительно ускорить вывод - для этого всего лишь не нужно поячеечно заливать туда данные - а либо добавить сразу все массивом, либо выгрузить в промежуточный текстовый (например csv) файл, который уже посредством ole открыть-разукрасить.
И еще одно такое наблюдение (не утверждение, а именно наблюдение) - вывод на машине с офисом-2003 происходит шустрее.

Еще одно З.Ы. - может быть в вашем случае удобнее будет использовать готовые шаблоны в эксель - куда лишь останется только передать сами данные (желательно блоками) - а все форматирование уже подготовлено в самом шаблоне.

На счёт добавить туда массивом - объсните пжлст, подробнее. С Экселем дружу буквально неделю. Если можно пример кода.

По наблюдению: получается , что на 2003 офисе как раз медленнее...

Про готовые шаблоны -увы, пока не совсем понял. Если не сложно - в 2 словах..


------------------
Шушпанчики улыбаются так, что с нижнего этажа пожарные прибегают (с)
Ratings: 0 negative/0 positive
Re: передача данных из VFP в Excel долго идёт
DrDiesel7373
Автор

Сообщений: 267
Откуда: Алчевск
Дата регистрации: 21.02.2006
pasha_usue
AndyNigmatec
Даже не используя чего-либо специального, а работая также как и вы через ole-автоматизацию, возможно значительно ускорить вывод - для этого всего лишь не нужно поячеечно заливать туда данные - а либо добавить сразу все массивом, либо выгрузить в промежуточный текстовый (например csv) файл, который уже посредством ole открыть-разукрасить.
И еще одно такое наблюдение (не утверждение, а именно наблюдение) - вывод на машине с офисом-2003 происходит шустрее.

Еще одно З.Ы. - может быть в вашем случае удобнее будет использовать готовые шаблоны в эксель - куда лишь останется только передать сами данные (желательно блоками) - а все форматирование уже подготовлено в самом шаблоне.
10 строчек? По 10 элементов? 25-30 секунд. Не здесь собака порылась.
Скорей всего, долго поднимается сам экземпляр офиса. Тем более, что присоединение к существующему экземпляру выполняется быстро. А почему он долго поднимается. Ну может плагинами всякими обвис. Или просто от старости (;Ж

Вот да, долго поднимается... Наверное можно вынести определение экземпляра в начало программы, но красиво и правильно-ли будет так ? Не возникнут ли подводные глюки ?

PS. Плагинами офисы по ходу не обросли....


------------------
Шушпанчики улыбаются так, что с нижнего этажа пожарные прибегают (с)
Ratings: 0 negative/0 positive
Re: передача данных из VFP в Excel долго идёт
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Ну так то что, он долго поднимается с фоксом никак не связано.
Попробуйте заставить его запускаться быстрее просто из среды - и будет вам счастье)
Разберитесь, почему тормозит.


------------------
Ratings: 0 negative/0 positive
Re: передача данных из VFP в Excel долго идёт
DrDiesel7373
Автор

Сообщений: 267
Откуда: Алчевск
Дата регистрации: 21.02.2006
Аспид
Ну так то что, он долго поднимается с фоксом никак не связано.
Попробуйте заставить его запускаться быстрее просто из среды - и будет вам счастье)
Разберитесь, почему тормозит.

так из среды как раз и долго запускается ! Из готового exe - тоже.
Так что пока счастья мало...


------------------
Шушпанчики улыбаются так, что с нижнего этажа пожарные прибегают (с)
Ratings: 0 negative/0 positive
Re: передача данных из VFP в Excel долго идёт
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Из среды, имелось ввиду, прямо из виндов.


------------------
Ratings: 0 negative/0 positive
Re: передача данных из VFP в Excel долго идёт
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
А из командной строки Windows как грузится?
Ну, типа

Start Winword

Или

Start Winword myfile.doc

Может быть, антивирус чего-то там поверяет при загрузке Word?



Исправлено 1 раз(а). Последнее : Simple777, 20.03.17 09:53
Ratings: 0 negative/0 positive
Re: передача данных из VFP в Excel долго идёт
DrDiesel7373
Автор

Сообщений: 267
Откуда: Алчевск
Дата регистрации: 21.02.2006
Simple777
А из командной строки Windows как грузится?
Ну, типа
Start Winword

Или
Start Winword myfile.doc
Может быть, антивирус чего-то там поверяет при загрузке Word?

из командной строки запускается около 3-7 сек ( как повезет ) Офис2010

Я вот тут что замутил: ПОнатыкал в разных местах кода такую конструкцию:
a1 = time(2) &&-------
a2 = time(2) &&-------
и т.д. В конце бооольшой MESSAGEBOX(a1+a2+....)

Отчёт таков:
1) CreateObject - 1.5 сек
2) Подписи столбцов и их форматирование - 1,5 сек
3) Вывод данных в ячейки в цикле - 0,3 сек
4) Обведение всей этой городухи линиями, добавление в конец подписи с окантовкой - 1,8 сек (фигассе!)
5) Изменение параметров листа для печати - 1,5 сек
6) показ на экран (Visible=TRUE) 0.2 сек

Пока видно, что жрёт время форматирование...


------------------
Шушпанчики улыбаются так, что с нижнего этажа пожарные прибегают (с)
Ratings: 0 negative/0 positive
Re: передача данных из VFP в Excel долго идёт
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
DrDiesel7373
из командной строки запускается около 3-7 сек ( как повезет ) Офис2010
Так проблема то основная, как следует из предыдущего, с 2003?

И еще, а если сразу заполнять шаблон, на котором все отформатировано?


------------------
Ratings: 0 negative/0 positive
Re: передача данных из VFP в Excel долго идёт
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
Отключите обновление в процессе создания документов. Код VBA:

' Отключить обновление
Public Sub Prepare()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False
Application.DisplayStatusBar = False
Application.DisplayAlerts = False
End Sub
' Включить обновление
Public Sub Ended()
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
ActiveSheet.DisplayPageBreaks = True
Application.DisplayStatusBar = True
Application.DisplayAlerts = True
End Sub
Ratings: 0 negative/0 positive
Re: передача данных из VFP в Excel долго идёт
DrDiesel7373
Автор

Сообщений: 267
Откуда: Алчевск
Дата регистрации: 21.02.2006
pasha_usue
Отключите обновление в процессе создания документов. Код VBA:
' Отключить обновление
Public Sub Prepare()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False
Application.DisplayStatusBar = False
Application.DisplayAlerts = False
End Sub
' Включить обновление
Public Sub Ended()
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
ActiveSheet.DisplayPageBreaks = True
Application.DisplayStatusBar = True
Application.DisplayAlerts = True
End Sub

Не понял, конечно, что такое "обновление", но вставил отключение обновления после:
XLApp = CREATEOBJECT('excel.application')
XLApp.VISIBLE = .F.


Вставил отключение обновления перед:
XLApp.VISIBLE = .t.

Попутно переменная xlCalculationManual ( = -4135 по справке VBA ) не нашлась.
Также не нашлось: XLApp.ActiveSheet.DisplayPageBreaks = .F. (по VBA такой вообще-то нет, есть WorkSheet, всё равно не нашлось)

В итоге - этот код не помог


------------------
Шушпанчики улыбаются так, что с нижнего этажа пожарные прибегают (с)
Ratings: 0 negative/0 positive
Re: передача данных из VFP в Excel долго идёт
DrDiesel7373
Автор

Сообщений: 267
Откуда: Алчевск
Дата регистрации: 21.02.2006
Аспид
DrDiesel7373
из командной строки запускается около 3-7 сек ( как повезет ) Офис2010
Так проблема то основная, как следует из предыдущего, с 2003?

И еще, а если сразу заполнять шаблон, на котором все отформатировано?

Нет, на офисе-2010 тормоза есть. 10-12 записей временного курсора передаются в Эксель около 5-6- сек.
Про шаблон, увы, не понял. Ну, мало дел имел с экспортом в офис и сопутствующими знаниями...


------------------
Шушпанчики улыбаются так, что с нижнего этажа пожарные прибегают (с)
Ratings: 0 negative/0 positive
Re: передача данных из VFP в Excel долго идёт
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
DrDiesel7373
Нет, на офисе-2010 тормоза есть. 10-12 записей временного курсора передаются в Эксель около 5-6- сек.
Это чисто время передачи 100 значений, или ВСЁ - начиная от старта офиса и до его показа с уже готовым отчётом?
Если чисто время передачи, то что-то не то с системой (вирус, антивирус, очень мало свободной памяти, перегруженный всякими разными работающими программами по самое не могу CPU) - очень уж это медленно.
И да - прежде чем всё прочее "оптимизировать" следует заменить "поячеечную" вставку на вставку через массив. Примеры есть на форуме.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: передача данных из VFP в Excel долго идёт
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
DrDiesel7373
XLApp.Cells.Select
XLApp.Selection.Columns.AutoFit
XLApp.Selection.Font.Size = 8

А вот это место у вас сколько по времени выполняется? В 2010 и в 2003?
Ratings: 0 negative/0 positive
Re: передача данных из VFP в Excel долго идёт
AndyNigmatec

Сообщений: 1573
Откуда: Волгоград
Дата регистрации: 28.06.2015
По скорости вывода народ уже высказался, выложу вам примерный код передачи массивом в диапазон ячеек:

lcFile='полный_путь_к_файлу_типа C:\temp\книга1.xls'
SELECT 0
CREATE CURSOR c1 (cname c(20), lnum i, ldate d)
INSERT INTO c1 (cname, lnum, ldate) VALUES ('Вася', 4, {^1978-12-24})
INSERT INTO c1 (cname, lnum, ldate) VALUES ('Петя', 3, {^1987-05-12})
INSERT INTO c1 (cname, lnum, ldate) VALUES ('Маша', 100500, {^1984-01-08})
INSERT INTO c1 (cname, lnum, ldate) VALUES ('Гриша', 135, {^1973-08-30})
SELECT * FROM c1 INTO ARRAY laData
lcRowsData=ALEN(laData,1)
lcColumnsData=ALEN(laData,2)
#DEFINE xlOpenXMLWorkbook 51
#DEFINE xlNormal -4143
loExcel=CREATEOBJECT("EXCEL.APPLICATION")
lxlsversion=VAL(loExcel.Version)
loExcel.Visible=.F.
loExcel.EnableEvents=.F.
loExcel.DisplayAlerts=.F.
IF TYPE('loExcel')='O'
loExcel.Workbooks.Add()
lcWbName=loExcel.ActiveWorkbook.Name
IF lxlsversion>=12
loExcel.ActiveWorkbook.SaveAs(lcFile,xlOpenXMLWorkbook)
ELSE
loExcel.Workbooks(lcWbName).SaveAs(lcFile,xlNormal)
ENDIF
lcWbName=JUSTFNAME(lcFile)
loSheet = loExcel.Workbooks(lcWbName).Sheets(1)
loSheet.Cells(2,1).Resize(lcRowsData, lcColumnsData).Value = PassArray('laData')
loExcel.Workbooks(lcWbName).Save()
loExcel.Workbooks(lcWbName).Close(.F.)
loExcel.Quit()
ENDIF
FUNCTION PassArray
LPARAMETERS tcArrayName
* Трюк для передачи массива данных обратно в диапазон ячеек Excel.
RETURN @&tcArrayName

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

loExcel.Workbooks.Add(lcFileMask)

где lcFileMask - ваш шаблон



Исправлено 2 раз(а). Последнее : AndyNigmatec, 20.03.17 20:47
Ratings: 0 negative/0 positive
Re: передача данных из VFP в Excel долго идёт
DrDiesel7373
Автор

Сообщений: 267
Откуда: Алчевск
Дата регистрации: 21.02.2006
Igor Korolyov
DrDiesel7373
Нет, на офисе-2010 тормоза есть. 10-12 записей временного курсора передаются в Эксель около 5-6- сек.
Это чисто время передачи 100 значений, или ВСЁ - начиная от старта офиса и до его показа с уже готовым отчётом?
Если чисто время передачи, то что-то не то с системой (вирус, антивирус, очень мало свободной памяти, перегруженный всякими разными работающими программами по самое не могу CPU) - очень уж это медленно.
И да - прежде чем всё прочее "оптимизировать" следует заменить "поячеечную" вставку на вставку через массив. Примеры есть на форуме.

Нет. На рабочем компе (WIn-7-32bit, в домене ( учётка ограничена ) антивирь есть, в момент испытаний Эксель-2010 запущен ( 2 книги открыто ) вообще конечно комп засран всякими нелепыми программами типа Менеджер прошивки телефонов на андроид и и т.п.)
5-6 сек - это время ВСЕГО ( начиная от старта офиса до появления на экран )

На домашнем компе (Win-XP+SP3 Corp, учётка ограниченная, антивирь ESS 8, Эксель-2003 НЕ запущен, памяти 2 гб ДДР-3, подкачка динамическая) - от запуска офиса до отображения на экран - 30-35 сек !(вне зависимости, запущен офис 2003 или нет) Причём дома львиную долю ( секунд 15-25 занимает инициализация объекта ОФИСА ) Выдача данных в ячейки, что на работе, что дома около 2-4 сек )


------------------
Шушпанчики улыбаются так, что с нижнего этажа пожарные прибегают (с)
Ratings: 0 negative/0 positive
Re: передача данных из VFP в Excel долго идёт
AndyNigmatec

Сообщений: 1573
Откуда: Волгоград
Дата регистрации: 28.06.2015
По скорости вы сами ответили на свой вопрос:

DrDiesel7373
( секунд 15-25 занимает инициализация объекта ОФИСА )

проблема в системе а не в коде VFP
Ratings: 0 negative/0 positive


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

On-line: 19 (Гостей: 19)

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