Remkomplekty.ru

IT Новости из мира ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

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 с помощью C# (Microsoft.Office.Interop.Excel)

Оставляю заметку по работе с Excel с помощью C#.

Привожу фрагменты кода, которые искал когда-то сам для работы с Excel документами.

Наработки очень пригодились в работе для формирования отчетности.

Прежде всего нужно подключить библиотеку Microsoft.Office.Interop.Excel.

Visual Studio здесь довольно старой версии. Если у вас версия новая, отличаться будет только вид окна.

Далее создаем псевдоним для работы с Excel:

using Excel = Microsoft.Office.Interop.Excel;

Расстановка рамок.

Расставляем рамки со всех сторон:

Цвет рамки можно установить так:

Выравнивания в диапазоне задаются так:

Формулы

Определим задачу: получить сумму диапазона ячеек A4:A10.

Для начала снова получим диапазон ячеек:

Excel.Range formulaRange = sheet.get_Range(sheet.Cells[4, 1], sheet.Cells[9, 1]);

Далее получим диапазон вида A4:A10 по адресу ячейки ( [4,1]; [9;1] ) описанному выше:

string adder = formulaRange.get_Address(1, 1, Excel.XlReferenceStyle.xlA1, Type.Missing, Type.Missing);

Теперь в переменной adder у нас хранится строковое значение диапазона ( [4,1]; [9;1] ), то есть A4:A10.

Выделение ячейки или диапазона ячеек

Так же можно выделить ячейку или диапазон, как если бы мы выделили их мышкой:

Авто ширина и авто высота

Чтобы настроить авто ширину и высоту для диапазона, используем такие команды:

Получаем значения из ячеек

Чтобы получить значение из ячейки, используем такой код:

Добавляем лист в рабочую книгу

Чтобы добавить лист и дать ему заголовок, используем следующее:

Читать еще:  Strokescribe office add in

Добавление разрыва страницы

Сохраняем документ

Как открыть существующий документ Excel

Комментарии

При работе с Excel с помощью C# большую помощь может оказать редактор Visual Basic, встроенный в Excel.

Для этого в настройках ленты надо добавить пункт «Разработчик». Далее начинаем запись макроса, производим действия и останавливаем запись.

Далее заходим в редактор Visual Basic и смотрим код, который туда записался:

В данном макросе записаны все действия, которые мы выполнили во время его записи. Эти методы и свойства можно использовать в C# коде.

Данный метод так же может оказать помощь в формировании относительных формул, например, выполнить сложение чисел, находящиеся слева от текущей ячейки на 4 столбца, и т.п. Пример:

Так же во время работы может возникнуть ошибка: метод завершен неверно. Это может означать, что не выбран лист, с которым идет работа.

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_disponibilidadRow

For Each rowCustomer In Me .Abnos1.Vista_disponibilidad

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

Microsoft office interop excel applicationclass

«A1» , «F1» ).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter

«A1» , «F1» ).Font.Bold = True

Читать еще:  Office online video

«A2» , «E999» ).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter

Dim rowCustomer As Abnos.Vista_disponibilidadRow

For Each rowCustomer In Me .Abnos1.Vista_disponibilidad

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

Thread: [RESOLVED] Unable to cast COM object of type ‘Microsoft.Office.Interop.Excel.ApplicationClass’

Thread Tools
Display
  • Linear Mode
  • Switch to Hybrid Mode
  • Switch to Threaded Mode

[RESOLVED] Unable to cast COM object of type ‘Microsoft.Office.Interop.Excel.ApplicationClass’

I have a VB.Net application that was built on a Windows 7 machine running Office 2010. The application has been working for several years without any problems.

I recently upgraded to a Windows 10 machine running Office 2016. I’ve corrected the application’s project references to point to the Office 2016 references (Access, Excel, etc.). The project compiles without errors.

When I run the application and use its Excel automation function to create a chart, I get the following runtime error:

Here is a snippet of my code’s relevant lines (the error is raised at the «xlApp.Workbooks.Add» statement).

Here are the application’s project references:

What is wrong and how can I fix it? I’d appreciate any help someone can provide. Thanks.

Re: Unable to cast COM object of type ‘Microsoft.Office.Interop.Excel.ApplicationClas

First suggestion: Exit VS and delete the bin and obj folders from your project. Open VS and your project and perform a build. The bin and obj folders will be recreated.

Читать еще:  Kmsauto не активирует office 2020

Second suggestion: Use the following code pattern to create an office application. It is the App.ApplicationClass guid that changes between versions, but the underlying App._Application interface guid remains the same.

Re: Unable to cast COM object of type ‘Microsoft.Office.Interop.Excel.ApplicationClas

Thanks for the quick reply TnTinMN.

I followed your first suggestion. When I built the project I get the following warnings:

I also followed your second suggestion but I still get the above runtime error («Unable to cast COM object of type. «).

Since I’m running VS2010 with Office 2016 Pro, and I don’t remember which order I installed these 2 programs I thought that maybe the problem is that I installed VS2010 after installing Office 2016. Since I can’t remember which one I installed first, I also re-installed Office 2016 Pro (hoping that that might clear up the above 2 errors. Unfortunately I’m still getting these 2 errors («Cannot determine the dependencies of the COM reference. «) when I build the project.

Re: Unable to cast COM object of type ‘Microsoft.Office.Interop.Excel.ApplicationClas

You do you have the references to the Office PIA’s configured? Are you embedding them in the assembly (the default), copying them to the output directory or relying on them being in the GAC? Make sure each Office PIA assembly is configured in the same way.

Example of embedded.

Re: Unable to cast COM object of type ‘Microsoft.Office.Interop.Excel.ApplicationClas

I am using the default choices.

I have a couple of PCs in the house, all are Win10Pro and Office 2016 setups. The PC that is discussed to this point of this thread is my desktop machine. I copied the application’s .exe file from my desktop PC to my laptop PC and it runs without any problems on the laptop, including the function that creates the Excel chart.

I’m scratching my head as to why this application works on one PC but not the other PC when both are Win10Pro/Office 2016 setups. It’s frustrating to have the exact same application work on some but not all of my PCs and not to understand how to fix this situation.

Appreciate all your time and assistance to this point. What would you do next if you were me?

Re: Unable to cast COM object of type ‘Microsoft.Office.Interop.Excel.ApplicationClas

I’m getting the feeling that the COM registration of the Office applications is messed up on the subject computer.

Did you select the Office assembly references from the .Net Assembly tab or from the COM References tab.? Do they show up under the COM references tab?

Can you get a new project to open Excel?

Re: Unable to cast COM object of type ‘Microsoft.Office.Interop.Excel.ApplicationClas

I’ve tried setting the project reference for Office (Excel and Access) via the .COM and .NET tabs and neither has been successful (same errors in both cases).

I found a simple VB.Net example of Excel automation on the web and copied it into a new VS2010 project, but still get the same errors.

I’ve been searching the web for information on Office 2016 PIAs and came across this one:

Do PIAs exist for Office 2016, or only through Office 2013?

Re: Unable to cast COM object of type ‘Microsoft.Office.Interop.Excel.ApplicationClas

I’ve unstalled and reinstalled VS2010 on my desktop PC and I still get the error when I try to create an Excel chart.

I’ve copied the entire folder that contains this project (bin, Classes, DataSets, Forms, Modules, etc.) to my laptop PC and it compiles and runs successfully, including the ability to create an Excel chart. So there must be something specific to my desktop PC that is causing the problem.

Here are the properties of my Microsoft.Office.Interop.Access and Microsoft.Office.Interop.Excel .COM references:

If there is anything else I can provide to help troubleshoot this problem, please let me know.

Thanks again for any advice/suggestions regarding this issue.

Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector
×
×