Microsoft office interop excel applicationclass
.NetBlog — блог о программировании на C# .Net, и других, не мене интересных вещах.
Заметки о разработке ПО, советы по .net, SharePoint, SQL, архитектура приложений, литература по программированию. А также просто просто мысли о жизни и рассказы о том, что интересно автору, например путешествиях и вкусной еде 😉
суббота, 11 октября 2014 г.
COM Interop на примере работы с Excel
В предыдущем посте я писал о создании csv-файла и экспорта в него данных из ASP.NET и при этом, перечисляя разные варианты, не упомянул один совсем уже бредовый для web-приложения, но частенько очень подходящий для приложений десктопных. Это работа с установленным в системе COM-объектом c помощью технологии под названием COM Interop.
COM Interop используется в .Net для предоставления возможности взаимодействия управляемого .Net кода с COM-объектами. Тля того чтобы использовать какой-либо COM-объект из управляемого кода, необходимо создать сборку, содержащую информацию о типах содержащихся в COM-библиотеке, в совместимом с CRL формате.
В процессе работы приложения CLR создает для каждого COM-объекта внутренний объект, называемый Runtime Callable Wrapper (Вызываемая оболочка времени выполнения) или RCW, которая используется для создания COM-объекта и маршалинга данных между управляемой и неуправляемой средой. Также, RCW используется для мониторинга количества активных ссылок на COM-объект и его уничтожение, когда количество активных ссылок станет равным нулю. Выглядит это примерно так:
Обычно, если вы ходите создать CLR библиотеку для какого-либо компонента самостоятельно, то вам нужно использовать утилиту Tlbimp.exe, но для использования компонентов Office этого делать не нужно. Все необходимые библиотеки уже устанавливаются вместе с продуктом. Нам достаточно только добавить нужную сборку в проект.
И добавить соответствующую строку using в ваш код
using Excel = Microsoft.Office.Interop.Excel;
В качестве источника данных для примера будем использовать список массивов строк ( List ). В коде я написал комментарии, которые, думаю, будут вполне понятно объяснять что происходит.
Ну и пара нюансов с которыми вы можете столкнуться. В случае, если в COM-компоненте происходит исключение, которое вы не обработаете, то, как и положено, весть домен приложения будет аварийно закрыт. Вместе с RCW. В результате чего, COM-объект так и останется висеть в памяти. То есть, вполне реально получить вот такую картинку:
И нюанс второй. Код сверху не совсем правильный. Дело в том, что работая с COM Interop нужно быть предельно внимательным и осторожным, потому, что случайно можно создать COM-объект, совершенно об этом не подозревая. В данном случае, создается даже не один «случайный» объект, а несколько.
Во-первых, в строке xlsWB = App.Workbooks.Add(missingValue); создается объект App.Workbooks, который не присваевается переменной и, соответственно, не освобожается дл тех пор, пока не выгрузится домен приложения.
Во-вторых, такая же проблема в строке в строке: xlsSheet = (Excel.Worksheet)xlsWB.Worksheets.get_Item(1);
Для того, чтобы эту проблему решить необходимо добавить две новые переменные и немного изменить код инициализации:
Excel.Application >20.11.2008, 09:39. Просмотров 4450. Ответов 3
Мне нужно из формы, пусть по нажатию кнопки запускать макрос в Excele
Поискал я и нашел следующий код
Excel.Application > app.ScreenUpdating = true;
app.Visible = true;
Excel.Workbook wb = app.Workbooks.Open(
«C:\Documents and Settings\DAntropov\Рабочий стол» +
«\Macros Alarm Current Tolerance for ЕТ42.1 _v03.xls»,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing);
Excel.Worksheet wSh = (Excel.Worksheet)wb.Worksheets[1];
app.Application.Run
(«C:\Documents and Settings\DAntropov\Рабочий стол» +
«\Macros Alarm Current Tolerance for ЕТ42.1 _v03.xls!Лист3.CommandButton1_Click»,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing);
Прикол в том что ApplicationClass не могу выбрать т.е. для Excel нет такого класса.
Я знаю что возможно нет ссылки нужной. в поиске находил что нужно добавить using Microsoft.Office.Interop.Excel; но так же using Microsoft->Office-> сюда тоже немогу дойти хз почему . Interop.Excel;
Вообщем в References там есть ссылка сразу на Excel в свойствах указана Interop.Excel.
Вообщем не знаю что делать. Хотя видел в некототорых кодых написано так Excel.Application app = new Application(); тут Application объекта Excelя есть, но вот он выдает ошибку т.к. это абстрактный класс.
Помогите пожалуйста кто чем сможет
Проблема с закрытием Word.ApplicationClass
vot u mena poyavilas udivitelnaya problema sozdayu WordApplicationClass .. vot .
ComboBox или как реализовать запись в него если нет такого значения
На данный момент делал так пока не начала вылазить не понятная ошибка в перечне Плотность хронятся.
Что делать, выводит нет такого ключа в словаре?
Нумерология Кнопочки Как и многие другие коротышки, малышка Кнопочка верит во всякие чудеса.
Microsoft office interop excel applicationclass
«A1» , «F1» ).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter
«A1» , «F1» ).Font.Bold = True
«A2» , «E999» ).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter
Dim rowCustomer As Abnos.Vista_disponibil >
For Each rowCustomer In Me .Abnos1.Vista_disponibil >
Dim iCurrRow As Int64 = ROW_FIRST + iRow
oSheet.Cells(iCurrRow, 1) = rowCustomer.SALIDA
oSheet.Cells(iCurrRow, 2) = rowCustomer.BARCO
oSheet.Cells(iCurrRow, 3) = rowCustomer.FECHA_SALIDA
oSheet.Cells(iCurrRow, 4) = rowCustomer.FECHA_LLEGADA
oSheet.Cells(iCurrRow, 5) = rowCustomer.LIBRES
oSheet.Cells(iCurrRow, 6) = rowCustomer.OBSERVACION
‘oSheet.Cells(iCurrRow, 1).VerticalAlignment = Excel.XlVAlign.xlVAlignCenter
In some computers work fine (90%), but in 2 (10%) shows me this error.
See the end of this message for details on invoking
just-in-time (JIT) debugging instead of this dialog box.
Im gonna answer myself hehe.
I changed this in the code and now works in all the computer =)
Dim oExcel As Excel.ApplicationClass —-> Dim oExcel As Excel.Application
Dim oBooks As Excel.Workbooks
Dim oBook As Excel.WorkbookClass ——> Dim oBook As Excel.Workbook
im oSheet As Excel.Worksheet
- Proposed as answer by surendra singh samant Thursday, August 27, 2009 4:13 AM
- Marked as answer by Martin_Xie Moderator Friday, October 22, 2010 4:43 AM
Hi,
I am trying the following and get this error:
Unable to cast COM object of type ‘System.__ComObject’ to interface type ‘Microsoft.Office.Interop.Excel.Worksheets’. This operation failed because the QueryInterface call on the COM component for the interface with IID ‘<000208B1-0000-0000-C000-000000000046>‘ failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).
‘ Microsoft SQL Server Integration Services Script Task
‘ Write scripts using Microsoft Visual Basic
‘ The ScriptMain class is the entry point of the Script Task.
Option Strict Off
Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Runtime
Imports System.IO
Imports System.Data.OleDb
Imports Microsoft.Office.Interop.Excel
Public Class ScriptMain
‘ The execution engine calls this method when the task executes.
‘ To access the object model, use the Dts object. Connections, variables, events,
‘ and logging features are available as static members of the Dts class.
‘ Before returning from this method, set the value of Dts.TaskResult to indicate success or failure.
‘
‘ To open Code and Text Editor Help, press F1.
‘ To open Object Browser, press Ctrl+Alt+J.
Public Sub Main()
‘
Dim Excel_Application As Microsoft.Office.Interop.Excel.Application
Dim Excel_WorkBook As Microsoft.Office.Interop.Excel.Workbook
Dim Excel_WorkSheet As Microsoft.Office.Interop.Excel.Worksheets
Dim iSheetCounter As Integer
Dim bFound As Boolean
Dim sFilename As String
Dim sSheetName As String
‘sFilename = Dts.Variables(«gv_ExcelFileLocation»).Value
‘sSheetName = Dts.Variables(«gv_SheetToDelete»).Value
sFilename = «\ctradingname.xls»
sSheetName = «Query»
‘Excel_Application = CreateObject(«Excel.Application»)
Excel_Application = New Microsoft.Office.Interop.Excel.Application
‘ Open the workbook specified
Excel_WorkBook = Excel_Application.Workbooks.Open(sFilename)
‘ Find out how many sheets are in the workbook as there must
‘ be at least 1 visible sheet so if we are about to delete the
‘ only valid sheet then abort
If iSheetCounter > 1 Then
‘ Now we need to make sure that the sheet to
‘ be deleted exists in the sheets available
For Each Excel_WorkSheet In Excel_WorkBook.WorkSheets
‘ Find the WorkSheet specified
If Excel_WorkSheet.Name = CStr(sSheetName) Then
Excel_WorkBook.Worksheets(sSheetName).Delete()
Excel_WorkBook.Save()
bFound = True
Exit For
End If
Next
Else
MsgBox(«There is only one sheet. Cannot delete it.»)
End If
If bFound = True Then
MsgBox(«Outcome = Sheet Deleted»)
Else
MsgBox(«Outcome = No Sheet Was deleted»)
End If
detector