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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.03.2013, 16:30   #1  
Bega is offline
Bega
Участник
Аватар для Bega
 
382 / 444 (15) +++++++
Регистрация: 18.08.2005
Адрес: Москва
Есть какой-то способ вставки в range массива, как это было возможно с COM?
Вот пример для COM, он работает:
X++:
ComExcelDocument_RU         comExcel;
    ArrayExtend_RU              arrayStr = new ArrayExtend_RU(Types::String, 10);
    ;
    comExcel = new ComExcelDocument_RU();
    comExcel.newFile("", false);
    
    arrayStr = new ArrayExtend_RU(Types::String, 2);
    arrayStr.value(1, "AAA");
    arrayStr.value(2, "БББ");
    
    comExcel.insertValue("A1:B1", arrayStr);
    
    comExcel.visible(true);
А для .NET не работает:
X++:
SysExcelApplication_NET     sysExcelApplication;
    SysExcelWorksheet_NET       sysExcelWorksheet;
    SysExcelRange_NET           range;
    ArrayExtend_RU              arrayStr = new ArrayExtend_RU(Types::String, 10);
    ;
    sysExcelApplication = SysExcelApplication_NET::construct();
    sysExcelApplication.workbooks().add("");
    sysExcelWorksheet = sysExcelApplication.worksheets().itemFromNum(1);
    arrayStr = new ArrayExtend_RU(Types::String, 2);
    arrayStr.value(1, "AAA");
    arrayStr.value(2, "БББ");
    range = sysExcelWorksheet.range("A1:B1");

    range.value2(arrayStr);

    sysExcelApplication.visible(true);
Пытался различными способами передать массив, прямая передача или упаковка через CLRInterop::getObjectForAnyType(arrayStr ) выдает ошибку о невозможности преобразования.
Старый 07.03.2013, 16:46   #2  
Bega is offline
Bega
Участник
Аватар для Bega
 
382 / 444 (15) +++++++
Регистрация: 18.08.2005
Адрес: Москва
Нашел способ через System.Array:
X++:
SysExcelApplication_NET     sysExcelApplication;
    SysExcelWorksheet_NET       sysExcelWorksheet;
    SysExcelRange_NET           range;
    System.Array                array;
    System.Type                 type;
    ;
    sysExcelApplication = SysExcelApplication_NET::construct();
    sysExcelApplication.workbooks().add("");
    sysExcelWorksheet = sysExcelApplication.worksheets().itemFromNum(1);
    
    type = System.Type::GetType('System.String');
    array = System.Array::CreateInstance(type, 2);
    
    array.SetValue(CLRInterop::getObjectForAnyType("AAA"), 0);
    array.SetValue(CLRInterop::getObjectForAnyType("БББ"), 1);
    
    range = sysExcelWorksheet.range("A1:B1");
    range.value2(array);
    
    sysExcelApplication.visible(true);
За это сообщение автора поблагодарили: BOAL (2), Pustik (2), Logger (5), IvanS (1).
Старый 21.01.2014, 21:23   #3  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
Цитата:
Сообщение от Bega Посмотреть сообщение
Нашел способ через System.Array:
Если весь array состоит из System.String, то всё получается корректно. А если в некоторых ячейках числа (переведённые в строковый вид), то они потом экселем всё равно воспринимаются как строки Даже если при этом используется шаблон xlt, в котором у этой ячейки стоит формат данных числовой.
Числа нужно вставлять отдельным массивом с числовым типом ?
__________________
Дмитрий
Старый 14.01.2015, 12:02   #4  
ex3em is offline
ex3em
Участник
 
38 / 19 (1) ++
Регистрация: 22.07.2008
Цитата:
Сообщение от Bega Посмотреть сообщение
Нашел способ через System.Array:


Если данный код запустить в клиентском режиме - работает, как только переключаю класс в серверный - аксапта вылетает.

Причем если вместо array вставлять обычную строку все нормально работает

X++:
    SysExcelApplication_NET     sysExcelApplication;
    SysExcelWorksheet_NET       sysExcelWorksheet;
    SysExcelRange_NET           range;
    System.Array                array;
    System.Type                 type;
    ;

    new InteropPermission( InteropKind::ClrInterop ).assert();
    // BP deviation documented

    sysExcelApplication = SysExcelApplication_NET::construct();
    sysExcelApplication.visible(true);
    sysExcelApplication.workbooks().add("");
    sysExcelWorksheet = sysExcelApplication.worksheets().itemFromNum(1);

    type = System.Type::GetType('System.String');
    array = System.Array::CreateInstance(type, 2);
    array.SetValue(CLRInterop::getObjectForAnyType("AAA"), 0);
    array.SetValue(CLRInterop::getObjectForAnyType("БББ"), 1);

    range = sysExcelWorksheet.range("A1:B1");
    range.value2(array); // !!!! здесь вылетает Axapta
Старый 14.01.2015, 13:33   #5  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
Цитата:
Сообщение от ex3em Посмотреть сообщение
range.value2(array); // !!!! здесь вылетает Axapta
С какой ошибкой вылетает ? AifUtil::getClrErrorMessage() что говорит ?

Я кстати CLRInterop::getObjectForAnyType("AAA") не использую, вставляю значение (строковое, числовое и т.д.) без конвертирования. Работает и в пакетном и в обычном режиме.
__________________
Дмитрий

Последний раз редактировалось Damn; 14.01.2015 в 13:37.
Старый 09.10.2013, 07:31   #6  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
При открытии шаблона через workBooks_net у меня возникает сообщение, что файл был восстановлен. С чем это может быть связано?
Выяснил, что такое поведение связано с шаблонами 2007 офиса. С 2003 нормально работает

Последний раз редактировалось IvanS; 09.10.2013 в 08:24.
Старый 12.01.2016, 17:57   #7  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
?
Цитата:
Сообщение от IvanS Посмотреть сообщение
При открытии шаблона через workBooks_net у меня возникает сообщение, что файл был восстановлен. С чем это может быть связано?
Выяснил, что такое поведение связано с шаблонами 2007 офиса. С 2003 нормально работает
На эту проблему тоже напоролись.
Причём есть необходимость именно в шаблонах 2007.

Кто-нибудь это обходил?
__________________
Zhirenkov Vitaly
Старый 26.01.2016, 15:53   #8  
ziva is offline
ziva
Иван Захаров
Злыдни
Лучший по профессии AXAWARD 2013
 
65 / 106 (4) +++++
Регистрация: 25.03.2005
>При открытии шаблона через workBooks_net у меня возникает сообщение, что файл был восстановлен. С чем это может быть связано?

Удалите свойства файла как описано здесь ...
https://support.office.com/en-us/art...2-686cc64b6949
За это сообщение автора поблагодарили: gl00mie (2), IvanS (1).
Старый 27.01.2016, 18:53   #9  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
это всё не о том...

ларчик на самом деле был зарыт в том, что надо открывать xlsx файлы методом workbooks.OpenXML(), а не просто open().
__________________
Zhirenkov Vitaly
За это сообщение автора поблагодарили: gl00mie (2).
Старый 12.10.2013, 22:27   #10  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
Еще обнаружилась проблема. При выгрузке отчетов через SysExcelApplication_net и закрытии файла в диспетчере задач продолжает висеть процесс.
Решение данной проблемы я находил на разных форумах и основной мыслью было вызов
X++:
System.GC::Collect();
System.GC::WaitForPendingFinalizers();
Но это не помогало. После долгих мучений я нашел решение.
Решение
Все используемые переменные классов SysExcel*_Net должно быть аннулированы (присвоить null, в том числе и переменной приложения). Без этого вторая часть может не отработать.
После этого нужно запустить метод чистки "мусора "(аналог метода quit в классе SysExcelApplication_net ). Его я разместил в классе приложения.
X++:
static void finalizeProcess()
{
    ;
    new InteropPermission(InteropKind::ClrInterop).assert();

    System.GC::Collect();
    System.GC::WaitForPendingFinalizers();
    CodeAccessPermission::revertAssert();
}
После выполнения данных условий процесс у меня завершается.
Надеюсь, что данные опыт кому-нибудь поможет.
За это сообщение автора поблагодарили: alex55 (1).
Старый 13.10.2013, 13:22   #11  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
См. также данное сообщение в этой же теме.
Старый 13.10.2013, 16:26   #12  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
Вопрос можно ли на сервере (windows 2008 R2) сделать доступной сборку Microsoft.Office.Interop.Excel без установки офиса?
Старый 13.10.2013, 22:16   #13  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,282 / 3491 (123) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Вопрос чайника - если один файл "выдрать" из системы, где офис установлен и положить его в GAC на нужный сервер - это спасет? Положить в GAC = скопировать в C:\Windows\assembly средствами проводника Windows.

Сразу оговорюсь - не пробовал - просто спросил
__________________
Возможно сделать все. Вопрос времени
Старый 13.10.2013, 23:25   #14  
handy-comp is offline
handy-comp
Участник
 
96 / 78 (3) ++++
Регистрация: 27.09.2012
Без установки офиса поработать с Microsoft.Office.Interop.Excel не получится, насколько я понимаю, это всего лишь сборка из классов оберток.
Но мысль интересная, особенно если почитать на форуме сообщения об обнаруженных недокументированных особенностях в работе...
Думаю посмотреть в сторону Open XML SDK или сборок-надстроек над ним
типа: http://closedxml.codeplex.com/ или http://simpleooxml.codeplex.com/...
За это сообщение автора поблагодарили: sukhanchik (2).
Старый 14.10.2013, 06:49   #15  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
Вопрос чайника - если один файл "выдрать" из системы, где офис установлен и положить его в GAC на нужный сервер - это спасет? Положить в GAC = скопировать в C:\Windows\assembly средствами проводника Windows.
Сразу оговорюсь - не пробовал - просто спросил
Первым же делом проверил этот факт, поэтому и задал вопрос То есть Reference добавить получается, а вот в коде не видит
Старый 13.10.2013, 23:12   #16  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Классы из пространства имён Microsoft.Office.Interop.Excel - всего лишь обертки для COM-объектов Excel, поэтому сделать доступной сборку можно, но правильный вопрос - можно ли сделать доступным сам Excel без установки офиса. Наверно, извратиться как-то можно, но стоит ли оно того?
За это сообщение автора поблагодарили: sukhanchik (2).
Старый 14.10.2013, 06:54   #17  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Классы из пространства имён Microsoft.Office.Interop.Excel - всего лишь обертки для COM-объектов Excel, поэтому сделать доступной сборку можно, но правильный вопрос - можно ли сделать доступным сам Excel без установки офиса. Наверно, извратиться как-то можно, но стоит ли оно того?
Саму сборку добавить можно, но в коде нет доступа к ней.
В нашем случае, это нужно, чтобы ошибок компиляции не возникала при ежедневной компиляции.
Старый 14.10.2013, 06:51   #18  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
Находил еще такую информацию, что можно установить Microsoft Office 2010(2007): Primary Interop Assemblies и все будет, но похоже без самого офиса он бесмыслен
Старый 23.01.2014, 10:28   #19  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
С работой метода Application.Union так и не разобрались ?
Я тут решил воспользоваться методом Range.TextToColumns. Он тоже не работает
__________________
Дмитрий
Старый 01.04.2014, 18:59   #20  
propeller is offline
propeller
Участник
Аватар для propeller
 
359 / 29 (1) +++
Регистрация: 25.07.2007
а в 2012 в CIL эти классы могут работать?
пока падает с такой ошибкой:
X++:
 :    SysExcelApplication_NET.new,   CIL  .
Теги
.net, ax2009, excel, законченный пример, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
проблема использования Excel через clr Batuev Artem DAX: Программирование 8 22.08.2011 18:01
AX.NET: интеграция .NET-приложений с Аксаптой и (будущие) возможности облачных вычислений gl00mie DAX: Программирование 2 23.04.2010 00:47
Импорт даты через Excel OliaM DAX: Функционал 2 13.12.2007 10:32
Экспорт в Excel через WorkBooks.OpenText() Владимир Максимов DAX: Программирование 2 09.04.2004 17:16
Чтение Excel-ячейки в Аксапте (2.5) через COM AKIS DAX: Программирование 3 25.03.2004 20:18

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:28.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.