Гость
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Экспорт в Excel и память / 11 сообщений из 11, страница 1 из 1
09.06.2004, 12:43
    #32554005
conrad
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт в Excel и память
PB 6.5.1 Есть скрипт, который конвертирует некоторое количество html - файлов в Excel. Выглядит примерно так

lole_excel = create oleobject
lole workbook = create oleobject
IF lole_excel.ConnectToNewObject("excel.application") <> 0 THEN
destroy lole_excel
RETURN -1
END IF
Здесь начинается цикл, в котором перебираются названия файлов

lole_workbook = lole_excel.application.workbooks.open(ls_path + '.htm')
lole_workbook.SaveAs(ls_path+'.xls',-4143)
lole_workbook.close()

Здесь цикл заканчивается

lole_excel.application.quit
lole_excel.DisconnectObject()

destroy lole_workbook
destroy lole_excel

Работать-то это работает, но с каждым новым файлом отъедает кусок памяти, и в конце концов приложение вылетает с сообщением Out of memory. Как решить проблему?
...
Рейтинг: 0 / 0
09.06.2004, 12:57
    #32554035
Ikar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт в Excel и память
2 conrad:
Сталкивались с подобной проблемой, только с вордом, а не с экселем.
По опыту могу прекомендовать следующее (примерно применительно к вашей стиуации):
1. оле-объект создаем в цикле для каждого нового файла.
2. выполняем необходимые операции.
3. уничтожаем объект.
4. принудительно вызываем GarbageCollect ( )
5. переходим к следующей операции цикла.

Замечу, что это все только мои рекомендации...
---
С уважением, IKAR
ikarhomecenter@narod.ru
IkarHomeCenter
...
Рейтинг: 0 / 0
09.06.2004, 13:04
    #32554051
conrad
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт в Excel и память
Пробовал и такой вариант. Память частично очищается, но все равно постепенно утекает, так что при большом количестве файлов это проблему не решает.
...
Рейтинг: 0 / 0
09.06.2004, 13:11
    #32554064
dGrichine
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт в Excel и память
попробуй так
не используй второй oleobject
у меня утечки памяти нет
PB 6.5.1

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
oleobject lole_excel
string ls_path = "c:\temp\employee_out"
integer i

lole_excel = create oleobject
//lole workbook = create oleobject
IF lole_excel.ConnectToNewObject("excel.application") <>  0  THEN
	destroy lole_excel
	RETURN
END IF 

for i =  1  to  100 
	lole_excel.application.workbooks.open(ls_path + '.htm').SaveAs(ls_path + string(i) + '.xls',- 4143 )
next

lole_excel.application.quit
lole_excel.DisconnectObject()

destroy lole_excel

===
Гришин Дмитрий
...
Рейтинг: 0 / 0
09.06.2004, 13:41
    #32554146
dGrichine
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт в Excel и память
извини поторопился без второго ole не обойтись
у меня вот с таким скриптом и памятью все в порядке, excel отжирает 4-5 мегабайт при старте и больше память не растет...

до старта скрпипта 151 Мб занят при работе 155-156
по завершении опять 151...

PB 6.5.1 Win2k Prof SP4 RUS

Код: 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.
oleobject lole_excel, lole_workbook
string ls_path = "c:\temp\employee_out"
integer i

lole_excel = create oleobject
//lole_workbook = create oleobject
IF lole_excel.ConnectToNewObject("excel.application") <>  0  THEN
	destroy lole_excel
	RETURN
END IF 

//lole_excel.Visible = True

for i =  1  to  100 
	lole_workbook = lole_excel.application.workbooks.open(ls_path + '.htm')
	lole_workbook.SaveAs(ls_path + string(i) + '.xls',- 4143 )
	lole_workbook.Close()
next

lole_excel.application.quit
lole_excel.DisconnectObject()

destroy lole_workbook
destroy lole_excel

MessageBox('','Ok')

===
Гришин Дмитрий
...
Рейтинг: 0 / 0
09.06.2004, 14:08
    #32554240
conrad
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт в Excel и память
Дмитрий, на самом деле без вторго oleobject вполне можно обойтись, примерно так
Код: plaintext
lole_excel.application.workbooks(ls_fileName+'.htm').SaveAs(ls_path+'.xls',- 4143 )
только это мало меняет картину.
Дело в том, что если просто конвертировать файл, проблем с памятью нет. Но в моем случае в excel еще задается оформление для диапозонов ячеек - шрифты, цвета и формулы. Чем больше таких извращений, тем больше утечка. По итогам экспериментов, самым экономичным вариантом остается тот, о котором писал Икар. Спасибо всем, кто откликнулся, если есть еще какие-то соображения, пожалуйста, поделитесь.
...
Рейтинг: 0 / 0
09.06.2004, 14:18
    #32554263
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт в Excel и память
А с другой версией Excel что-то меняется? Или не зависит от этого?
...
Рейтинг: 0 / 0
09.06.2004, 14:36
    #32554340
dGrichine
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт в Excel и память
авторна самом деле без вторго oleobject вполне можно обойтись
без него не обойтись, так как надо закрывать открытую книгу

попробуй поставить
Код: plaintext
lole_excel.Visible = True
и ты увидишь что в этом случае открытые книги не закрываются и следовательно excel отжирает память под новые файлы... и это не может проболжаться до бесконечности

авторНо в моем случае в excel еще задается оформление для диапозонов ячеек - шрифты, цвета и формулы. Чем больше таких извращений, тем больше утечка
вот с этим трудно согласиться... сомневаюсь, чтобы excel при манипулировании свойствами ячеек отжирал память...
где-то что-то у тебя остается в памяти

чтобы в этом разобраться посмотри что за приложение отжирает память - PB или Excel... (например с помощью Process Explorer http://www.sysinternals.com/) после этого можно уже искать причину...

если Excel - то смотри закрывает ли он файлы
если Билдер - то смотри код. подключай функционал по мере нарастания сложности манипуляций - найдешь на чем происходит рост памяти...

а постоянно поднимать новый экземпляр Excel.application и тут же его закрывать - это крайняя мера... хотя бы по 50-100 файлов, но не постоянно...

===
Гришин Дмитрий
...
Рейтинг: 0 / 0
09.06.2004, 14:55
    #32554403
conrad
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт в Excel и память
Код: plaintext
lole_excel.application.workbooks(ls_fileName+'.xls').close()
Это насчет одного oleobject. Прошу прощения, насчет оформления я погорячился, сильно картину оно не меняет. Память жрет не excel, а приложение на PB, версия Excel значения не имеет. А в том варианте, на котором я остановился excel.application один, уничтожается lole_workbook, а потом garbageCollect(). При таком раскладе все несколько лучше, чем с одним oleobject.
...
Рейтинг: 0 / 0
09.06.2004, 15:09
    #32554462
dGrichine
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт в Excel и память
авторПамять жрет не excel, а приложение на PB, версия Excel значения не имеет. А в том варианте, на котором я остановился excel.application один, уничтожается lole_workbook, а потом garbageCollect(). При таком раскладе все несколько лучше, чем с одним oleobject.

если ты уверен, что память жрет PB, то тебе и карты в руки...
ты же говоришь, что если форматирование не использовать, то все ОК... подключай постепенно функционал с форматированием ячеек и увидишь на каком месте у тебя в билдере что-то остается в памяти...
наверняка ты используешь еще ole объекты для доступа к ячейкам или диапазонам Excel...

PS
Думаю, руки опускать рано... надо искать причину

Кстати, ты не используешь в этом коде Describe("Evaluate(...)")?

===
Гришин Дмитрий
...
Рейтинг: 0 / 0
09.06.2004, 15:46
    #32554591
ChV
ChV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт в Excel и память
Ситуация была и у меня - почти один в один. Что только не перепробовал (PB 7.03 ). Обработка больших массивов информации с сохранением результатов обработки в EXCEL файле. "Out of memory" - замучил. Выяснил, что проблема была не с EXCEL, а в предке объекта PB - "u_progressbar". В предлагаемом скрипте его нет, но я когда искал причины проблемы его тоже не рассматривал.
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Экспорт в Excel и память / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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