AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
CRM
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.10.2007, 19:49   #1  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от miklenew Посмотреть сообщение
Так вот например шаблон называется primer. Отчёт формирует файл primer1.
Вызываю ещё раз. Ещё primer1. И т.д.
А почему еще раз primer1? Должно быть primer2, primer3 и т.д. Если у вас каждый раз primer1, то значит каждый раз открывается новая сессия Excel, ибо в одном открытом приложении не может быть двух рабочих книг с одинаковыми именами.

Генерите все отчеты в одной сессии 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   #2  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 438 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Gustav спасибо. Да уж не очень приятно получается. Просто самому это бага не очень нравиться. Ну из аналитиков пожеланий в эту сторону не было. Будет сделаю. Но это прийдётся класс COMExcelDocument_RU перекручивать. Создавать какой нибудь метод возвращающий и устанавливающий application. Не люблю подобные классы править, даже если очень нужно. Начнёшь править можно увлечься.
Старый 04.10.2007, 10:44   #3  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от miklenew Посмотреть сообщение
Но это прийдётся класс COMExcelDocument_RU перекручивать. Создавать какой нибудь метод возвращающий и устанавливающий application.
Глянул бегло в COMExcelDocument_RU. Да, получается, что в newFile надо разделить вызовы initApplication и newDocument по разным методам
И еще одна засада в родителе:
X++:
abstract class ComOfficeDocument_RU
{
    COM m_comApplication;   // COM interface to MS Office application
    COM m_comDocument;      // COM interface to MS Office documnet
    .................
}
т.е. есть приложение, документ (таки один!), а семейства документов (для хранения всех Workbooks)- увы, нет. И как его ввернуть без кардинальной перетряски класса - фиг знает. В параметры методов типа insertRow, insertValue, insertSheet и других придется добавить конкретный workbook (а не только worksheet как сейчас). Такие вот дела...
Старый 25.11.2007, 15:50   #4  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 438 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Получилось.
И без изменений в базовом классе ComExcelDocument_ru.
Главное создать один объект от этого класса. А дальше просто вызвать метод newFile();
Вот пример класса который создаёт 5 книг Exell и имена индексируются. Example1, Example2, Example3 и т.д.
Мож кому пригодиться.
Вложения
Тип файла: xpo TutorialMultiExcel.xpo (4.7 Кб, 583 просмотров)
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
mazzy: История имен Blog bot DAX Blogs 9 07.11.2009 09:57
сортировка файлов ZVV DAX: Программирование 12 20.10.2008 19:56
Переход по полям грида с помощью стрелочек на клавиатуре SorNick DAX: Программирование 16 07.10.2008 12:39
названия контролов в отчете. krmik DAX: Программирование 1 06.07.2005 15:54
Отображение названия вместо кода! demID DAX: Программирование 31 05.10.2004 00:03

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:04.