C создать файл excel
@Mike The "without requiring Excel to be installed" piece has nothing to do with being professional. It's about dependencies. The original text of the question was worded as: "Ideally, I would like open source so I don't have to add any third party dependencies to my code, and I would like to avoid using Excel directly to create the file (using OLE Automation.)" It's unfortunate the question was drastically simplified.
Assuming you were trying to do something sans library or external code, I can't speak for xls file, but for xlsx files, why not start by taking an existing one, renaming it to a zip file and exploring the contents? A little bit of reverse engineering will tell you quite a bit. There are several different xml files and rels files in the various folders and subfolders. Try exploring that and see if it's something you can replicate or see if you can find documentation on the various xml namespaces/schemas.
46 Answers 46
You can use a library called ExcelLibrary. It's a free, open source library posted on Google Code:
This looks to be a port of the PHP ExcelWriter that you mentioned above. It will not write to the new .xlsx format yet, but they are working on adding that functionality in.
It's very simple, small and easy to use. Plus it has a DataSetHelper that lets you use DataSets and DataTables to easily work with Excel data.
ExcelLibrary seems to still only work for the older Excel format (.xls files), but may be adding support in the future for newer 2007/2010 formats.
You can also use EPPlus, which works only for Excel 2007/2010 format files (.xlsx files). There's also NPOI which works with both.
There are a few known bugs with each library as noted in the comments. In all, EPPlus seems to be the best choice as time goes on. It seems to be more actively updated and documented as well.
Also, as noted by @АртёмЦарионов below, EPPlus has support for Pivot Tables and ExcelLibrary may have some support (Pivot table issue in ExcelLibrary)
Here some example code for ExcelLibrary:
Here is an example taking data from a database and creating a workbook from it. Note that the ExcelLibrary code is the single line at the bottom:
Creating the Excel file is as easy as that. You can also manually create Excel files, but the above functionality is what really impressed me.
It should be noted that ExcelLibrary has a lot of performance issues when dealing with large datasets(larger than 5000 rows with lots of columns). Currently doing a heavy modification of the code base at work so we can use it in a project.
I tried ExcelLibrary, all it could do was produce a 'corrupted file', nothing fancy just 3 columns, small file. Excel 2016 wouldn't open. Tried the automatic file generation rom DataTable.
If you are happy with the xlsx format, try my library, EPPlus. It started with the source from ExcelPackage, but since became a total rewrite.
It supports ranges, cell styling, charts, shapes, pictures, named ranges, AutoFilter, and a lot of other stuff.
You have two options:
EPPlus 4, licensed under LGPL (original branch, developed until 2020)
EPPlus 5, licensed under Polyform Noncommercial 1.0.0 (since 2020).
From the EPPlus 5 readme.md:
With the new license EPPlus is still free to use in some cases, but will require a commercial license to be used in a commercial business.
The examples were helpful. I was able to change my code from using Microsoft interop library (horribly slow) to this library (version 4.x) in a couple hours. My benchmark writes a file with two tabs and about 750,000 cells. Using MS interop it took 13 minutes. Using EPPlus it took 10 seconds, a roughly 80x speedup. Very happy!
@JanKällman You should update your CodePlex page to show you've got these methods available: LoadFromCollection
For clarity in this thread, the LGPL allows the software to be linked to without the infective part of the GPL occuring. You only need to open source changes you make to ClosedXml or if you directly put the source code (as opposed to referencing the ClosedXml assemblies) inside of your application then you need to open source your application.
@Paul Chernoch: We populate large Excel sheets with interop very quickly. The secret is to do a bulk update. Create a object [,] block, populate that, then write that matrix to Excel at one time: excelWorksheet.get_Range(range).Value2 = block;
And what about using Open XML SDK 2.0 for Microsoft Office?
Important to note that the DLL for this is just over 5 MB and limited to Office 2007 formats. But certainly the easiest and fastest solution which works for me.
The SDK models the XML into classes, so that each XML tag is mapped to a tag, and then you have to build the class hierarchy (each instance has a collection of child instances/tags) correctly. This means you have to know the XML structure of an Excel file, which is very complicated. It's much easier to use a wrapper such as EPPlus, mentioned above, which simplifies things.
I found Microsoft Open XML SDK's Open XML Writer to be great. Using the solutions above, (Especially Vincent Tom's sample (Poly Math)), it's easy to build a writer that streams through big sets of data, and writes records in a manner similiar and not too much more complex to what you'd do for CSV; but that you're instead writing xml. Open XML is the mindset that Microsoft considers it's new Office formats in. And you can always rename them from .xslx to .zip files if you feel like poking at their XML contents.
I've used with success the following open source projects:
ExcelPackage for OOXML formats (Office 2007)
NPOI for .XLS format (Office 2003). NPOI 2.0 (Beta) also supports XLSX.
Take a look at my blog posts:
A note on NPOI - Row and Column references are zero-based. Does work well for populating an existing template.
You can use OLEDB to create and manipulate Excel files. Check this: Reading and Writing Excel using OLEDB.
EDIT - Some more links:
Can someone confirm if this works when running in x64? I am pretty sure Jet only works if your app is compiled or running in 32-bit mode.
Be very careful with this -- it's a big ugly cludge (for example, sometimes it guesses a column type and discards all the data that does not fit).
One should be very careful if using this method. I've found it very flaky for data that isn't in a perfect format.
As a person who had to use OleDb in a big project, I say STAY AWAY FROM IT! It sometimes is not able to retrieve a cell value just because it couldn't understand the format. It doesn't have a delete operation. It works totally different and unpredictable even with a slightest provider change. I'd say go for a proven commercial solution.
Disclaimer: I own SpreadsheetGear LLC
You have a great product but I think a lot of people here are expecting free solutions. That might explain the down votes.
A few options I have used:
If XLSX is a must: ExcelPackage is a good start but died off when the developer quit working on it. ExML picked up from there and added a few features. ExML isn't a bad option, I'm still using it in a couple of production websites.
Be careful with ExcelPackage if you need to support XLS. I had a hard time with it and eventually switched to ExcelLibrary.
An extremely lightweight option may be to use HTML tables. Just create head, body, and table tags in a file, and save it as a file with an .xls extension. There are Microsoft specific attributes that you can use to style the output, including formulas.
I realize that you may not be coding this in a web application, but here is an example of the composition of an Excel file via an HTML table. This technique could be used if you were coding a console app, desktop app, or service.
It's so ad hoc but it works (not to mention excel issuing a warning on opening) and is so simple, it deserves to have a place as a solution. Though only for showing that you can export an excel file :))
Some people at my organization can't open excel files made this way in Office 2010 and above. Don't know what the problem is, but I had to roll my own OpenXML implementation. (see Sogger's answer)
Watch out for security warnings appearing to your user if you do this: "Warning, the content of the file doesn't match the extension". Particularly alarming when you're doing a download from your bank. I wouldn't rcommend pursuing the approach mentioned in this answer
I tried using this in a project that builds pretty large Excel sheets. Excellent library, but extremely poor in performance. I just did a comparison for the project I'm working on: ClosedXML (v 0.53.3) took 92,489 ms whereas EPPlus (v 2.9.03, for testing - we can't use because it's GPL) took 16,500 ms.
I appreciate that ClosedXML is open source (MIT). At the time I wrote this the LGPL licensed EPPlus project on GitHub is archived and its last release was in January 2019.
You might be impressed if you haven't tried them.
Please be warned of Microsoft's stance on this:
@Ricky B: Also, in my experience with the interop is that it does use excel. Every time we used it, if Excel wasn't installed on the machine, we would get COM exceptions.
With the OLE, even with very careful disposals, it eventually leaks memory or crashes. This is argueably OK for attended applications/ workstations, but for servers is not recommended (MS has a KB stating this). For our server, we just reboot it nightly. Again, that works OK.
I'm coming to this discussion after struggling more than a week on interop, and unless your needs are very simple, this is not gonna work. The support for formatting your spreadsheet is abysmal, which is arguably the reason for generating an .xls file and not just a flat .csv file. For example, have you tried outputting more than 911 characters in a cell, or have you tried setting the width of merged cells in a consistent manner? I have, and I can't tell you how much I hate this crap now. Do yourself a favor and go with one of the free libraries mentioned on this discussion.
Full source code is provided - free of charge - along with instructions, and a demo application.
After adding this class to your application, you can export your DataSet to Excel in just one line of code:
It doesn't get much simpler than that.
And it doesn't even require Excel to be present on your server.
That's partly true: The completely free version will generate a perfect .xlsx file for you, and all source code is provided. If you donate $10 or more to one of those two charities (of which I receive absolutely nothing), then you get a "better" version showing how to do formatting, dates, etc. Given the cost of third-party products, I reckon donating $10 to a good cause instead is well worth it !
You could consider creating your files using the XML Spreadsheet 2003 format. This is a simple XML format using a well documented schema.
You may want to take a look at GemBox.Spreadsheet.
They have a free version with all features but limited to 150 rows per sheet and 5 sheets per workbook, if that falls within your needs.
I haven't had need to use it myself yet, but does look interesting.
Syncfusion Essential XlsIO can do this. It has no dependency on Microsoft office and also has specific support for different platforms.
The whole suite of controls is available for free through the community license program if you qualify (less than 1 million USD in revenue). Note: I work for Syncfusion.
you can also use a third party library like Aspose.
This library has the benefit that it does not require Excel to be installed on your machine which would be ideal in your case.
Yes you can, if you don't mind paying a minimum license fee of $999. Try the MikesKnowledgeBase library. which is $999 cheaper than this !!
The various Office 2003 XML libraries avaliable work pretty well for smaller excel files. However, I find the sheer size of a large workbook saved in the XML format to be a problem. For example, a workbook I work with that would be 40MB in the new (and admittedly more tightly packed) XLSX format becomes a 360MB XML file.
Neither are cheap (500USD and 800USD respectively, I think). but both work independant of Excel itself.
I have written a simple code to export dataset to excel without using excel object by using System.IO.StreamWriter.
Below is the code which will read all tables from dataset and write them to sheets one by one. I took help from this article.
Like the article says though, that's XML that Excel will read rather than actually being an XLS file, which means that it might only work in Excel and not other programs that read spreadsheets. But it's probably better than the equivalent HTML table answers here!
The type it's Open XML but you can only write a .xls file and works perfectly. Take care with the blank spaces in the tags. Use my code refactored below.
OpenXML is also a good alternative that helps avoid installing MS Excel on Server.The Open XML SDK 2.0 provided by Microsoft simplifies the task of manipulating Open XML packages and the underlying Open XML schema elements within a package. The Open XML Application Programming Interface (API) encapsulates many common tasks that developers perform on Open XML packages.
It is a commercial product, but you get the full source if you buy it. So I suppose you could compile it into your assembly if you really wanted to. Otherwise it's just one extra assembly to xcopy - no configuration or installation or anything like that.
(Disclaimer: I work for SoftArtisans, the company that makes OfficeWriter)
Hi this solution is to export your grid view to your excel file it might help you out
No, this generates HTML marked as an Excel file rather than a true Excel file. Yes, Excel itself will open that OK but other programs that consume spreadsheets - including Microsoft's free Excel viewer, for example - won't accept it. You'd do better to create a real Excel file using one of the libraries here.
GridViewExportUtil only for Web. And for Windows Forms, WPF, Console, Service Windows, Unit Test or Addin ?
Or, you could use the Interop .
Here's a way to do it with LINQ to XML, complete with sample code:
It's a little complex, since you have to import namespaces and so forth, but it does let you avoid any external dependencies.
Some 3rd party component vendors like Infragistics or Syncfusion provide very good Excel export capabilities that do not require Microsoft Excel to be installed.
Since these vendors also provide advanced UI grid components, these components are particularly handy if you want the style and layout of an excel export to mimic the current state of a grid in the user interface of your application.
If your export is intended to be executed server side with emphasis on the data to be exported and with no link to the UI, then I would go for one of the free open source options (e.g. ExcelLibrary).
I have previously been involved with projects that attempted to use server side automation on the Microsoft Office suite. Based on this experience I would strongly recommend against that approach.
where sample look like this:
An overview of the process involved is:
I have developed a simple WPF app on github which will run on Windows for this purpose. There is a placeholder class called GeneratedClass where you can paste the generated code. If you go back one version of the file, it will generate an excel file like this:
В современном мире разработки приложений нередко встает необходимость работы с Excel документами. Чаще всего это разного рода отчеты, но иногда xls/x файлы используются в качестве хранилища данных. Например, если пользователь должен иметь возможность загрузить данные в приложение или выгрузить, в человеко-читаемом виде, Excel де-факто является стандартом. Относительно дружелюбный интерфейс, прозрачная структура, в купе с его распространенностью. трудно навскидку назвать решение лучше.
Историческая справка
Времена, когда доминировал проприетарный формат .xls(Excel Binary File Format) давно прошли и сейчас мы имеем только .xlsx(Excel Workbook), в рамках Office Open XML. Последний представляет собой обычный .zip архив с XML файлами. Не будем углубляться в его структуру, я искренне надеюсь что вам это никогда не понадобится.
На github, и не только, можно найти ряд библиотек, бесплатных и не только. Пожалуй самой популярной является EPPlus. До определенной степени, она довольно хорошо отражает концепцию Excel, именно по этому я всегда использую EPPlus. Версия 4 полностью бесплатна, начиная с 5‐й версии вам потребуется приобрести лицензию для коммерческого использования.
Задача
Итак, предположим, продукт-мэнеджеру ударила в голову идея того, что возможность выгружать некий отчет в формате Excel увеличит кол-во пользователей на 100500%. Проджет-менеджер решает выкатить эту киллер-фичу как хотфикс прямо сегодня — ведь работы всего на пару часов.
Сам по себе, отчет содержит краткое описание компании и историю изменения некоторых экономических показателей. Для простоты все свойства компании — строки. Экономические показатели — большие целые числа и числа с плавающей точкой, а также даты. Предположим, что где-то в недрах микросервисного backend-да есть сервис-генератор подобных отчетов, например по id компании. Однако, поскольку id нет смысла выводить пользователю, идентификатор отсутствует в самой модели отчета.
Аналитик, в свою очередь, выдает задачу с феноменально точным описанием - "Сгенерировать excel отчет на базе данных MarketReport". Что ж, для нашего примера, создадим заглушку — генератор фейковых данных:
Первый запуск
Подключим EPPlus версии 4.5.3.3 и создадим базовую обвязку для будущего генератора.
Сердцем генератора будет метод Generate. ExcelPackage это модель документа, через которую мы и будем осуществлять все взаимодействия с ним. Также имеется конструктор для передачи пути к файлу или потока.
В методе main создается генератор отчетов, а также генератор Excel файлов. Далее полученный файл просто записывается на диск.
При попытке запустить приложение, получаем exception: InvalidOperationException: The workbook must contain at least one worksheet
Все правильно, Excel документ не может существовать без страниц, должна быть хотя бы одна. Добавляем ее, все интуитивно понятно:
Запускаем снова и. вот оно! Теперь наше приложение генерирует документ и, хотя там еще ничего нет, он уже весит 2,5KB - значит мы работаем с Excel правильно и все идет как надо.
Вывод данных
Давайте выведем основную информацию по компании в шапку. Для доступа к конкретной ячейки объект Cells на странице пакета снабжен удобным индексатором. При этом, до конкретной ячейки можно достучаться как через номер строки и столбца, так и по привычному всем буквенно-числовому коду:
Полный код вывода шапки.
Для вывода исторических данных понадобится как минимум шапка таблицы и цикл по массиву History:
Предлагаю обратить внимание на метод LoadFromArrays, который заполняет диапазон ячеек рваным(зубчатым) массивом. Здесь мы можем видеть, что типизация теряется и передавая массив object мы ожидаем что EPPlus в конечном итоге использует ToString, чтобы записать переданное в ячейки.
Стилизация
Если вы прямо сейчас откроете документ, то вы возможно увидите не то, что хотелось бы отдать в продакшн в пятницу вечером.
Как это выглядит
Во-первых, шапка никак не выделяется, во-вторых таблица не имеет границ. выравнивание пляшет, даты отображаются магическими числами, а капитализация "уходит в какую-то математику" - как это прокомментировал аналитик.
Да, на все эти красивости у нас уйдет больше года кода, чем на сам вывод данных, и, в конечном тоге, получившаяся каша из логики вывода данных и разметки заставит некоторых усомниться в их компетентности. но, мы же backend разработчики, так давайте сверстаем Excel Sheet!
Размер ячеек
Из коробки у нас есть возможность сделать автофит а так же вручную выставить ширину в соответствии с нашей ситуацией. А ситуация у нас не самая хорошая — по задумке аналитика в шапке у ячеек должен быть автофит, а у ячеек таблицы — тоже автофит. Так в чем же подвох?
Если вы когда-нибудь до этого открывали Excel, то возможно знаете, что ширина ячеек не может отличаться в рамках столбца и автофит будет по самому широкому контенту ячейки. Однако, простые вещи бывает нетак то просто объяснить. Но если вы справитесь, то вот как это будет выглядеть в коде:
Формат данных
Как и большая часть стиля ячейки, он задается через одноименное свойство Style. Обратите внимание на вычисление 3-го аргумента индексатора. Это звоночек некачественного кода, но к этому мы вернемся в позже.
Выравнивание
Его можно задать как на ячейке, так и на диапазоне. На самом деле, для EPPlus, это одна и та же сущность — некий ExcelRange, описывающий диапазон ячеек, в том числе и со всего 1 ячейкой.
Стиль текста
Также легко задается, используя Style.Font, кстати, здесь, на 2-й строчке, мы впервые указываем диапазон так, как привыкли его видеть пользователи Excel:
Границы
Задаем стиль линии, а также ее толщину. К этому моменту от кол-ва магических чисел-параметров индексатора уже рябит в глазах, но мы уже на финишной прямой. не так ли?
График
"Ну что за отчет без графиков, верно, Карл?" - ловко подметит специалист по тестированию, и не важно, что этого не было в ТЗ а на часах уже половина 9-го.
Хотя график как сущность сам по себе сложнее таблиц и с графиками мы не работаем каждый день, EPPlus предоставляет довольно понятный API. Давайте добавим простейший график, отражающий рост капитализации:
Еще, может понадобиться защитить страницу от редактирования:
На этом все, репозиторий с рабочим приложением находится здесь.
Заключение
Во-первых, прежде всего, о том, что мы успешно справились с задачей, а именно, сгенерировали свой первый Excel отчет, поработали со стилями и даже решили пару попутных проблем.
Решил написать статью, о том, как сделать выгрузку данных в Excel файл по шаблону и считывать данные из Excel.
Началось всё с того, что на работе, дали указание, уйти от MS Office, на бесплатные аналоги.
У нас уже была система выгрузки, основанная на библиотеке “Microsoft.Office. Interop.Excel” и много готовых шаблонов, для выгрузки тех или иных отчётов.
Поэтому надо было найти бесплатную библиотеку, работающую с офисом. И сделать так, чтоб выгрузка работала по той же системе, что и раньше. Ибо переделывать все шаблоны и структуру, не хотелось.
Вот я и наткнулся на OpenXML. И думал, сейчас по быстрому найду решение в интернете и всё готово (т.к. на это было выделено мало времени). Но подходящего решения так и не нашёл, поэтому и решил написать эту статью, для тех у кого будет, такая же проблема.
Саму библиотеку, можно скачать бесплатно с сайта Micrisoft (я использовал в проекте OpenXML sdk 2.5 “ OpenXMLSDKV25.msi ”)
здесь.
После скачивания “OpenXMLSDKV25.msi ”, устанавливаем и заходим в папку
“C:\Program Files\Open XML SDK\V2.5\lib” там лежит библиотека, которая нам понадобится, мы её подключим к проекту (ниже будет описано, как).
Проект был написан на Visual Studio 2010 (Framework 4.0).
Ниже пример шаблона (сделан для теста) “C:\Templates\template.xlsx”.
И пример выгруженных данных (как это будет выглядеть в итоге, после выгрузки).
Ключевые слова:
DataField: — Означает, что на этом месте будут выведены наши банные из DataTable.
DataField:[название выводимого поля]
Label: — Означает, что на этом месте будут выводиться данные, которые надо вставить однократно из словаря
Label:[название ключа в словаре]
А это файл из которого мы будем считывать данные “C:\Loading\ReadMePlease.xlsx”.
Теперь создадим в VS2010, Решение в котором будет 4 проекта:
1) OpenXmlPrj – это консольный проект, для запуска теста.
2) Interfaces – это проект типа “Библиотека классов”, будет хранить наши интерфейсы данных для выгрузки.
3) Framework — это проект типа “Библиотека классов”, тут и будет происходить вся работа с Excel-ем.
4) Converter — это проект типа “Библиотека классов”, для конвертирования наших данных в DataTable (т.к. работа происходит с DataTable).
Теперь в проекте “Framework” создаём две папки и подключим ссылку на библиотеку OpenXML и WindowsBase:
“Create” – для работы с выгрузкой данных.
“Load” – для работы с загрузкой данных.
“lib” – в папку, добавим библиотеку OpenXML.
В папке “Create” создаём 4 класса.
1) Worker – это будет наш главный обработчик.
4) Field – будет содержать индекс строки, где находится DataField, координаты ячеек с DataField и название поля, значение которого надо вывести.
В проекте “Converter” создадим класс
ConvertToDataTable – для конвертирования наших данных в DataTable.
И проекте “OpenXmlPrj” надо подключить ссылки на следующие проекты: Interfaces, Framework, Converter
Условия для создания шаблона:
1. Excel лист, обязательно должен называться “Лист1” (ну или если захотите переименовать, то в коде надо будет изменить название тоже).
2. Названия после DataField: должны строго совпадать с названиями колонок в DataTable.
3. Шаблон должен быть сохранён в формате “.xlsx”.
Условия для файла, с которого мы будем считывать данные:
1. Excel лист, обязательно должен называться “Лист1” (ну или если захотите переименовать, то в коде надо будет изменить название тоже).
2. Первая строка, должна содержать названия колонок, по которым мы потом будем парсить данные.
Оба языка поддерживают внедрение сведений о типах, что позволяет развертывать сборки, взаимодействующие с компонентами COM, без предварительного развертывания на компьютере основных сборок взаимодействия (PIA). Дополнительные сведения см. в разделе Пошаговое руководство: внедрению типов из управляемых сборок.
В данном пошаговом руководстве эти возможности показаны в контексте программирования для Microsoft Office, но многие из них могут оказаться полезными и в других ситуациях. В этом пошаговом руководстве вы создадите книгу Excel с помощью надстройки Excel, а затем документ Word со ссылкой на эту книгу. Наконец, вы узнаете, как включать и отключать зависимость PIA.
Предварительные требования
Для выполнения данного пошагового руководства на компьютере должны быть установлены Microsoft Office Excel и Microsoft Office Word.
Отображаемые на компьютере имена или расположения некоторых элементов пользовательского интерфейса Visual Studio могут отличаться от указанных в следующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Персонализация среды IDE.
Настройка надстройки Excel
Запустите Visual Studio.
В меню Файл выберите пункт Создать, а затем команду Проект.
в области шаблоны выберите Excel надстройка версии .
Если нужно, в поле Имя введите имя проекта.
В обозревателе решений появится новый проект.
Добавление ссылок
В обозревателе решений щелкните имя проекта правой кнопкой мыши и выберите пункт Добавить ссылку. Откроется диалоговое окно Добавление ссылки.
На вкладке сборки выберите Microsoft. Office. Com. Excel, версия (для получения ключа по номерам версий продуктов Office, см. статью версии Microsoft), в списке имя компонента , а затем нажмите и удерживайте клавишу CTRL и выберите Microsoft. Office. Interop. Word, . Если сборки отсутствуют, может потребоваться проверить, что они установлены и отображаются (см. раздел Практическое руководство. Установка основных сборок взаимодействия Microsoft Office).
Добавление необходимых операторов Imports или директив using
В обозревателе решений щелкните правой кнопкой мыши файл ThisAddIn.vb или ThisAddIn.cs и выберите в контекстном меню команду Просмотреть код.
В верхнюю часть файла с кодом добавьте следующие операторы Imports (Visual Basic) или директивы using , если это еще не сделано.
Создание списка банковских счетов
Замените определение класса Account следующим кодом. В определениях классов используются автоматически реализуемые свойства. Дополнительные сведения см. в разделе Автоматически реализуемые свойства.
Чтобы создать bankAccounts список, содержащий две учетные записи, добавьте следующий код ThisAddIn_Startup в метод в bankAccounts или ThisAddIn_Startup . В объявлениях списков используются инициализаторы коллекций. Дополнительные сведения см. в разделе Инициализаторы коллекций.
Экспорт данных в Excel
В том же самом файле добавьте в класс ThisAddIn следующий метод. Этот метод служит для настройки книги Excel и экспорта данных в нее.
В более ранних версиях этого языка приходилось использовать особый синтаксис.
Разработчики не могут создавать собственные индексированные свойства. Эта возможность поддерживает только использование имеющихся индексированных свойств.
Добавьте в конец метода DisplayInExcel следующий код, чтобы ширина столбца изменялась в соответствии с содержимым.
например, excelApp.Columns[1] возвращает Object , а AutoFit — метод Excel excelApp.Columns[1] . Без типа dynamic необходимо выполнять приведение объекта, возвращаемого excelApp.Columns[1] , к экземпляру Range перед вызовом метода AutoFit .
Дополнительные сведения о внедрении типов взаимодействия см. в подразделах "Поиск ссылки PIA" и "Восстановление зависимости PIA" далее в этом разделе. Дополнительные сведения о dynamic см. в разделе dynamic или Динамическое использование типа Dynamic.
Вызов метода DisplayInExcel
Добавьте следующий код в конец метода ThisAddIn_StartUp . Вызов метода DisplayInExcel содержит два аргумента. Первый аргумент представляет собой имя списка счетов, которые требуется обработать. Второй аргумент — это состоящее из нескольких строк лямбда-выражение, которое определяет, каким образом следует обрабатывать данные. Значения ID и balance для каждого из счетов отображаются в соседних ячейках, а если баланс имеет отрицательное значение, строка отображается красным. Дополнительные сведения см. в разделе Лямбда-выражения.
Чтобы запустить программу, нажмите клавишу F5. Появится книга Excel, содержащая данные о счетах.
Добавление документа Word
Добавьте в конец метода ThisAddIn_StartUp следующий код, чтобы создать документ Word, содержащий ссылку на книгу Excel.
Запуск приложения
- Нажмите клавишу F5 для запуска приложения. Будет запущено приложение Excel, в котором будет открыта таблица, содержащая сведения о двух счетах из списка bankAccounts . Затем будет открыт документ Word, содержащий ссылку на таблицу Excel.
Очистка готового проекта
- В Visual Studio в меню Построение выберите пункт Очистить решение. В противном случае надстройка будет запускаться при каждом открытии Excel на компьютере разработчика.
Поиск ссылки PIA
Запустите приложение снова, но не выбирайте пункт Очистить решение.
Выберите кнопку Пуск. перейдите на Microsoft Visual Studio версию > и откройте командную строку разработчика.
В окне командной строки разработчика для Visual Studio введите команду ildasm , а затем нажмите клавишу ВВОД. Появится окно программы IL DASM.
В меню файл в окне IL DASM выберите файл Открыть. дважды щелкните Visual Studio версия >, а затем дважды щелкните >. Откройте папку проекта и найдите в папке bin/Debug файл имя_проекта.dll. Дважды щелкните файл имя_проекта.dll. В новом окне будут показаны атрибуты проекта, а также ссылки на другие модули и сборки. Обратите внимание, что в сборку включены пространства имен Microsoft.Office.Interop.Excel и Microsoft.Office.Interop.Word . По умолчанию в Visual Studio компилятор импортирует в сборку необходимые типы из сборки PIA, на которую указывает ссылка.
Дважды щелкните значок МАНИФЕСТ. Откроется окно со списком сборок, содержащих элементы, на которые имеются ссылки в проекте. Сборки Microsoft.Office.Interop.Excel и Microsoft.Office.Interop.Word не будут указаны в этом списке. Поскольку необходимые для проекта типы были импортированы в сборку проекта, ссылки на сборки PIA не требуется. Это упрощает развертывание. Сборки PIA не обязательно должны присутствовать на компьютере пользователя, а поскольку приложение не требует развертывания конкретной версии сборки PIA, можно разрабатывать приложения, которые работают с различными версиями Office, если в этих версиях имеются все необходимые интерфейсы API.
Поскольку развертывать сборки PIA больше не требуется, можно создавать приложения для применения в сложных сценариях, чтобы эти приложения работали с несколькими версиями Office, включая и более ранние версии. Тем не менее это возможно только в том случае, если в коде не используются интерфейсы API, которые недоступны в используемой версии Office. Разработчик не всегда знает, был ли доступен тот или иной интерфейс API в более ранней версии, поэтому работать с более ранними версиями Office не рекомендуется.
До Office 2003 сборки PIA не публиковались. Поэтому единственными способом создания сборки взаимодействия в Office 2002 или более ранних версиях является импорт ссылки COM.
Закройте окно манифеста и окно сборки.
Восстановление зависимости PIA
В обозревателе решений нажмите кнопку Показать все файлы. Разверните папку Ссылки и выберите Microsoft.Office.Interop.Excel. Нажмите клавишу F4, чтобы открыть окно Свойства.
В окне Свойства измените значение свойства Внедрить типы взаимодействия с True на False.
Повторите шаги 1 и 2 этой процедуры для сборки Microsoft.Office.Interop.Word .
Нажмите клавишу F5, чтобы проверить, что проект по-прежнему выполняется правильно.
Повторите шаги 1–3 из предыдущей процедуры, чтобы открыть окно сборки. Обратите внимание, что сборки Microsoft.Office.Interop.Word и Microsoft.Office.Interop.Excel больше не входят в список внедренных сборок.
Дважды щелкните значок МАНИФЕСТ и просмотрите список сборок, на которые имеются ссылки. В списке будут указаны сборки Microsoft.Office.Interop.Word и Microsoft.Office.Interop.Excel . Поскольку приложение содержит ссылки на сборки PIA Excel и Word, а свойство Внедрить типы взаимодействия имеет значение False, на компьютере пользователя должны храниться обе сборки.
В Visual Studio в меню Построение выберите пункт Очистить решение, чтобы очистить завершенный проект.
Настоящая документация является предварительной и может быть изменена. В этом разделе показано, как использовать классы в Пакет Open XML SDK 2.5 для Office для программного создания электронной таблицы.
Для компиляции кода, представленного в этом разделе, требуются следующие директивы сборки.
Получение объекта SpreadsheetDocument
В пакете Open XML SDK класс SpreadsheetDocument представляет пакет документа Excel. Для создания документа Excel создайте экземпляр класса SpreadsheetDocument и заполните его части. Документ должен содержать по крайней мере две части часть книги, которая служит контейнером для документа, и часть листа. Текст представляется в пакете как XML с использованием разметки SpreadsheetML.
Чтобы создать экземпляр класса, вызовите метод Create(Package, SpreadsheetDocumentType). Предоставляется несколько перегрузок метода Create с разной сигнатурой. В примере кода в этом разделе используется метод Create с сигнатурой, требующей два параметра. Первый из них, package, принимает строку с полным путем к документу, который необходимо создать. Второй параметр, type — это элемент перечисления SpreadsheetDocumentType. Этот параметр представляет тип документа. Например, существуют различные члены перечисления SpreadsheetDocumentType для надстроек, шаблонов, книг и шаблонов и книг с поддержкой макросов.
Выберите соответствующий тип SpreadsheetDocumentType и убедитесь, что сохраненный файл имеет правильное расширение. Если тип SpreadsheetDocumentType не соответствует расширению файла, при открытии файла в Excel возникнет ошибка.
В следующем примере кода вызывается метод Create:
После создания пакета документа Excel вы можете добавить в него части. Для добавления части книги вызывается метод AddWorkbookPart() класса SpreadsheetDocument. Часть книги должна содержать по крайней мере один лист. Чтобы добавить лист, создайте объект Sheet. При создании объекта Sheet свяжите Sheet с объектом Workbook, передав параметры Id, SheetId и Name. Используйте метод GetIdOfPart(OpenXmlPart), чтобы получить Id из объекта Sheet. Затем добавьте новый лист в коллекцию Sheet, вызвав метод Append([]) класса Sheets. Следующий код создает лист, связывает его с книгой и добавляет в нее:
Базовая структура документа SpreadsheetML
Следующий код — это разметка SpreadsheetML для книги, создаваемой кодом:
Базовая структура документа SpreadsheetML состоит из элементов Sheets и Sheet, ссылающихся на листы в книге. Для каждого листа создается отдельный XML-файл. XML-файлы листов содержат один или несколько элементов уровня блока, например SheetData. Элемент sheetData представляет таблицу ячеек и содержит один или несколько элементов Row. Элемент row включает один или несколько элементов Cell. Каждая ячейка содержит элемент CellValue, который представляет значение ячейки. В следующем примере приведена разметка SpreadsheetML листа, созданная кодом:
С помощью Пакет SDK 2.5 Open XML можно создать структуру и содержимое документа, использующие строго типизированные классы, соответствующие элементам SpreadsheetML. Эти классы можно найти в пространстве имен DocumentFormat.OpenXml.Spreadsheet. В следующей таблице перечислены имена классов, соответствующие элементам workbook, sheets, sheet, worksheet и sheetData.
Элемент SpreadsheetML | Класс пакета Open XML SDK 2.5 | Описание |
---|---|---|
книга | DocumentFormat.OpenXml.Spreadsheet.Workbook | Корневой элемент основной части документа. |
sheets | DocumentFormat.OpenXml.Spreadsheet.Sheets | Контейнер для структур уровня блокировки, таких как sheet, fileVersion и других элементов, описанных в спецификации ISO/IEC 29500. |
лист | DocumentFormat.OpenXml.Spreadsheet.Sheet | Лист, указывающий на файл определения листа. |
лист | DocumentFormat.OpenXml.Spreadsheet.Worksheet | Файл определения лист с данными листа. |
sheetData | DocumentFormat.OpenXml.Spreadsheet.SheetData | Таблица ячеек, сгруппированных по строкам. |
Создание разметки SpreadsheetML
Для создания базовой структуры документов с помощью пакета Open XML SDK создайте экземпляр класса Workbook, назначьте его свойству WorkbookPart части основного документа, а затем добавьте экземпляры классов WorksheetPart, Worksheet и Sheet. Это показано в примере кода, который создает необходимую разметку SpreadsheetML.
Пример кода
Метод CreateSpreadsheetWorkbook, показанный здесь, можно использовать для создания базового документа Excel, книги с одним листом с именем "mySheet". Чтобы вызвать его в программе, можно использовать следующий пример кода, который создает файл с именем "Sheet2.xlsx" в папке "Общие документы".
Обратите внимание, что расширение файла, XLSX, совпадает с типом файла, указанным параметром SpreadsheetDocumentType.Workbook в вызове метода Create.
Читайте также: