Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > Excel копирование ячеек в другую книгу C#


Автор: Albinos_x 24.7.2013, 08:47
Доброе время суток!

ОС: Window Server 2003 R2 Enterprise, Windows Server 2008 R2 Standart
Office: ms Office Standart 2007
среда: Интерпритатор СЭД Docsvision

столкнулся с такой проблемой:
Мне нужно скопировать группу ячеек из одной книги Excel в другую.
Применяю следующий код:
Код
...
           process.LogMessage("get last cells xls");
           Cells = WorkSheetCSV.GetType().InvokeMember("Cells", BindingFlags.GetProperty, null, WorkSheetXLS, null);
           process.LogMessage("connect cells");
           Range = Cells.GetType().InvokeMember("SpecialCells", BindingFlags.GetProperty, null, Cells, new object[]{11 /*xlCellTypeLastCell*/});
           process.LogMessage("get last cells range");
           int tmpIntXLS=Convert.ToInt32(Range.GetType().InvokeMember("Row", BindingFlags.GetProperty, null, Range, null))+1;
           process.LogMessage("Num row + 1: "+tmpIntXLS.ToString());

           process.LogMessage("Copy cells");
           int tmpIntCSVXLS = tmpIntXLS+tmpInt;
           process.LogMessage("get new last cells: "+tmpIntCSVXLS.ToString());
        RangeXLS = WorkSheetXLS.GetType().InvokeMember("Range", BindingFlags.GetProperty, null, WorkSheetXLS, new object[]{"A"+tmpIntXLS.ToString()+":V"+tmpIntCSVXLS.ToString()});
           process.LogMessage("get full range xls");
           Range = WorkSheetCSV.GetType().InvokeMember("Range", BindingFlags.GetProperty, null, WorkSheetCSV, new object[]{"A1:V"+tmpInt.ToString()});
           process.LogMessage("Get range CSV");
           Range.GetType().InvokeMember("Copy", BindingFlags.SetProperty, null, Range, new object[] { RangeXLS }); // <<<<--- тут ошибка
...


вылетает ошибка: Exception has been thrown by the target of an invocation.: Нельзя установить свойство Copy класса Range

При этом код в VB с подобными аргументами срабатывает нормально:
Код

    Dim Range1 As Range
    Dim Range2 As Range
    
    Set Range1 = Range("A1:A3")
    Set Range2 = Range("C1:C3")
    Range1.Copy Range2


реализация через copy и paste не подходит, т.к. система многопоточная и в это время может быть открыто несколько экземпляров Excel

Подскажите, что я делаю не так?

спасибо.

Автор: Albinos_x 24.7.2013, 10:29
извините за беспокойство.
Проблема решена.

необходимо было использовать:
Код

           Range.GetType().InvokeMember("Copy", BindingFlags.GetProperty, null, Range, new object[] { RangeXLS });

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)