|
![]() |
#1 |
Участник
|
Цитата:
Сообщение от Varmen
![]() переписываю старый класс под .net, избавлясь от COM обьектов экселя.
Натолкнулся на ошибку при пользовании метода Range.CopyFromRecordset(Data, MaxRows, MaxColumns) определние по МСДН C# CopyFromRecordset( [In] object Data, [In, Optional] object MaxRows, [In, Optional] object MaxColumns); ![]() Тут писать либо все на COM либо все на NET... Вообще функции Microsoft.Office.Interop.* документированы плохо, и разобратся иногда в них не просто. Чтобы функция CopyFromRecordset заработала, нужно подготовить и передать ей на вход подготовленый объект NET ADODB.Recordset как в примере ниже. (Придется подключить эту сборку предварительно в Reference Аксапта) X++: static void Job91(Args _args) { Microsoft.Office.Interop.Excel.ApplicationClass excelApp; Microsoft.Office.Interop.Excel.Workbooks excelWbs; Microsoft.Office.Interop.Excel.WorkbookClass excelWb; Microsoft.Office.Interop.Excel.Worksheets excelWorksheets; Microsoft.Office.Interop.Excel.WorksheetClass excelWorksheet; Microsoft.Office.Interop.Excel.Range excelCells; Microsoft.Office.Interop.Excel.Range excelCell; Microsoft.Office.Interop.Excel.Range myRange; System.Type type; System.Object missing; System.Object tmp; System.Reflection.FieldInfo inforef; ADODB.RecordsetClass recordSet; ADODB.Fields fields; ADODB.Field field; ; try { type = System.Type::GetType("System.Reflection.Missing"); inforef = type.GetField("Value"); missing = inforef.GetValue(Null); excelApp = new Microsoft.Office.Interop.Excel.ApplicationClass(); // можно сделать excel видимым excelApp.set_Visible(true); excelWbs = excelApp.get_Workbooks(); excelWb = excelWbs._Open("c:\\1.xls",missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing); // Можно открыть чистый лист Excel // excelWb = excelWbs.Add(missing); excelWorksheets = excelWb.get_Worksheets(); excelWorksheet = excelWorksheets.get_Item(1); excelCells = excelWorksheet.get_Cells(); myRange = excelCells.get_Range("A1", missing); // Подготовка набора записей для вставки recordSet = new ADODB.RecordsetClass(); fields = recordSet.get_Fields(); fields.Append("name", ADODB.DataTypeEnum::adVarChar, 100, ADODB.FieldAttributeEnum::adFldFixed, null); fields.Append("count", ADODB.DataTypeEnum::adDecimal, 3, ADODB.FieldAttributeEnum::adFldFixed, null); fields.Append("sum", ADODB.DataTypeEnum::adDecimal, 2, ADODB.FieldAttributeEnum::adFldFixed, null); recordSet.Open(missing, missing, ADODB.CursorTypeEnum::adOpenKeyset, ADODB.LockTypeEnum::adLockOptimistic, 1); recordSet.AddNew(missing, missing); field = fields.get_Item(0); field.set_Value("Привет из Акспта"); field = fields.get_Item(1); field.set_Value(365465); field = fields.get_Item(2); field.set_Value(36.123); recordSet.Update(missing, missing); // так можно вставить набор записей myRange.CopyFromRecordset(recordSet, missing, missing); //здесь ошибка больше не выскакивает // а так вставляется значение в отдельную ячейку myRange = excelCells.get_Item(2, 2); myRange.set_Value2("Hello, world!"); } catch (Exception::CLRError) { error(AifUtil::getClrErrorMessage()); } } |
|
|
За это сообщение автора поблагодарили: gl00mie (10), Jorj (1). |
Теги |
.net, ado, excel, recordset, как правильно |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|