Excel загрузка и выгрузка данных, используя OpenXML

Источник: habrahabr
Voucik

Решил написать статью, о том, как сделать выгрузку данных в 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".

image

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

image

Ключевые слова:
DataField: - Означает, что на этом месте будут выведены наши банные из DataTable.
DataField:[название выводимого поля]
Label: - Означает, что на этом месте будут выводиться данные, которые надо вставить однократно из словаря
Label:[название ключа в словаре]
А это файл из которого мы будем считывать данные "C:\Loading\ReadMePlease.xlsx".

image

Теперь создадим в VS2010, Решение в котором будет 4 проекта:
1) OpenXmlPrj - это консольный проект, для запуска теста.
2) Interfaces - это проект типа "Библиотека классов", будет хранить наши интерфейсы данных для выгрузки.
3) Framework - это проект типа "Библиотека классов", тут и будет происходить вся работа с Excel-ем.
4) Converter - это проект типа "Библиотека классов", для конвертирования наших данных в DataTable (т.к. работа происходит с DataTable).
image
Теперь в проекте "Framework" создаём две папки и подключим ссылку на библиотеку OpenXML и WindowsBase:
"Create" - для работы с выгрузкой данных.
"Load" - для работы с загрузкой данных.
"lib" - в папку, добавим библиотеку OpenXML.
В папке "Create" создаём 4 класса.
1) Worker - это будет наш главный обработчик.

класс Create.Worker

2) Footer - будет содержать строки и их ячейки идущие после наших данных.

класс Footer

3) CellForFooter - содержит в себе координаты ячейки и её значение, используется в Footer-е.

класс CellForFooter

4) Field - будет содержать индекс строки, где находится DataField, координаты ячеек с DataField и название поля, значение которого надо вывести.

класс Field

В папке "Load" создаём 2 класса.
1) Worker - это будет наш главный обработчик.

класс Load.Worker

2) ColumnName - будет название колонки, для загружаемых данных.

класс ColumnName

В проекте "Interfaces" создадим интерфейс наших данных IDataForTest.

интерфейс IDataForTest

В проекте "Converter" создадим класс
ConvertToDataTable - для конвертирования наших данных в DataTable.

класс ConvertToDataTable

В проекте "OpenXmlPrj"
Будет класс для выполнения программы "Program".

класс Program

И класс для наших данных "DataForTest".

класс DataForTest

И проекте "OpenXmlPrj" надо подключить ссылки на следующие проекты: Interfaces, Framework, Converter
Условия для создания шаблона:
1. Excel лист, обязательно должен называться "Лист1" (ну или если захотите переименовать, то в коде надо будет изменить название тоже).
2. Названия после DataField: должны строго совпадать с названиями колонок в DataTable.
3. Шаблон должен быть сохранён в формате ".xlsx".
Условия для файла, с которого мы будем считывать данные:
1. Excel лист, обязательно должен называться "Лист1" (ну или если захотите переименовать, то в коде надо будет изменить название тоже).
2. Первая строка, должна содержать названия колонок, по которым мы потом будем парсить данные.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=35205