Remkomplekty.ru

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

Microsoft office interop excel

Работа с 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.

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

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

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

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

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

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

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

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

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

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

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

Комментарии

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

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

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

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

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

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

.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);

Читать еще:  Как установить ключ gvlk office 2020

Для того, чтобы эту проблему решить необходимо добавить две новые переменные и немного изменить код инициализации:

Блог Виктора Деревянко

О жизни, о программировании. Все публикуемые исходные коды можно взять здесь

среда, 20 мая 2009 г.

Работа с Excel из C#.

Столкнулся с необходимостью поработать с файлами Excel из C#. Задачи простые — считать данные из книги Excel, создать новую книгу Excel, внести в нее данные. Предполагается, что Excel на компьютере имеется, но какой версии, не известно. Файлы по размерам маленькие, скорость работы не критична.

Существует несколько вариантов работы с Excel из C#: автоматизация Excel, подключение через OleDB/ODBC, дополнительные библиотеки (Aspose Excel), работа через XML, через Open XML и т.п.

Наиболее простой вариант — воспользоваться автоматизацией Excel. Да, скорость работы — не блеск. Зато удобно использовать, код пишется быстро, объемы кода не велики. Из .NET автоматизация подключается парой кликов мыши — добавил в References сборку Microsoft.Office.Interop.Excel — и работай с привычными com-объектами Application,Workbook, Worksheet и т.п.

Проблема одна — сборки «Microsoft.Office.Interop.Excel» для каждой версии Excel разные. У меня установлен office 2003 и, соответственно, interop-сборка версии 11. А что делать, если мне нужно разработать приложение, которое может работать с Excel 97? Или с любыми версиями Excel? Для того, чтобы считать или записать пару значений в ячейки листа Excel сложного api не требуется — любой Excel сгодится. А мне приходится привязываться к конкретной версии.

Можно воспользоваться поздним связыванием. Но если его использовать «в лоб», то ни о никаком удобстве работы речи уже не идет — код станет сложным, а вызовы методов — косвенными, нетипизированными. Ошибок будет — вагон.

Выход нашелся. На СodeProject обнаружил замечательную статью «SafeCOMWrapper — Managed Disposable Strongly Typed safe wrapper to late bound COM». В ней изложена элегантная методика использования позднего связывания, устраняющая все проблемы: связывание становится поздним (привязки к конкретной версии Excel нет), для объектов автоматизации автоматически реализуется шаблон IDisposable (отработанные объекты уничтожаются автоматически), все вызовы методов явные.

Идея реализации, вкратце, следующая. Для каждого COM-объекта автоматизации вы прописываете отдельный интерфейс. В интерфейс включаете все методы и свойства, которые вам необходимо использовать у этого COM-объекта. Обратите внимание — только те, которые необходимо использовать, а вовсе не все, реализуемые COM-объектом.

Каждый COM-объект автоматизации «заворачивается» в класс COMWrapper, унаследованный от RealProxy. RealProxy — это стандартный класс, позволяющий организовать перехват вызовов методов. При создании COM-объекта вы создаете экземпляр COMWrapper и указываете требуемый вам интерфейс. Среда динамически генерирует прокси-объект, реализующий этот интерфейс. С этим прокси-объектом вы в дальнейшем и работаете как с объектом автоматизации. Вызов любого метода прокси-объетка перехватывается и транслируется в вызов метода Invoke класса RealProxy, перекрытый в классе COMWrapper. Здесь его можно обработать как душе угодно. В реализации по умолчанию, вызовы свойств транслируются в вызовы соответствующих методов get_ и set_, создаваемых .NET, возвращаемые объекты автоматизации автоматически заворачиваются в COMWrapper и т.п.

В оригинально статье приведен пример использования данной методики для Microsoft.Outlook. Я, на базе приведенных исходных кодов, адаптировал методику для работы с Microsoft.Excel. Естественно, реализовав интерфейсы только для тех объектов автоматизации, которые потребовались мне для работы. Дополнить интерфейсы недостающими методами или добавить интерфейсы для других объектов автоматизации не составляет труда. Достаточно посмотреть через Object Browser метаданные сборки «Microsoft.Office.Interop.Excel» и скопировать оттуда необходимые объявления методов и интерфейсов (с минимальной адаптацией).

Пример кода для работы с Excel: Оригинальные исходные коды лежат на codeproject вместе со статьей. Исходные коды, адаптированные для Microsoft Excel, можно взять здесь.

  • Download source codes of Managed Excel project
  • View source codes of Managed Excel project
  • Short description in English

Update. Практика использования выявила небольшую проблему — забыть вызвать Dispose у оберток объектов Excel очень легко. После чего Excel висит в памяти до тех пор, пока не закроешь приложение (или до следующей сборки мусора). Пример: вместо
Просто надо быть внимательнее.

Microsoft Office Interop (Excel Automation) in C# and VB.NET

Microsoft Office Interop (Excel Automation) is an option when creating/reading Excel files (XLS, XLSX, CSV) from C# or VB.NET application, but it has many drawbacks.

Issues, when using Microsoft Office Interop (Excel Automation) from C# or VB.NET, are that:

  • It requires a license for Microsoft Office on every client machine.
  • It requires that all client machines have the same version of Microsoft Excel installed.
  • It works only on Windows operating systems.
  • When using Automation, Microsoft Excel is loaded in the background, taking a few MB and loading a large number of files and DLLs.
  • Microsoft Office applications (including Excel) were designed as UI applications and, because of that, API is very slow. Generating a single worksheet with 200 rows and 100 columns takes 239.4 seconds on our test machine.
  • Microsoft doesn’t recommend using Excel Automation (or any Office Interop) on the server, see Considerations for server-side Automation of Office.
Читать еще:  Чем заменить microsoft office

We are proud that our Excel .NET library is one of the best alternatives for Microsoft Office Interop (Excel Automation).

GemBox.Spreadsheet Free comes free of charge, while GemBox.Spreadsheet Professional is a commercial version that is licensed per developer. Find more information about supported features.

Better than Excel Automation

With Microsoft Office installed on most business desktops, it is tempting to use Microsoft Excel Interop. Look at the following table for good reasons not to do so:

Outperforming competition

When comparing and evaluating different XLSX, XLS, ODS, CSV reading and HTML, PDF and XPS reporting products, don’t forget the following considerations:

Plain and fair licensing

We don’t charge you additional server licenses. You can use our component for an unlimited number of projects (you don’t need to purchase additional «OEM licenses») and we don’t force you to purchase subscription packages.
Our licensing is very simple: every developer working with our component needs to be covered by developer license. We don’t care if it is a Windows or web application, how many servers you use, or if you have just one customer or millions of customers.

Performance

In the case of desktop application, you don’t want your user to wait 20 seconds for every single report. In the case of web application, you want your server to simultaneously support as many users as possible. Our test programs generate single XLS file with 200 rows and 200 columns of tabular data. Half of the values are strings and half are numbers, with 50% of cells having some cell style applied (font size and border). On our test machine the results are following:

  • GemBox.Spreadsheet takes 0.9 seconds.
  • Microsoft Excel automation takes 240 seconds (266 times slower).

Performance example is included in the GemBox.Spreadsheet Examples, so you are free to do the test yourself and see how our component performs with the tabular data that you require.

Clean and easy to use API

GemBox.Spreadsheet is a designed and developed to conform to Microsoft standards for .NET libraries. Caching also enables you to access the worksheet in a more natural way. For example, the same task of changing cell text orientation would be one line in GemBox.Spreadsheet:

and three lines in one of the competing products:

The latter is a hassle and forces you to think about Excel’s unique cell style limit. In other words, you will have to pay attention to not creating the same cell style again in a more complex worksheet.

Thread: [RESOLVED] Deploying Microsoft.Office.Interop. Excel version 15.0.0.0

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

[RESOLVED] Deploying Microsoft.Office.Interop. Excel version 15.0.0.0

Hello, I added a reference of Microsoft.Office.Interop.Excel version 15.0.0.0 to my project through NuGet. I want to know if my client has ms-office 2013 or 2010 can he still use my application?

I think my client shouldn’t has any problem because when you build your project there is no reference of Microsoft.Office.Interop.Excel in release folder and application uses the reference of Microsoft.Office.Interop.Excel which is already in client machine. Also my application don’t do anything special, it just read excel cells.

As much as I know putting a copy of Microsoft.Office.Interop.Excel in your release folder is useless and application looking for this reference in client machine.

I don’t think there would be any problem. I just wanted to be sure.
Thank you.

Re: Deploying Microsoft.Office.Interop.Excel version 15.0.0.0

At my company we have versions of Excel from 2000 to 2016.

The only way to be version independent is to not use a reference to excel in your project properties.

You have to convert all of your Excel referenced objects to undefined objects.

It is best to develop with your references first and make sure your app is bulletproof before converting to this type of connection as the first thing you lose when switching is intellisense on your excel objects.

Читать еще:  Microsoft office interop excel c скачать

You will have to replace all your excel constants with your own constants of the same value.

Burn the land and boil the sea
You can’t take the sky from me

Re: Deploying Microsoft.Office.Interop.Excel version 15.0.0.0

The only way to be version independent is to not use a reference to excel in your project properties.

You have to convert all of your Excel referenced objects to undefined objects.

It is best to develop with your references first and make sure your app is bulletproof before converting to this type of connection as the first thing you lose when switching is intellisense on your excel objects.

You will have to replace all your excel constants with your own constants of the same value.

Dude my project is c sharp, not vb.net.

Re: Deploying Microsoft.Office.Interop.Excel version 15.0.0.0

Sorry, didn’t see the forum area C# in your post.
In any case they ain’t that different

Will work with Excel without the interop reference.

YES the interop version is specific you do have to have that version on the client machines.
This is why I am showing you the way to connect with excel in a non-version specific way.

Burn the land and boil the sea
You can’t take the sky from me

Re: Deploying Microsoft.Office.Interop. Excel version 15.0.0.0

I see Microsoft.Office.Interop. Excel version 15.0.0.0 is necessary to do Office 2013 interop.
While Microsoft.Office.Interop. Excel version 14.0.0.0 is necessary to do Office 2010 interop.

If I use version 14.0.0.0 in my development machine my client with both Office 2010 or Office 2013 can use my application.

Thanks, I use older version.

Re: Deploying Microsoft.Office.Interop. Excel version 15.0.0.0

VB/Office Guru™ (AKA: Gangsta Yoda™ ® )
I dont answer coding questions via PM. Please post a thread in the appropriate forum.

Microsoft MVP 2006-2011
Office Development FAQ (C#, VB.NET, VB 6, VBA)
Senior Jedi Software Engineer MCP (VB 6 & .NET), BSEE, CET
If a post has helped you then Please Rate it!
• Reps & Rating Posts • VS.NET on Vista • Multiple .NET Framework Versions • Office Primary Interop Assemblies • VB/Office Guru™ Word SpellChecker™.NET • VB/Office Guru™ Word SpellChecker™ VB6 • VB.NET Attributes Ex. • Outlook Global Address List • API Viewer utility • .NET API Viewer Utility •
System: Intel i7 6850K, Geforce GTX1060, Samsung M.2 1 TB & SATA 500 GB, 32 GBs DDR4 3300 Quad Channel RAM, 2 Viewsonic 24″ LCDs, Windows 10, Office 2016, VS 2019, VB6 SP6

Re: Deploying Microsoft.Office.Interop. Excel version 15.0.0.0

Dear RobDog888,
I tested it before, while version 14.0.0.0 is necessary to do Office 2010 interop, my client with office 2013 still could use my application. I think if client install a newer version of Excel in hes machine he still can use application. I guess if application use a higher version of reference client cant use application unless he upgrade to specific or higher version. (Although I still hadn’t has chance to test this scenario)

As much as I know client SHOULD have Excel installed, there is no way to run this kind of applications without installing ms-excel on client machine.

I appreciate that you tell me «Its not good programming to assume or hard code references to specific versions on an application». I will try what Gruff shown me if I see my assumption was wrong.

Re: Deploying Microsoft.Office.Interop. Excel version 15.0.0.0

Well, today I was at my client place and I could test my application. It worked perfectly and now I can write a conclusion about it.

Ok here is my conclusion:
You should NOT use a newer version of a reference in your application if your application don’t need to use latest functionality that added to latest version of this library. Instead use older version. Only upgrade to newer version if you have to. If your client has higher version of this reference he still can use your application, but if you use a higher version and your client has installed an older version of this reference then your client may experience some exceptions.

Even create object wont help in all scenarios. Imagine you have used a functionality in your application that is available only in excel 2013 or above. If you use create object in your application and your client has excel 2010 can he still use your application with help of create object? Of course not. Then don’t use a higher version, unless you have to.

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