|
![]() |
#1 |
Участник
|
Спасибо за открытие новых горизонтов! Все-таки технологии 1998-2001 годов до сих пор рулят! Это было время наступления сингулярности в программировании
![]() Жаль, что в Аксапте можно программировать на Бейсике только в строковых константах! ![]() PS: я конечно немножко преувеличиваю ![]() PS2: для лучшей популярности темы, лучше было бы ее назвать как-нибудь вроде "Найден новый способ выгрузки в Excel" или "Интегрируем Visual Basic в Аксапту". Последний раз редактировалось Ace of Database; 31.08.2011 в 10:08. |
|
|
За это сообщение автора поблагодарили: Gustav (5). |
![]() |
#2 |
Moderator
|
Цитата:
Цитата:
Цитата:
MSScriptControl в качестве языка может использовать и JScript, так что не Бейсиком единым. Кстати, будет здорово, если кто-нибудь смастерит и выложит здесь примерчик со скриптом на Джаве. Welcome! Не, не будем переименовывать. В конце концов дайте же мне потешить мои скромные амбиции - уже вторая тема с заголовком "Поговорим o...". Рубрика-с, однако! ![]() Последний раз редактировалось Gustav; 07.09.2011 в 12:44. |
|
![]() |
#3 |
Moderator
|
![]()
Не откладывая в долгий ящик, сразу решение обратной задачи - импорт из Excel в том же духе.
Перед запуском нижеследующего джоба следует прогнать вышеупомянутый джоб, который выводит матрицу 50000х10 и сохранить получившийся файл (у меня это mssc_output.xls - у себя пропишите свой). Далее скорее запускайте джоб из этого поста и обнаружьте, что это реально "нечеловеческая музыка" (с): X++: static void Job_ReadFromExcel(Args _args) { COM sc; str vbCode; int i,j; int timeStart = timenow(); str file = @'C:\Documents and Settings\kulvinov\My Documents\mssc_output.xls'; str range = 'A2:J50001'; // 50000 x 10 COMVariant dummy, rowsCount, colsCount; ; vbCode = 'Option Explicit \r\n' + 'Dim varArray \r\n' + 'Sub readRangeToVarArray(fileName, rngAddr) \r\n' + ' Dim xlApp \r\n' + ' Dim rng \r\n' + ' Dim wbk \r\n' + ' Set xlApp = CreateObject("Excel.Application") \r\n' + ' With xlApp \r\n' + ' Set rng = .Workbooks.Open(fileName).Application.Range(rngAddr) \r\n' + ' varArray = rng.Value \r\n' + ' Set rng = Nothing \r\n' + ' For Each wbk In .Workbooks \r\n' + ' wbk.Close False \r\n' + ' Next \r\n' + ' Set wbk = Nothing \r\n' + ' .Quit \r\n' + ' End With \r\n' + ' Set xlApp = Nothing \r\n' + 'End Sub \r\n' ; sc = new COM('MSScriptControl.ScriptControl'); sc.Language('vbscript'); sc.AddCode( vbCode ); sc.ExecuteStatement(strFmt('readRangeToVarArray "%1", "%2"',file,range)); info(strFmt('Время окончания считывания, %1 сек',timenow()-timeStart)); rowsCount = sc.Eval('UBound(varArray,1)'); info(strFmt('Количество строк в массиве: %1',rowsCount.long())); colsCount = sc.Eval('UBound(varArray,2)'); info(strFmt('Количество столбцов в массиве: %1',colsCount.long())); for (i=1; i<=rowsCount.long(); i++) // цикл по строкам varArray { for (j=1; j<=colsCount.long(); j++) // цикл по столбцам varArray { dummy = sc.Eval(strFmt('varArray(%1,%2)',i,j)); //print strFmt('%1 -- %2 -- %3 -- %4 -- %5', // i,j,dummy.bStr(),dummy.double(),dummy.date()); } } info(strFmt('Время окончания перебора всех значений, %1 сек',timenow()-timeStart)); } С закомментированным print мои результаты в инфологе таковы: Info Сообщение (20:02:24) Время окончания считывания, 0 сек Info Сообщение (20:02:24) Количество строк в массиве: 50000 Info Сообщение (20:02:24) Количество столбцов в массиве: 10 Info Сообщение (20:02:24) Время окончания перебора всех значений, 21 сек И данные-то можно читать в совершенно произвольном порядке, никакие "только вперёдные" курсоры нас не лимитируют! Красота! Ну, вот. На сегодня я, пожалуй, всё сказал. Пошёл в отпуск на недельку. До встречи! |
|
|
За это сообщение автора поблагодарили: gl00mie (5), mallard (1). |
![]() |
#4 |
Участник
|
Вот это да!
Прощайте, буфер обмена и преобразование строк в контейнеры! |
|
Теги |
excel, импорт из excel, полезное, экспорт в excel |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|