03.10.2007, 16:53 | #1 |
Участник
|
Как контролировать названия имён файлов созданных с помощью COMExcelDocument_RU
Интересно. Кто нибудь знает простое решение такой задачи.
Есть класс через класс COMExcelDocument_RU создаёт определённый отчет через шаблон exel-я. Так вот например шаблон называется primer. Отчёт формирует файл primer1. Вызываю ещё раз. Ещё primer1. И т.д. А можно сделать так чтоб либо класс сам нашёл какие документы были созданы через этот шаблон (по имени). Ну это сложное решение. Или чтоб можно было подкидывать индексы. Ничего не изменяя при этом в классе COMExcelDocument_RU (ну или по минимуму). Ну т.е. может стандартное решение какое нибудь есть. Ну или пусть присваивает какое нибудь имя. А как его потом заменить на своё, корректно. |
|
03.10.2007, 17:00 | #2 |
Участник
|
Сохранить как
|
|
03.10.2007, 17:02 | #3 |
Участник
|
|
|
03.10.2007, 19:49 | #4 |
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). |
04.10.2007, 10:03 | #5 |
Участник
|
Gustav спасибо. Да уж не очень приятно получается. Просто самому это бага не очень нравиться. Ну из аналитиков пожеланий в эту сторону не было. Будет сделаю. Но это прийдётся класс COMExcelDocument_RU перекручивать. Создавать какой нибудь метод возвращающий и устанавливающий application. Не люблю подобные классы править, даже если очень нужно. Начнёшь править можно увлечься.
|
|
04.10.2007, 10:44 | #6 |
Moderator
|
Цитата:
И еще одна засада в родителе: X++: abstract class ComOfficeDocument_RU { COM m_comApplication; // COM interface to MS Office application COM m_comDocument; // COM interface to MS Office documnet ................. } |
|
25.11.2007, 15:50 | #7 |
Участник
|
Получилось.
И без изменений в базовом классе ComExcelDocument_ru. Главное создать один объект от этого класса. А дальше просто вызвать метод newFile(); Вот пример класса который создаёт 5 книг Exell и имена индексируются. Example1, Example2, Example3 и т.д. Мож кому пригодиться. |
|
|
Похожие темы | ||||
Тема | Ответов | |||
mazzy: История имен | 9 | |||
сортировка файлов | 12 | |||
Переход по полям грида с помощью стрелочек на клавиатуре | 16 | |||
названия контролов в отчете. | 1 | |||
Отображение названия вместо кода! | 31 |
|