• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Ms Excel 97, Ole, Pivottable и проблемы :-)

  • Автор темы dobozy
  • Дата начала
D

dobozy

Всем привет!

Есть такая проблемка. Требует отчёт, который будет генерится на MS Excel 97 шедульным агентом (что поделаешь так задумано). Скрипт создаёт PivotTable, форматирует её и всё такое. Всё бы ничего, но есть такие проблемы (ма):

1. Call xl.workbooks(1).Close(false, false) не работает ("OLE automation error")
Причём это не работает только для workbook-a на котором создан PivotTable через метод Wizard.

2. Если закрыть на это глаза, то xl.Quit всё решает, но:
  • работает на W2000 Server
  • На XP - Excel crash происходит и инстанс остаётся висеть в памяти

Код примерно так выглядит

Set xl = createObject("excel.Application")
...
Call xl.Workbooks.OpenText(f.FilePath)
...
Call xl.ActiveWorkbook.WorkSheets.Add
Call xl.WorkSheets(1).PivotTableWizard(1, cDataSourceName & "1!" & maxSelectionRange, "Sheet1!R5C1", g_ReportHeading, , , , False, , , , True)
...
xl.displayalerts = False
Сall xl.workbooks(1).SaveAs(strReportFilename, -4143)
Call xl.workbooks(1).Close(False, False) 'Call xl.workbooks.close тоже не работает, флаг Saved = True
Call xl.Quit
Set xl = Nothing

Что кто скажет? Спасибо!
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Почему в одном месте xl.ActiveWorkbook, а в другом xl.workbooks(1)? Может везде xl.ActiveWorkbook использовать?
 
D

dobozy

Я так понял это не имеет значения... Я и так и так использовал...
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Здесь второй параметр - имя файла.
Call xl.workbooks(1).Close(False, False)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
217
в коде удивляет создания пивотныхтаблов (а что - рэндж зафиксировать низя?)...
мобуть - просто создать таблу (исходных данных) по-максимуму строк и менять её, а пивотную - пересчитывать...

значить вот...
запуск шедульных активХэ - это непредсказуемое (страшно-глючное) поведение приложения
воизбежании таких мук, хайлирекоменд - перепишите код для ОО (Сергей приводил пример работы с ХМЛ для ОДФ-а), где сможете обойтись без МСкостылей
да - это отнимет время, но получите предсказуемый результат и кроссплатформенность как бонус :(

ОДФ документирован и стандартизован:


 
A

Akupaka

мобуть - просто создать таблу (исходных данных) по-максимуму строк и менять её, а пивотную - пересчитывать...
думаю, что речь идет не о шаблоне, а о создании док-та с "нуля"

воизбежании таких мук, хайлирекоменд - перепишите код для ОО
одно дело писать для "себя", либо для заказчика с "нуля" :( другое дело - доработка существующего приложения и такое изменение архитектуры не за минуту решается...
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
217
а что мешает сделать шаблон?
 
D

dobozy

Здесь второй параметр - имя файла.
Call xl.workbooks(1).Close(False, False)

Верно, это строку просто писал по памяти. Эти все параметры необязатeльны. Идущие следом варианты не работают тоже:
close()
close(false)
close(false, strReportFilename)

в коде удивляет создания пивотныхтаблов (а что - рэндж зафиксировать низя?)...
мобуть - просто создать таблу (исходных данных) по-максимуму строк и менять её, а пивотную - пересчитывать...

количество строк и толбцов в исходных данных динамическое. поэтому рейндж тоже динамический. И проблема вообще не в этом :(
Таблица пересчитывается сама, я только программно определяю правила вывода: что строки, а что данные. Тут как раз всё отлично.

В данной задаче шаблон намного неудобней лепить чем просто создать PivotTable.

значить вот...
запуск шедульных активХэ - это непредсказуемое (страшно-глючное) поведение приложения
воизбежании таких мук, хайлирекоменд - перепишите код для ОО (Сергей приводил пример работы с ХМЛ для ОДФ-а), где сможете обойтись без МСкостылей
да - это отнимет время, но получите предсказуемый результат и кроссплатформенность как бонус wink.gif

ОДФ документирован и стандартизован:



за ссылки спасибо, но пока я должен работать с тем, что есть. Akupaka верно подметил
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!