|
07.03.2013, 16:30 | #1 |
Участник
|
Есть какой-то способ вставки в 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); 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); |
|
07.03.2013, 16:46 | #2 |
Участник
|
Нашел способ через 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 |
Участник
|
Если весь array состоит из System.String, то всё получается корректно. А если в некоторых ячейках числа (переведённые в строковый вид), то они потом экселем всё равно воспринимаются как строки Даже если при этом используется шаблон xlt, в котором у этой ячейки стоит формат данных числовой.
Числа нужно вставлять отдельным массивом с числовым типом ?
__________________
Дмитрий |
|
14.01.2015, 12:02 | #4 |
Участник
|
Если данный код запустить в клиентском режиме - работает, как только переключаю класс в серверный - аксапта вылетает. Причем если вместо 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 |
Участник
|
С какой ошибкой вылетает ? AifUtil::getClrErrorMessage() что говорит ?
Я кстати CLRInterop::getObjectForAnyType("AAA") не использую, вставляю значение (строковое, числовое и т.д.) без конвертирования. Работает и в пакетном и в обычном режиме.
__________________
Дмитрий Последний раз редактировалось Damn; 14.01.2015 в 13:37. |
|
09.10.2013, 07:31 | #6 |
Участник
|
При открытии шаблона через workBooks_net у меня возникает сообщение, что файл был восстановлен. С чем это может быть связано?
Выяснил, что такое поведение связано с шаблонами 2007 офиса. С 2003 нормально работает Последний раз редактировалось IvanS; 09.10.2013 в 08:24. |
|
12.01.2016, 17:57 | #7 |
MCITP
|
Цитата:
Причём есть необходимость именно в шаблонах 2007. Кто-нибудь это обходил?
__________________
Zhirenkov Vitaly |
|
26.01.2016, 15:53 | #8 |
Иван Захаров
|
>При открытии шаблона через workBooks_net у меня возникает сообщение, что файл был восстановлен. С чем это может быть связано?
Удалите свойства файла как описано здесь ... https://support.office.com/en-us/art...2-686cc64b6949 |
|
|
За это сообщение автора поблагодарили: gl00mie (2), IvanS (1). |
27.01.2016, 18:53 | #9 |
MCITP
|
это всё не о том...
ларчик на самом деле был зарыт в том, что надо открывать xlsx файлы методом workbooks.OpenXML(), а не просто open().
__________________
Zhirenkov Vitaly |
|
|
За это сообщение автора поблагодарили: gl00mie (2). |
12.10.2013, 22:27 | #10 |
Участник
|
Еще обнаружилась проблема. При выгрузке отчетов через 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 |
Участник
|
См. также данное сообщение в этой же теме.
|
|
13.10.2013, 16:26 | #12 |
Участник
|
Вопрос можно ли на сервере (windows 2008 R2) сделать доступной сборку Microsoft.Office.Interop.Excel без установки офиса?
|
|
13.10.2013, 22:16 | #13 |
Administrator
|
Вопрос чайника - если один файл "выдрать" из системы, где офис установлен и положить его в GAC на нужный сервер - это спасет? Положить в GAC = скопировать в C:\Windows\assembly средствами проводника Windows.
Сразу оговорюсь - не пробовал - просто спросил
__________________
Возможно сделать все. Вопрос времени |
|
13.10.2013, 23:25 | #14 |
Участник
|
Без установки офиса поработать с Microsoft.Office.Interop.Excel не получится, насколько я понимаю, это всего лишь сборка из классов оберток.
Но мысль интересная, особенно если почитать на форуме сообщения об обнаруженных недокументированных особенностях в работе... Думаю посмотреть в сторону Open XML SDK или сборок-надстроек над ним типа: http://closedxml.codeplex.com/ или http://simpleooxml.codeplex.com/... |
|
|
За это сообщение автора поблагодарили: sukhanchik (2). |
14.10.2013, 06:49 | #15 |
Участник
|
Первым же делом проверил этот факт, поэтому и задал вопрос То есть Reference добавить получается, а вот в коде не видит
|
|
13.10.2013, 23:12 | #16 |
Участник
|
Классы из пространства имён Microsoft.Office.Interop.Excel - всего лишь обертки для COM-объектов Excel, поэтому сделать доступной сборку можно, но правильный вопрос - можно ли сделать доступным сам Excel без установки офиса. Наверно, извратиться как-то можно, но стоит ли оно того?
|
|
|
За это сообщение автора поблагодарили: sukhanchik (2). |
14.10.2013, 06:54 | #17 |
Участник
|
Цитата:
Сообщение от gl00mie
Классы из пространства имён Microsoft.Office.Interop.Excel - всего лишь обертки для COM-объектов Excel, поэтому сделать доступной сборку можно, но правильный вопрос - можно ли сделать доступным сам Excel без установки офиса. Наверно, извратиться как-то можно, но стоит ли оно того?
В нашем случае, это нужно, чтобы ошибок компиляции не возникала при ежедневной компиляции. |
|
14.10.2013, 06:51 | #18 |
Участник
|
Находил еще такую информацию, что можно установить Microsoft Office 2010(2007): Primary Interop Assemblies и все будет, но похоже без самого офиса он бесмыслен
|
|
23.01.2014, 10:28 | #19 |
Участник
|
С работой метода Application.Union так и не разобрались ?
Я тут решил воспользоваться методом Range.TextToColumns. Он тоже не работает
__________________
Дмитрий |
|
01.04.2014, 18:59 | #20 |
Участник
|
а в 2012 в CIL эти классы могут работать?
пока падает с такой ошибкой: X++: : SysExcelApplication_NET.new, CIL . |
|
Теги |
.net, ax2009, excel, законченный пример, полезное |
|
|