Цитата:
Сообщение от
Varmen
переписываю старый класс под .net, избавлясь от COM обьектов экселя.
Натолкнулся на ошибку при пользовании метода Range.CopyFromRecordset(Data, MaxRows, MaxColumns)
определние по МСДН
C#
CopyFromRecordset( [In] object Data, [In, Optional] object MaxRows, [In, Optional] object MaxColumns);
Как это у вас легко получается передать COM объект в качетве аргумента NET функции.
Тут писать либо все на 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());
}
}