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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.06.2006, 09:41   #1  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Регистрация: 20.08.2005
Не мучаемся, а препарируем

Еще один вариант с разделителями
X++:
    str leftBrace;
    str rightBrace;
    str columnSeparator;
    str rowSeparator;
    str alternateArraySeparator;
    str decimalSeparator;
    COMVariant var;

    #define.xlDecimalSeparator(0x00000003)
    #define.xlLeftBrace(0x0000000C)
    #define.xlRightBrace(0x0000000D)
    #define.xlColumnSeparator(0x0000000E)
    #define.xlRowSeparator(0x0000000F)
    #define.xlAlternateArraySeparator(0x00000010)
    ;
...
    var = xlApp.International(#xlDecimalSeparator);
    if (var) 
        decimalSeparator = var.bStr();
    else 
        decimalSeparator = ",";
    var = xlApp.International(#xlLeftBrace);
    if (var) 
        leftBrace = var.bStr();
    else 
        leftBrace = "{";
    var = xlApp.International(#xlRightBrace);
    if (var) 
        rightBrace = var.bStr();
    else 
        rightBrace = "}";
    var = xlApp.International(#xlColumnSeparator);
    if (var) 
        columnSeparator = var.bStr();
    else
        columnSeparator = ";";
    var = xlApp.International(#xlRowSeparator);
    if (var) 
        rowSeparator = var.bStr();
    else
        rowSeparator = ":";
    var = xlApp.International(#xlAlternateArraySeparator);
    if (var) 
        alternateArraySeparator = var.bStr();
    else
        alternateArraySeparator = "&";
    if (columnSeparator == decimalSeparator)
        columnSeparator = alternateArraySeparator;
    if (rowSeparator == decimalSeparator)
        rowSeparator = alternateArraySeparator;

    rng.FormulaArray(
        strfmt("=%1 1 %3 1 %4 2 %3 2 %4 3 %3 2 %4 4 %3 2 %4 5 %3 2 %4 6 %3 2 %4 7 %3 4 %4 8 %3 2 %4 9 %3 1 %4 10 %3 2%2",
        leftBrace, rightBrace, columnSeparator, rowSeparator));
PS 2 Gustav.
А как это будет выглядеть на английской версии? Если все Ok, то исправлю выгрузку
__________________
Axapta v.3.0 sp5 kr2

Последний раз редактировалось AndyD; 22.06.2006 в 10:05.
Старый 22.06.2006, 12:03   #2  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
AndyD... Есть ощущение, что мы несколько перестарались с массивами...
Сейчас проверил - работает и обычный Range, без всяких FormulaArray...
Просто выстраиваем наш "массив массивов" из 10 строк и 2 столбцов в диапазоне A1:B10 и передаем его OpenText... о блин!
X++:
static void Test_OpenText_NoArray_3(Args _args)
{
    COM xlApp;
    COM rng;
        
    COM wbks, wbk;
    COM wkss, wks;
    COM cells;
    ;
        
    xlApp = new COM('Excel.Application');   
    xlApp.Visible(true);
        
    wbks = xlApp.Workbooks();   
    wbk = wbks.Add();
        
    wkss = wbk.Worksheets();
    wks = wkss.Item(1);
        
    cells = wks.Cells();
        
    // первый СТОЛБЕЦ листа - номера полей A1:A10
    COM::createFromVariant( cells.Item( 1, 1) ).Value2(  1);
    COM::createFromVariant( cells.Item( 2, 1) ).Value2(  2);
    COM::createFromVariant( cells.Item( 3, 1) ).Value2(  3);
    COM::createFromVariant( cells.Item( 4, 1) ).Value2(  4);
    COM::createFromVariant( cells.Item( 5, 1) ).Value2(  5);
    COM::createFromVariant( cells.Item( 6, 1) ).Value2(  6);
    COM::createFromVariant( cells.Item( 7, 1) ).Value2(  7);
    COM::createFromVariant( cells.Item( 8, 1) ).Value2(  8);
    COM::createFromVariant( cells.Item( 9, 1) ).Value2(  9);
    COM::createFromVariant( cells.Item(10, 1) ).Value2( 10);
        
    // второй СТОЛБЕЦ листа - типы полей B1:B10
    COM::createFromVariant( cells.Item( 1, 2) ).Value2(  1);
    COM::createFromVariant( cells.Item( 2, 2) ).Value2(  2);
    COM::createFromVariant( cells.Item( 3, 2) ).Value2(  2);
    COM::createFromVariant( cells.Item( 4, 2) ).Value2(  2);
    COM::createFromVariant( cells.Item( 5, 2) ).Value2(  2);
    COM::createFromVariant( cells.Item( 6, 2) ).Value2(  1);
    COM::createFromVariant( cells.Item( 7, 2) ).Value2(  1);
    COM::createFromVariant( cells.Item( 8, 2) ).Value2(  1);
    COM::createFromVariant( cells.Item( 9, 2) ).Value2(  1);
    COM::createFromVariant( cells.Item(10, 2) ).Value2(  2);
    
    // !!!!!! обычный Range без всяких FormulaArray :)
    rng = wks.Range('A1:B10');
    
    wbks.OpenText
    (
    'C:\\demo.txt', //FileName
    1251, // Origin,
    1, // StartRow,
    1, // DataType
    1, // TextQualifier
    false, // ConsecutiveDelimiter,
    true, // Tab,
    false, // Semicolon,
    false, // Comma,
    false, // Space,
    false, // Other,
    '', // OtherChar,
    rng // FieldInfo
    );
    
}
Старый 22.06.2006, 12:07   #3  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от AndyD
PS 2 Gustav.
А как это будет выглядеть на английской версии? Если все Ok, то исправлю выгрузку
Всё равно предлагаю довести этот "эксперимент в эксперименте" до конца. Потому что тему с массивами затронули весьма интересную.
На английской версии проверю чуть позже. Обязательно сообщу.


P.S. иех, почему я не проверил сразу просто Range?.. наверное, слово Array меня смутило... В общем, "Болван... - Согласен!" (с) Операция Ы

Последний раз редактировалось Gustav; 22.06.2006 в 12:11.
За это сообщение автора поблагодарили: oip (2).
Старый 22.06.2006, 16:57   #4  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от AndyD
А как это будет выглядеть на английской версии? Если все Ok, то исправлю выгрузку
Проверил на английской версии Excel 2003.
Всё - ОК! OpenText отрабатывает, файл загружается.

Строка для FormulaArray формируется корректно.
Когда в региональных настройках Windows "Десятичный разделитель" - "запятая", то в виде (содержимое любой входящей в массив ячейки Excel):
Код:
={1\1; 2\2; 3\2; 4\2; 5\2; 6\2; 7\4; 8\2; 9\1; 10\2}
Когда "Десятичный разделитель" - "точка", то в виде:
Код:
={1,1; 2,2; 3,2; 4,2; 5,2; 6,2; 7,4; 8,2; 9,1; 10,2}
(пробелы добавил от себя, чтобы не рябило в глазах от знаков пунктуации)


P.S.Forward
Цитата:
Сообщение от AndyD
Выгрузку исправил.
Ок. Проверил. Джоб ExportExcelTXT1 для 50 тыс.записей - те же 14 сек, что и джоб ExportExcelTXT.

Последний раз редактировалось Gustav; 22.06.2006 в 20:20.
Теги
benchmark, download, excel, faq, xml, законченный пример, производительность, экспорт/импорт

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Axapta программирует Excel на VBA Gustav DAX: База знаний и проекты 10 13.03.2006 11:42
Использование OWC.Spreadsheet для ускорения экспорта/импорта в/из Excel. storer DAX: Программирование 24 28.03.2005 19:10
Передача данных из 1С в Axapta 3.0 через COM Connector isbist DAX: Программирование 10 03.12.2004 10:58
Особенности экспорта данных в Excel Roman-sp DAX: Функционал 18 01.03.2004 12:07
Введение в Аксапту Роман Кошелев DAX: Прочие вопросы 0 18.12.2001 14:00

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

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

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