powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / помогите скопировать инфу с грида в эксель
21 сообщений из 21, страница 1 из 1
помогите скопировать инфу с грида в эксель
    #33042252
dimakz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
помогите скопировать инфу с грида в эксель.

мне необходимо вытащить с грида и загнать в эксель, помогите со скриптом,
зарание благодарен
...
Рейтинг: 0 / 0
помогите скопировать инфу с грида в эксель
    #33042286
AleksMed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотри тут Решения Foxclub
...
Рейтинг: 0 / 0
помогите скопировать инфу с грида в эксель
    #33043138
_новичек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не мое,и к сожалению не помню чье, но мною подстригалось
DEFINE CLASS cmdexcel AS cmdbutton


Height = 25
Width = 25
Picture = "..\icon\excel.bmp"
StatusBarText = "Экспорт в MS Excel"
ToolTipText = "Экспорт в MS Excel"
Name = "cmdexcel"
gridobject = .F.


PROCEDURE cvar
LPARAMETER vValue
do CASE
CASE TYPE("vValue") = "C"
RETURN vValue
CASE TYPE("vValue") = "N"
RETURN STR(vValue,11,4)
CASE TYPE("vValue") = "L"
RETURN IIF(vValue, 'Да', 'Нет')
CASE TYPE("vValue") = "Y"
RETURN STR(vValue,LEN(alltrim(STR(vValue))),2)
CASE TYPE("vValue") = "D"
RETURN DtoC(vValue)
CASE TYPE("vValue") = "T"
RETURN TtoC(vValue)
endCASE
ENDPROC


PROCEDURE Click
IF EMPTY(this.GridObject) OR TYPE(this.GridObject)<>"O" OR EVAL(this.GridObject+'.BaseClass')<>'Grid' OR EMPTY(EVAL(this.GridObject+'.RecordSource'))
&& Не задан GRID, заданный GRID не существует или у него не указан источник данных
&& Не забывайте указвать имя GRID полностью - например, thisForm.PageFrame1.Page1.Grid1
messagebox("Неверно заданы параметры кнопки или объекта GRID")
RETURN
ENDIF

local nColumnsNumber, oExcel, oSheet, oGrid, nCurrentRow, nCurrentColumn, nRecNo, cOldSel, cErrorSet
cErrorSet = ON("ERROR")
on error messagebox(Message()+chr(13)+Program()+chr(13)+'Line '+str(Lineno()))
cOldSel = select() && Запоминаем текущую рабочую область
nRecNo = RecNo() && и положение указателя в ней
oGrid = EVAL(this.GridObject)
select (oGrid.RecordSource) && Перешли в нужную область
go top && Выводить будем все записи с самого начала

nColumnsNumber = oGrid.ColumnCount && Количество колонок в GRID
WAIT 'Создается документ Excel. Немного подождите...' WINDOW AT 15, 45 NOWAIT

oExcel=create('Excel.Application') && Создаем копию Excel
*Проверка существования(установки) Экселя
IF TYPE("m.oExcel")!="O"
=MESSAGEBOX("Не могу выполнить экспортирование. Возможно у вас не установлен Excel!",16,"Внимание...")
on ERROR &cErrorSet
RETURN
ENDIF

oExcel.WorkBooks.add() && и новый документ в нем
oSheet = oExcel.Workbooks(1).ActiveSheet && Работать будем с этой страницей


**Пропишем заголовки для колонок в таблице. Естественно, это по желанию
nCurrentRow = 1
FOR nCurrentColumn = 1 to oGrid.ColumnCount && количество столбцов в этом гриде
*Проверка, заменен ли хедер на свой.
loCol=oGrid.Columns(nCurrentColumn)
FOR EACH loCtl IN loCol.Controls
IF UPPER(loCtl.BaseClass)=='HEADER'
&& Для следующей строки необходимо, чтобы имена заголовков колонок в Grid остались дефолтовыми - Header1
oSheet.Cells(nCurrentRow, nCurrentColumn).Value = loCtl.Caption
ENDIF
ENDFOR
ENDFOR

nCurrentRow = 2
&& Со второй строки начнем выводить сами данные
do while NOT EOF()
* oExcel.Documents(1).Tables(1).Rows.Add
&& Пройдем по всем колонкам
FOR nCurrentColumn = 1 to oGrid.ColumnCount
oSheet.Cells(nCurrentRow, nCurrentColumn).Value = this.CVar(EVAL(oGrid.Columns(nCurrentColumn).ControlSource))
ENDFOR
skip && И так до конца таблицы
nCurrentRow = nCurrentRow + 1
enddo

oExcel.caption=thisForm.Caption && Заголовок окна Excel возьмем из заголовка этой формы
oExcel.ROWS("1:1").SELECT &&выбрали первую строку - это типа названия полей
oExcel.SELECTION.HorizontalAlignment = 3 &&горизонтальное выравнивание - по центру
oExcel.SELECTION.FONT.Bold = .T. &&жирненьким выделили
oExcel.ActiveSheet.Cells.SELECT &&выбрали все ячейкм
oExcel.ActiveSheet.Cells.EntireColumn.AutoFit &&да столбцы автоматом подогнали по ширине
oExcel.RANGE("A1").SELECT &&выбрали первую ячейку

oExcel.visible= .T. && Сделаем окно Excel видимым

on ERROR &cErrorSet
select (cOldSel) && Восстановим ситуацию
*Соответсвенно восстановление указателя записи:
SELECT (oGrid.RecordSource)
IF nRecNo=0
GO BOTTOM IN (oGrid.RecordSource)
IF EOF()=.F.
SKIP
ENDIF
ELSE
*проверка если удалена запись
IF nRecNo>RECCOUNT()
GO BOTTOM IN (oGrid.RecordSource)
IF EOF()=.F.
SKIP
ENDIF
ELSE
GO nRecNo IN (oGrid.RecordSource)
ENDIF
ENDIF
ENDPROC


ENDDEFINE
*
*-- EndDefine: cmdexcel
**************************************************
...
Рейтинг: 0 / 0
помогите скопировать инфу с грида в эксель
    #33044134
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi _новичек!

> FOR nCurrentColumn = 1 to oGrid.ColumnCount
> oSheet.Cells(nCurrentRow, nCurrentColumn).Value = this.CVar(EVAL(oGrid.Columns(nCurrentColumn).ControlSource))
> ENDFOR

Вот это ОЧЕНЬ медленно будет. Если есть возможность (фокс хотя-бы 7-й) то стоит переделать на переброску через массив или через буфер обмена - ускорение на ПАРУ ПОРЯДКОВ стоит того :)

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
помогите скопировать инфу с грида в эксель
    #33044155
_новичек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ох ты..., на пару порядков обещаете!!!
Это было бы и вправду лучше,
у меня примерно такое же и в ворд, так там вообще медленно,
и такое же в html, побыстрее...
Не подскажите как?, можно кусочек кода???
Не могу въехать-через массив.
Кстати, как же ограничение размерности массива?,
(да еще и экселя тоже есть, но это не важно)
хотя идеально было бы другой лист экселя припечатать, если
больше 65000 строк(ну это в идеале)
Да кстати тока заметил-зачем это я проверяю на удаление записи
*проверка если удалена запись
IF nRecNo>RECCOUNT()
?Когда это злые юзеры успели удалить запись, пока я экспортировал :)
Спасибо
...
Рейтинг: 0 / 0
помогите скопировать инфу с грида в эксель
    #33045257
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi _новичек!

попользуйся поиском тут и на foxclub.ru - разные способы передачи обсуждались - в т.ч. и через массив.

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
помогите скопировать инфу с грида в эксель
    #33051228
Фотография help123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimakzпомогите скопировать инфу с грида в эксель.
мне необходимо вытащить с грида и загнать в эксель, помогите со скриптом,
зарание благодарен Лично я открыл для себя "Тайд" В смысле программу XFRX. Адрес сейчас не помню ... но думаю по форуму можно найти. Условно-бесплатная (все возможности, только на каждом листе о себе напоминает надписью внизу). Есть и крякнутая версия... в форуме можешь попросить... может кто поможет...
С ней конечно надо поиграться: сразу выдает полный бред в Ексель... но если немного почитать инструкцию к ней и сделать отчет так как требуют разработчики - то большего и не надо.
Сейчас пользуюсь только этой программой...
PS: кстати, как побочный эфект - кроме Екселя умеет еще выводить во все мыслимые и немыслимые форматы
...
Рейтинг: 0 / 0
помогите скопировать инфу с грида в эксель
    #33051683
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimakzпомогите скопировать инфу с грида в эксель.

мне необходимо вытащить с грида и загнать в эксель, помогите со скриптом,
зарание благодарен
Не надо изобретать велосипед...

Есть стандартная команда COPY там есть формат EXCEL5 -> скопировали курсор, вызвали EXCEL, загрузили таблицу, если надо присвоили "умные" имена колонкам... работает мгновенно...

Good luck!
...
Рейтинг: 0 / 0
помогите скопировать инфу с грида в эксель
    #33051733
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Sergey!


Грид и курсор вещи разные :) Ты ещё попробуй выкинуть данные из грида в котором несколько таблиц по relation связаны :( Или то-же минимальное украшательство - не выводить служебные поля (в гриде их нету), выводить не в физическом порядке, а в том что в гриде, подогнать по возможности ширину полей под то что в гриде - в общем много есть моментов, из-за которых "в лоб" получается плохо...

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
помогите скопировать инфу с грида в эксель
    #33051894
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня есть универсальный класс, который записывает данные в EXCEL-файл из GRID или курсора. Если интересно, могу показать.
С уважением, Алексей.
...
Рейтинг: 0 / 0
помогите скопировать инфу с грида в эксель
    #33052112
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Korolyov
Грид и курсор вещи разные :) Ты ещё попробуй выкинуть данные из грида в котором несколько таблиц по relation связаны :( Или то-же минимальное украшательство - не выводить служебные поля (в гриде их нету), выводить не в физическом порядке, а в том что в гриде, подогнать по возможности ширину полей под то что в гриде - в общем много есть моментов, из-за которых "в лоб" получается плохо...
Согласен, что зависит от Ваших и Ваших клиентов пристрастий...
Но, как правило - я, например, вывожу данные сначала в курсор, а затем в грид (так как много приложений разрабатывается где удаленный источник находится за тысячи километров - VFP Web Service или ASP.NET Web Service)... Таким образом - Grid всего лишь просмотрщик уже готовых и отобранных данных... Ну а подгонка ширины столбцов в Excel - всго одна функция, которая выполняется мгновенно...

P.S. Посмотрел я тут на Западе формы, выводимые в Excel серьезными программами (очень долго смеялся) и понал, что мы просто БАЛУЕМ наших клиентов красивыми формами, а нашему МНС и ПФ больше делать нечего как выдумывать зарядку для нашего недетского ума, изобретая высосанные из пальца многоэтажные и многостраничные формы отчетов... Им что 1С взятки платит за такое усложнение отчетности?... Но это так, лирическое отступление - понятно, что у нас очень много чиноваников в стране и всем надо показывать ИМБУРДЭ
...
Рейтинг: 0 / 0
помогите скопировать инфу с грида в эксель
    #33054697
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Sergey!

Желание клиента - закон :) Тем более если оно достаточно просто реализуемо :) Т.к. у меня помимо прочего сохраняются размер формы, ширина и положение колонок в гридах, то грех это дело проигнорировать и при выводе в 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.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
PROCEDURE Export2XLS
IF ThisForm.SaveCurObj()
 LOCAL lnRecno, lnRecCount, lnColCount, ln1, ln2, ln3
 LOCAL loXL, loSheet, loRange
 LOCAL lnOldSelect, loHeader
 PRIVATE paData( 1 )
* создать лист Excel
 loXL = CREATEOBJECT("Excel.Application")
 loXL.DisplayAlerts = .F.
 loXL.IgnoreRemoteRequests = .T.
 loXL.ScreenUpdating = .F.
 loXL.WorkBooks.Add()
 loSheet = m.loXL.Sheets( 1 )
* в первую строку первого столбца - caption формы
 loSheet.Cells( 1 ,  1 ).Font.Bold = .T.
 loSheet.Cells( 1 ,  1 ).Value = ThisForm.Caption
* в третью строку - заголовки колонок и рамку
 loRange = loSheet.Range(loSheet.Cells( 3 ,  1 ), loSheet.Cells( 3 , This.ColumnCount))
 loRange.WrapText = .T.
 loRange.HorizontalAlignment =  3 
 loRange.VerticalAlignment =  2 
 loRange.Borders( 1 ).LineStyle =  1 
 loRange.Borders( 2 ).LineStyle =  1 
 loRange.Borders( 3 ).LineStyle =  1 
 loRange.Borders( 4 ).LineStyle =  1 
* установить ширину и шрифт колонок
 lnOldSelect = SELECT()
 SELECT (This.RecordSource)
 lnRecNo = RECNO()
 lnRecCount = MIN(RECCOUNT(),  65530 )
 DIMENSION paData(m.lnRecCount,  1 )
 FOR ln1 =  1  TO This.ColumnCount
  ln2 = This.Columns(m.ln1).ColumnOrder
  loRange = loSheet.Columns(m.ln2)
  loRange.ColumnWidth = This.Columns(m.ln1).Width /  7 . 15 
  * шапки
  loHeader = This.GetColumnHeader(This.Columns(m.ln1))
  IF VARTYPE(m.loHeader) = "O"
   loRange = loSheet.Cells( 3 , m.ln2)
   loRange.Value = m.loHeader.Caption
   loRange.Font.Name = m.loHeader.FontName
   loRange.Font.Size = m.loHeader.FontSize
   loRange.Font.Italic = m.loHeader.FontItalic
   loRange.Font.Bold = m.loHeader.FontBold
  ENDIF
  * ячейки со значениями
  loRange = loSheet.Range(loSheet.Cells( 4 , m.ln2), loSheet.Cells(m.lnRecCount +  3 , m.ln2))
  loRange.Font.Name = This.Columns(m.ln1).FontName
  loRange.Font.Size = This.Columns(m.ln1).FontSize
  loRange.Font.Italic = This.Columns(m.ln1).FontItalic
  loRange.Font.Bold = This.Columns(m.ln1).FontBold
  ln3 =  1 
  * в колонки - значения полей
  SCAN ALL
   paData(m.ln3) = EVALUATE(This.Columns(m.ln1).ControlSource)
   * Тут ещё надо попроверять - есть кой какие сомнения...
   IF VARTYPE(m.paData(m.ln3)) = "C"
     paData(m.ln3) = ['] + m.paData(m.ln3)
   ENDIF
   IF INLIST(VARTYPE(m.paData(m.ln3)), "D", "T") AND ;
        EMPTY(m.paData(m.ln3))
     paData(m.ln3) = []
   ENDIF
   ln3 = m.ln3 +  1 
  ENDSCAN
  loRange.Value = m.goApp.ArrayPasser("paData")
 ENDFOR
 GO m.lnRecNo
* текущая строка - текущая запись
 loSheet.Range(loSheet.Cells(m.lnRecNo +  3 ,  1 ), loSheet.Cells(m.lnRecNo +  3 , This.ColumnCount)).Select()
 loXL.DisplayAlerts = .T.
 loXL.IgnoreRemoteRequests = .F.
 loXL.ScreenUpdating = .T.
 loXL.Visible = .T.
 SELECT (m.lnOldSelect)
 ThisForm.RestoreCurObj()
ENDIF
ENDPROC

Думаю что назначение упомянутых методов понятно из их названия, приведу лишь код "ключевого" метода (остальные можно вообще выкинуть или заменить) - goApp.ArrayPasser, благо он краток:
Код: plaintext
1.
2.
3.
PROCEDURE ArrayPasser
LPARAMETERS tcArrayName
RETURN @&tcArrayName
ENDPROC

Скорость вполне приемлемая (по сравнению с "поячеечным" заполнением листа Excel так очень даже быстро :) ), с "хитрыми" типами данных тоже вроде разобрались...

P.S. Я не помню, начиная с какой версии появилась возможность "возвращать массив из метода класса" - в VFP8 это точно работает.

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
помогите скопировать инфу с грида в эксель
    #33058158
Гулин Федор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СПАСИБО Игорь
у меня был вариант через временную базу
то пустые даты были как - -
то что мне надо :
IF INLIST(VARTYPE(m.paData(m.ln3)), "D", "T") AND ;
EMPTY(m.paData(m.ln3))
paData(m.ln3) = []
ENDIF
зы reccount понятно лучше заменить на count (под фильтр или set key будет работать )
ззы ну и можно логические поля менять на 'a' с шрифтом 'Webdings'
галочка будет как в решении на фоксклубе
...
Рейтинг: 0 / 0
помогите скопировать инфу с грида в эксель
    #33058364
_новичек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо Игорь
Насчет скорости Вы правы
Летает точно как ветер!!!
Тока проблемка одна небольшая-
не соблюдает порядок следоывания столбцов в гриде
А так песня
...
Рейтинг: 0 / 0
помогите скопировать инфу с грида в эксель
    #33058375
_новичек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения, все работает нормально,
сохраняет порядок следования
Виноват
Супер, спасибо
...
Рейтинг: 0 / 0
помогите скопировать инфу с грида в эксель
    #33058733
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Федор!

Просто когда через массив пытаешься пихать пустую дату - всё валится...
Через временную таблицу конечно быстрее, НО приходится как-то формировать SQL команду создания этой самой базы - чтобы как минимум поля в нужном порядке были. А если в качестве источника данных для грида несколько связанных таблиц - то IMHO проще застрелиться, чем делать алгоритм, который может коректный запрос сделать. Заставлять же разработчика для каждой формы каждого грида руками SQL запрос писать - нельзя - ломает это их - особенно после того как есть решение где ничего такого не нужно делать :( Хотя конечно для более "нормальных" отчётов именно так и делаю (ну ещё учитывая использование ActiveXL Report в последнее время :) ).
Про Count спасибо, я как противник фильтров и сторонник Views просто забыл про это :(
С логическими полями и картинками нужно подумать - там ведь ещё и Null бывают...

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
помогите скопировать инфу с грида в эксель
    #33060635
Гулин Федор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> как-то формировать SQL команду создания этой самой базы
я решал эту проблему - create ,scan и тд
были заморочки
с полями типа a+b , aa*8/118 - чтобы корректно посчитать их размер

>> ActiveXL Report в последнее время :) ).
пару слов + ссылки если можно
...
Рейтинг: 0 / 0
помогите скопировать инфу с грида в эксель
    #33061115
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Федор!

> >> ActiveXL Report в последнее время :) ).
> пару слов + ссылки если можно

Нет у меня ссылок увы, попробуй поискать в Google. В принципе компонент свои задачи решает - т.е. даже по не совсем уж примитивному шаблону работает. Были какие-то глюки, но имея исходники это всё решаемо :)
Из существенных минусов - он работает на основе макросов. Т.е. во вновь созданную книгу он напихивает служебные макросы, через них осуществляет практически всю работу, а в конце макросы удаляет. Это требует понижения уровня безопасности Excel и даже включать "доверять доступ к VBProject" для последних версий Excel-я... Также без доработки напильником он никак не мог сделать документ "по тихому" - т.е. всегда его показывал (хотя вроде в последних версиях это и было как-то устранено, но у нас не на базе наисвежайшей версии делают).

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
помогите скопировать инфу с грида в эксель
    #33117635
Кузнецов Игорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Igor Korolyov.
Прошу прощени, что подымаю старую тему. Вы привели код переброски информации с грида в эксель. Как нужно его переработать, чтобы его можно было использовать в VFP6.0?
...
Рейтинг: 0 / 0
помогите скопировать инфу с грида в эксель
    #33118076
_новичек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и кстати Игорь коли уж подняли эту тему,
возникает иногда ошибка в строке помоему
loRange.Value = m.goApp.ArrayPasser("paData")
на МЕМО полях,
какая еще обработка требуется????
хочется доуниверсализировать эту процедуру для всех видов полей
спасибо
...
Рейтинг: 0 / 0
помогите скопировать инфу с грида в эксель
    #33118514
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi тёзка!

Увы, в VFP6 ЭТОТ способ переброса информации работать не будет. По описанной
там внизу причине.

2 _новичек

Возможно что в этих полях есть что-то что не нравится excel-ю наподобии
пустой даты. Не знаю, я с хитрыми Memo не проверял... Попробуй удалять из
Memo все CHR(13), CHR(10), CHR(9) (а может и всем скопом - все с кодами <
32)

Да я там вроде описался в max размерности и проверку её-же в SCAN не
добавил - массив то в фоксе всего 65000 элементов...

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / помогите скопировать инфу с грида в эксель
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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