|
![]() |
#1 |
Moderator
|
Цитата:
Генерите все отчеты в одной сессии Excel. Когда закончите, то можете получить список имен всех этих, еще не сохраненных, книг перебором в цикле for коллекции Workbooks объекта Excel.Application. У каждой Workbook в цикле читаем свойство Name. Запомнить список имен можно в любой подходящий класс-коллекцию Аксапты (Set, Array, List и т.п.). Далее, имея список имен файлов, можете обратиться к любому из них методом Item, т.е. грубо COM текущаяКнига = Workbooks.Item('<имя из списка>') и дальше с COM текущаяКнига делаете свои желаемые действия, например, "Сохранить Как". P.S. Свойство Name у рабочей книги - read-only, поэтому единственный способ "изменения" имени - через "Сохранить Как <новое имя>" (естественно, изменение имени сохраненного файла средствами ОС за пределами Excel не рассматриваем ![]() Какие конкретные изменения нужно внести в COMExcelDocument_RU не знаю, я с ним не работаю. По-моему, он как раз не очень удачно "заточен" именно на работу только с одним документом. Привожу в качестве примера метод из некоторого своего класса, который управляемо по желанию либо создает новую сессию Excel (newInstance = true), либо стучится в существующую (newInstance = false) . Метод возвращает массив ссылок на объекты, полезные при дальнейшей работе с сессией Excel. Вам будет интересен прежде всего фрагмент между пунктирными линиями: X++: static Array getExcelSession( str openFileName = '' , anytype workSheet = 1 , str rangeAddress = 'A1' , boolean newInstance = false) { COM xlApplication; COM xlWorkbooks, xlWorkbook; COM xlWorksheets, xlWorksheet; COM xlRange; Array comArray = new Array(Types::Class); ; //------------------------------------------------------------------ xlApplication = COM::getObject('Excel.Application'); if( !xlApplication || newInstance ) xlApplication = new COM('Excel.Application'); //------------------------------------------------------------------ xlWorkbooks = xlApplication.Workbooks(); if (! openFileName ) xlWorkbook = xlWorkbooks.Add(); else xlWorkbook = xlWorkbooks.Open( openFileName ); xlWorksheets = xlWorkbook.Worksheets(); xlWorksheet = xlWorksheets.Item( workSheet ); xlRange = xlWorksheet.Range( rangeAddress ); comArray.value(1, xlApplication); comArray.value(2, xlWorkbooks ); comArray.value(3, xlWorkbook ); comArray.value(4, xlWorksheets ); comArray.value(5, xlWorksheet ); comArray.value(6, xlRange ); return comArray; } |
|
|
За это сообщение автора поблагодарили: miklenew (1). |
![]() |
#2 |
Участник
|
Gustav спасибо. Да уж не очень приятно получается. Просто самому это бага не очень нравиться. Ну из аналитиков пожеланий в эту сторону не было. Будет сделаю. Но это прийдётся класс COMExcelDocument_RU перекручивать. Создавать какой нибудь метод возвращающий и устанавливающий application. Не люблю подобные классы править, даже если очень нужно. Начнёшь править можно увлечься.
|
|
![]() |
#3 |
Moderator
|
Цитата:
![]() И еще одна засада в родителе: X++: abstract class ComOfficeDocument_RU { COM m_comApplication; // COM interface to MS Office application COM m_comDocument; // COM interface to MS Office documnet ................. } |
|
![]() |
#4 |
Участник
|
Получилось.
И без изменений в базовом классе ComExcelDocument_ru. Главное создать один объект от этого класса. А дальше просто вызвать метод newFile(); Вот пример класса который создаёт 5 книг Exell и имена индексируются. Example1, Example2, Example3 и т.д. Мож кому пригодиться. |
|
|
![]() |
||||
Тема | Ответов | |||
mazzy: История имен | 9 | |||
сортировка файлов | 12 | |||
Переход по полям грида с помощью стрелочек на клавиатуре | 16 | |||
названия контролов в отчете. | 1 | |||
Отображение названия вместо кода! | 31 |
|