Показать сообщение отдельно
Старый 09.04.2018, 20:12   #96  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
Реализовывал сегодня в Ax2009 вызов функции TextToColumns класса Range из сборки Microsoft.Office.Interop.Excel.

Проблема возникла с тем как запрограммировать параметр Object FieldInfo. Это array форматов данных столбцов. Какой столбец должен быть текстовым, какой числовым, какой с датами и т.д. У меня несколько столбцов имеют тип "Дата" и я этот параметр обязательно должен был инициализировать и передать в функцию. Примеров в гугле даже для C# практически не смог найти. Не говоря уж про примеры из аксапты.

А без примеров не совсем очевидно как сформировать этот array. В результате сегодняшних экспериментов получил следующий результат, может кому пригодится .
В примере происходит открытие файла csv, в котором построчно хранятся данные, разделённые символом табуляции. После открытия происходит вызов функции TextToColumns для распределения данных по столбцам.
X++:
    Microsoft.Office.Interop.Excel._Application         excel;
    Microsoft.Office.Interop.Excel.Workbooks            workbooks;
    Microsoft.Office.Interop.Excel._Workbook            workbook;
    Microsoft.Office.Interop.Excel._Worksheet           ws;
    Microsoft.Office.Interop.Excel.Range                range;
    System.Type                                         type;
    System.Reflection.FieldInfo                         fieldInfo;
    System.Object                                       missing;
    Microsoft.Office.Interop.Excel.XlColumnDataType     columnDataType;
    System.Array                                        formatArray;
    System.Array                                        array;
    int                                                 i;
    System.String                                       decimalSeparator;
    System.Object                                       textToColumnsDestination;
;
    type             = System.Type::GetType('System.Reflection.Missing');
    fieldInfo        = type.GetField('Value');
    missing          = fieldInfo.GetValue(null);
    fileFormat       = Microsoft.Office.Interop.Excel.XlFileFormat::xlWorkbookDefault;

    excel            = new Microsoft.Office.Interop.Excel.ApplicationClass();
    excel.set_Visible(true);

    workbooks        = excel.get_Workbooks();
    workbook         = workbooks._Open( fileName, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);

    ws              = workbook.get_ActiveSheet();
    range           = ws.get_Range( "A:A", missing);
    range.Select();

    formatArray = System.Array::CreateInstance( System.Type::GetType("System.Object"), 27);

    for (i=0; i<27; i++)
    {
        array   = System.Array::CreateInstance( System.Type::GetType("System.Int32"), 2);
        array.SetValue( i+1, 0);

        switch (i+1)
        {
            case 12,13,14,15:
                columnDataType  = Microsoft.Office.Interop.Excel.XlColumnDataType::xlDMYFormat;
                break;
            case 17,18,19:
                columnDataType  = Microsoft.Office.Interop.Excel.XlColumnDataType::xlTextFormat;
                break;
            default:
                columnDataType  = Microsoft.Office.Interop.Excel.XlColumnDataType::xlGeneralFormat;
                break;
        }

        array.SetValue( columnDataType, 1);

        formatArray.SetValue(array,i);
    }

    textToColumnsDestination    = ws.get_Range("A1",missing);
    decimalSeparator            = ",";

    range.TextToColumns( textToColumnsDestination
                       , Microsoft.Office.Interop.Excel.XlTextParsingType::xlDelimited
                       , Microsoft.Office.Interop.Excel.XlTextQualifier::xlTextQualifierDoubleQuote
                       , false
                       , true
                       , false
                       , false
                       , false
                       , false
                       , missing
                       , formatArray
                       , decimalSeparator
                       , missing
                       , true
                       );
__________________
Дмитрий
За это сообщение автора поблагодарили: dech (3), Logger (5).