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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.10.2007, 16:53   #1  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Как контролировать названия имён файлов созданных с помощью COMExcelDocument_RU
Интересно. Кто нибудь знает простое решение такой задачи.
Есть класс через класс COMExcelDocument_RU создаёт определённый отчет через шаблон exel-я.
Так вот например шаблон называется primer. Отчёт формирует файл primer1.
Вызываю ещё раз. Ещё primer1. И т.д.
А можно сделать так чтоб либо класс сам нашёл какие документы были созданы через этот шаблон (по имени). Ну это сложное решение.
Или чтоб можно было подкидывать индексы. Ничего не изменяя при этом в классе COMExcelDocument_RU (ну или по минимуму). Ну т.е. может стандартное решение какое нибудь есть.
Ну или пусть присваивает какое нибудь имя.
А как его потом заменить на своё, корректно.
Старый 03.10.2007, 17:00   #2  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Сохранить как
Старый 03.10.2007, 17:02   #3  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от belugin Посмотреть сообщение
Сохранить как
А без соханения. Это же не правильно. Может пользователь передумает.
Я ведь когда exel открываю.
Имена появляются книга1, книга2.
А ещё ни чего не сохранено.
Старый 03.10.2007, 19:49   #4  
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   #5  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Gustav спасибо. Да уж не очень приятно получается. Просто самому это бага не очень нравиться. Ну из аналитиков пожеланий в эту сторону не было. Будет сделаю. Но это прийдётся класс COMExcelDocument_RU перекручивать. Создавать какой нибудь метод возвращающий и устанавливающий application. Не люблю подобные классы править, даже если очень нужно. Начнёшь править можно увлечься.
Старый 04.10.2007, 10:44   #6  
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   #7  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Получилось.
И без изменений в базовом классе ComExcelDocument_ru.
Главное создать один объект от этого класса. А дальше просто вызвать метод newFile();
Вот пример класса который создаёт 5 книг Exell и имена индексируются. Example1, Example2, Example3 и т.д.
Мож кому пригодиться.
Вложения
Тип файла: xpo TutorialMultiExcel.xpo (4.7 Кб, 575 просмотров)
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
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, время: 00:58.