Показать сообщение отдельно
Старый 13.06.2012, 09:28   #3  
someOne is offline
someOne
Участник
Аватар для someOne
 
173 / 423 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Цитата:
Сообщение от 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());
   }
}
За это сообщение автора поблагодарили: gl00mie (10), Jorj (1).