Реализовывал сегодня в 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
);