|
09.04.2018, 20:12 | #1 |
Участник
|
Реализовывал сегодня в 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). |
Теги |
.net, ax2009, excel, законченный пример, полезное |
|
|