powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Передача в Excel
12 сообщений из 12, страница 1 из 1
Передача в Excel
    #32778721
Helen_new
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Формирую отчет в Excel, но данные передаются очень медленно
Передача происходит следующим образом: данные из таблицы записываются в готовый шаблон:

SELECT SPO, NPO,Cins, Fam, Nam, Sna, BData, Spa, Npa from &Ins where (Len(ALLTRIM(SPA))<4 OR NPA/100000<1) AND Cins>1000 into table n_nnp
.Range("A8").Select
i=8
Select n_nnp
n=RECCOUNT()
DO WHILE !EOF()
rag="A"+ALLTRIM(STR(i))
.Range(rag).Select
.Selection.EntireRow.Insert
.Cells(i,2).Value=i-7
.Cells(i,3).Value=n_nnp.SPO
.Cells(i,4).Value=n_nnp.NPO
.Cells(i,5).Value=n_nnp.cins
.Cells(i,6).Value=n_nnp.Fam
.Cells(i,7).Value=n_nnp.Nam
.Cells(i,8).Value=n_nnp.Sna
.Cells(i,9).Value=n_nnp.Bdata
.Cells(i,10).Value=n_nnp.Spa
.Cells(i,11).Value=n_nnp.Npa
SKIP
i=i+1
ENDDO

Можно ли как-то ускорить процесс (но не экспорт - нужно писать в шаблон)?
Заранее спасибо
...
Рейтинг: 0 / 0
Передача в Excel
    #32778752
Фотография YuriWhite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Helen_New
В вашем способе - НЕТ, пока создатели VFP не сделают ранее связывание.
Как делать щас : я ипользую VBA макрос в шаблоне который читает из DBF и выводит все данные в отчет. Работает очень быстро. Например отчет из 10000 строк выводится минуты за 2-3.
...
Рейтинг: 0 / 0
Передача в Excel
    #32778791
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще как можно. Передавать надо массив.
Пример от Aijik
VFP7 и выше:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
DIMENSION Array2Excel( 2 , 4 )

Array2Excel[ 1 , 1 ]="Шла"
Array2Excel[ 1 , 2 ]="Маша"
Array2Excel[ 1 , 3 ]="по"
Array2Excel[ 1 , 4 ]="шоссе"
Array2Excel[ 2 , 1 ]="и"
Array2Excel[ 2 , 2 ]="сосала"
Array2Excel[ 2 , 3 ]="сушку"
Array2Excel[ 2 , 4 ]="!"


oExcel=CREATEOBJECT("Excel.Application")
oExcel.Workbooks.Add()

oExcel.Range("A12").Value = ArrayPasser("Array2Excel")

oExcel.Visible=.T.




PROCEDURE ArrayPasser
PARAMETERS lcArrayName


RETURN @&lcArrayName
...
Рейтинг: 0 / 0
Передача в Excel
    #32778820
Фотография YuriWhite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Crip
А что передача через переменные и или через массив(по сути указатель) на уровне COM это один и тот-же способ ? Повторяю в изложенном способе ни как, а Ваш способ это СОВСЕМ другой способ.
...
Рейтинг: 0 / 0
Передача в Excel
    #32778835
vgross
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Довольно быстро получается копированием таблицы в EXCELевский файл.
Примерно так: COPY TO ("File.xls") TYPE xl5
...
Рейтинг: 0 / 0
Передача в Excel
    #32779054
T0lik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возможно тормозит то что вы позиционируетесь на ячейку, добавляете строку, а потом вставляете записи в каждом такте цикла.
А если сначала добавить строки:
Код: plaintext
1.
2.
3.
4.
    .Rows("8:8").Select
 	FOR lnCount= 1  TO n
     	.Selection.Insert(- 4241 ) 
     ENDFOR
а потом занести данные?
У меня такое добавление строк работает очень быстро.
...
Рейтинг: 0 / 0
Передача в Excel
    #32779889
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2YuriWhite
Он не совсем другой. Это способ как раз подходит для быстрой и главное удобной работы через OLE Automation.
...
Рейтинг: 0 / 0
Передача в Excel
    #32780657
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно серьезно ускорить ввод данных в Excel, если работать через буфер обмена. Примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
* Создаем объект Excel
LOCAL comExcel
comExcel=CREATEOBJECT('Excel.Application')
comExcel.workbooks.Add
* Делаем Excel видимым
* Эту команду надо давать в самом конце формирования листа Excel
* здесь она приведена для наглядности
comExcel.Visible= .T.
* Сохраняем текущее значение буфера обмена
LOCAL lcClipText
lcClipText = _clipText
* вставляем текст в буфер обмена
* CHR( 9 ) - клавиша Tab - переход на следующую ячейку в текущей строке
* CHR( 13 ) - клавиша Enter - переход на следующую строку в первом столбце указанного диапазона
_cliptext='Ячейка 1:1'+CHR( 9 )+'Ячейка 1:2'+CHR( 9 )+'Ячейка 1:3'+CHR( 13 )+;
		'Ячейка 2:1'+CHR( 9 )+'Ячейка 2:2'+CHR( 9 )+'Ячейка 2:3'+CHR( 13 )+;
		'Ячейка 3:1'+CHR( 9 )+'Ячейка 3:2'+CHR( 9 )+'Ячейка 3:3'

* копируем буфер обмена в нужное место Excel
comExcel.Cells( 1 , 1 ).PasteSpecial( 1 )
* еще раз копируем в другое место
comExcel.Range("A5:C7").PasteSpecial( 1 )
* Выравнивание столбцов по ширине содержимого
comExcel.Columns("A:C").Autofit

* Данный способ предполагает передачу только ТЕКСТОВЫХ данных
* Это значит, что любые типы данных надо конвертировать в текстовые
SET DATE GERMAN 
SET CENTURY ON

_clipText = TRANSFORM( 123456 . 78 )+CHR( 9 )+TRANSFORM(DATE())
comExcel.Cells( 5 , 5 ).NumberFormat="0.00"
comExcel.Cells( 5 , 6 ).NumberFormat="m/d/yyyy"		&& такого формата может и не быть
comExcel.Cells( 5 , 5 ).PasteSpecial( 1 )
comExcel.Columns("E:F").Autofit

* Чтобы снять выделение по окончании всех вставок передаю фокус на первую ячейку
comExcel.Cells( 1 , 1 ).select
* восстанавливаем буфер обмена
_clipText = m.lcClipText

Следует только помнить, что таким образом вставляется непрерывная последовательность ячеек. Т.е. если, например, надо заполнить первые 5 ячеек, потом пропустить 1 и заполнить еще 5 ячеек. То такая вставка затрет содержимое этой пропущенной ячейки, если только не разбить на 2 последовательные вставки, сначала первые 5, потом следующие 5.
...
Рейтинг: 0 / 0
Передача в Excel
    #32780905
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi YuriWhite!

Есть существенная разница - вызывать через COM метод сервера 10000 раз,
передавая каждый раз по "чайной ложке" информации, или вызвать всего 1 метод
передав большой массив. Основное время как раз и тратится на все эти
вызов/передача/ожидание ответа.
Как альтернатива массиву - загнать нужную информацию в строку (разделяя поля
TAB а записи CRLF) и её Paste в Excel - тоже весьма шустро - ну да там с
типами данных могут быть кой какие проблемы.

Кстати довольно неразумно сделано с подвалом - зачем его постоянно сдвигать
и сдвигать вниз - лучше сразу загнать куда нужно и всё... Конечно если там
вообще есть подвал

2 T0lik

Иногда лучше жевать чем говорить.

2 vgross

Да так будет весьма быстро, но с шаблоном не пройдёт - т.е. если и скидывать
данные так, то потом либо их в шаблон Copy/Paste, либо наоборот - шапку и
подвал отчёта из файла-шаблона в этот самый файл с данными перекидывать.
Кстати в версиях фокса до VFP8 через TYPE XL5 сбрасывалось не более 16000
записей - в VFP8 это исправили. НО вся штука в том, что если сделать COPY TO
.... TYPE FOX2X AS 866 - то такой файл Excel замечательно открывает своими
силами - его потом можно подрыхтовать (красивые заголовки, итоги и т.п.) и
сохранить в формате xlWorkbookNormal - т.е. формате текущей (установленной)
версии Excel. Кстати созданный через TYPE XL5 отчёт тоже придётся
пересохранять в "новом" формате - ну чтоб пользователю потом дурацкох
вопросов по поводу устаревшего формата файла не задавалось.

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Передача в Excel
    #32780927
Фотография Андрей Давыдов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Helen_new

Предложу как вариант не пользовать эхсель,
а взять кокой нибудь эктивх спредшит и выводить в него,
а потом уже сформированной файл открывать в эхселе.
Не буду врать, точно не помню - делал как-то замеры.
Эхсель против Формирование в ЭктивХ и открытие в Эхсель
Первый вариант проигрывал на разнаых отчетах от 2 до 5 раз.
...
Рейтинг: 0 / 0
Передача в Excel
    #32784371
Трехсотый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как только появился Office 2000, Excel начал поддержку HTML формата, а после и XML формата.

Даже для FP Dos подойдет вариант.

В экселе разрисовываете шапку отчета , настраиваете печать, далее сохранить как htm или xml.

Запихиваете из полученного файла в prg файл
с помощью команды FPuts()
например:
=FPuts(handle,'<html xmlns:o="urn:schemas-microsoft-com:office:office" ')
......................
......................
Втыкаем свои данные
sele Result
Scan
=FPuts(handle,' <td >'+alltr(name_p)+'</td> ') && name_p и k1 поля курсора
=FPuts(handle,' <td x:str="'+k1+ </td> ')
.......................
EndScan
Таким программным способом получаем текстовый файл html
который открываем в Екселе
Скорость работы охренительная :)
Время фактически сводится к преобразованию dbf -> txt и времени открытия файла в екселе
PS: для fpd в заголовке html используйте кодировку cp866
...
Рейтинг: 0 / 0
Передача в Excel
    #32784401
piva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вы еще и SYLK формат вспомните, тоже подойдет для быстрого формирования файла с минимальным формтированием
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Передача в Excel
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]