Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Отчет в Excel под Win98  [new]
Sergey Volodko
Member

Откуда:
Сообщений: 10
Помогите!

Из Vfp6 формирую отчет в Excel используя шаблон. Под WinMe все Ок. При переносе программы на Win98, если отчет большой то вываливается: "Программа Excel вызвала ошибку защиты памяти и т.д".
Т.е. на небольших отчетах все работает а на больших - нет. Подскажите как лечить?
21 июл 04, 19:52    [825585]     Ответить | Цитировать Сообщить модератору
 Re: Отчет в Excel под Win98  [new]
IgorProgrammer
Member

Откуда:
Сообщений: 687
Как именно формируется отчет...

Если непосредственно из лисы... то такая ошибка возникает у всех операционках... Эт наблюдается если часто и большие отчеты...

Я решил эту проблему через макрос...
Данные формируются в лисе а вывод происходит в макросе...

типа:

OleExcel = createobject('Excel.Application')
oleExcel.Application.Workbooks.Open(Template) 
oleExcel.Run("Copy_Kniga_new",docIndex) && макрос создает аналог текущего листа шаблона
OleExcel.Run("My_Start_Header",my_rows_copy,my_rows_paste,@my_mas_perem)
в зависимости от переменных происходит вывод данных в цикле

1) У меня перестала появляться эта замечательная ошибка
2) Значительно ускорился процесс вывода в ексель (где-то в 5-20 раз в зависимости от листа шаблона и специфики вывода)
22 июл 04, 10:59    [826634]     Ответить | Цитировать Сообщить модератору
 Re: Отчет в Excel под Win98  [new]
Sergey Volodko
Member

Откуда:
Сообщений: 10
Спасибо!
Да,отчет формируется непосредственно из vfp. Создается шаблон в котором прописываются параметры отчета и какие поля надо выводить, затем фох открывает шаблон обрабатывает его параметры и формирует
ексел-таблицу. На компе с ВИНМЕ все работает четко не зависимо от длины отчета, а на других системах глюки. Глючит похоже ОЛЕ. Может его можно как то лечить?
Нельзяли поподробнее про макрос и если можна - пример. Если я правильно понял то я всю процедуру вывода делаю макросом на вижуал бейсике? Т.е создаю файл My_Start_Header в котором командами бейсика формирую строку отчета и в цикле запускаю макрос? Пожалуйста, хотелось бы поподробнее с этого места.
22 июл 04, 12:40    [827132]     Ответить | Цитировать Сообщить модератору
 Re: Отчет в Excel под Win98  [new]
IgorProgrammer
Member

Откуда:
Сообщений: 687
Весь макрос я предоставить не могу...
Но могу кое-в чем помочь...

1) Создавать макрос надо в 97 Экселе...
Если создаешь более поздних версиях и запускаешь под 97 некоторые функции могут отсутствовать... например функция округления...
2) Первая функция макроса должна создавать макет по шаблону
Workbooks.Add
и забирать все настройки из нужного листа шаблона (например длина колонки иль еще че-то если надо)...
Workbooks(Copy_Kniga).Worksheets(1).Columns("A:A").ColumnWidth = Workbooks(Activate_kniga).Worksheets(2).Columns("A:A").ColumnWidth

3) передаешь какая строка шаблона копируется и куда вствляется...
также масив выводимых значений
например 1 строка копируется вставляется в 10
Workbooks(Activate_kniga).Worksheets(docIndex).Rows(1).Copy
Workbooks(Copy_Kniga).Worksheets(1).Paste (Workbooks(Copy_Kniga).Worksheets(1).Rows(10))

потом разбираешь свой массив и вставляешь в нужные ячейки данные...
например если нужно записатьв 1 колонку 10 строки запись Привет,
то первый элемент масива должен равняться 'A Привет'
  Где:
    1)А + определенное количество пробелов -> номер колонки
    2) 'Привет' -> это нужные данные
теперь нужная колонка + нужная строка . значение = "привет"
Workbooks(Copy_Kniga).Worksheets(1).Range(1,10).Value="привет"
Если текст невлазит, то раздвинуть ячейку до нужной ширины...
За это должна отвечать функция по вычислению ширины...
P.S. С ней я наеб... но все-же достиг более-ли-менее оптимального результата...
Извини пример не могу пробить... эт часть есть в документе по защ. прав. интелек. собственн. КАК и почти весь макрос и главные проги лисы...

Также в масиве можно передавать параметры ячейки...
Какой текст, какой цвет, какой размер и т. д. по усмотрению...

4) Макрос капирования настроек листа и закрытия шаблона...
например параметры печати
Workbooks(Copy_Kniga).Worksheets(1).PageSetup.PrintArea = Workbooks(Activate_kniga).Worksheets(docIndex).PageSetup.PrintArea

И вперед в соответствии данного примера...
OleExcel = createobject('Excel.Application')
my_mas_perem[1] = 'A       Привет'
docIndex = 1 && номер копируемого листа
OleExcel = createobject('Excel.Application')
OleExcel.Run("Macro1",docIndex) 
OleExcel.Run("Macro2",1,10,@my_mas_perem)
OleExcel.Run("Macro3")
Release OleExcel

Картинка с другого сайта.

Желаю удачи...
22 июл 04, 14:49    [827654]     Ответить | Цитировать Сообщить модератору
 Re: Отчет в Excel под Win98  [new]
Sergey Volodko
Member

Откуда:
Сообщений: 10
Спасибо, буду пытаться разгребать. Просто удивительно то что везде пишеться о том как просто и элегантно можно из фокса перекинуть в ексель, а оказывается не все так просто... ;-( Еще раз спасибо, что откликнулись.
23 июл 04, 01:28    [829218]     Ответить | Цитировать Сообщить модератору
 Re: Отчет в Excel под Win98  [new]
LightWarrior
Member

Откуда: langepas
Сообщений: 88
У меня отчет выводился из vfp8 в Excel2003 просто замечательно. Когда прогу стали запускать из vfp6 в Excel97 стала вылазить ошибка памяти Excel. Примечательно то что при пошаговом выполнении тоже все отлично выводилось в excel. Я просто добавил паузу (секунду) после создания экземпляра объекта excel, после открытия шаблонного документа
oxl=CREATEOBJECT("Excel.Application")
Inkey(1)
oxl.Workbooks.add(SYS(5)+SYS(2003)+"\template.xls")
Inkey(1)
oxl.ActiveWorkbook.SaveAs("c:\week.xls")
Inkey(1)
oxl.ActiveSheet.cells(2,2)= 'c '+Dtoc(ldBegin)+' по '+ Dtoc(ldEnd)
oxl.ActiveSheet.cells(5,3)=lnAll
...
oxl.ActiveWorkbook.Save()
oxl.Quit
23 июл 04, 12:06    [830057]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить