ClosedXML чтение и запись Excel файлов

На работе потребовалось сделать маленький проект на asp.net MVC и в нем необходимо обрабатывать Excel файлы и отдавать информацию в этом же формате. Причем нужно бесплатное решение. На хабре нашел пример с OpenXML, но мне данное решение показалось сложным.

В итоге посмотрел различные варианты (от csv файла до генерации xml) и больше всего приглянулся вариант с ClosedXML.

Далее приведу простое решение, которое считает файл в контроллере и сформирует ответ с применением стилей. Дабы не перегружать пример не буду создавать модель данных и т.п.

Подготовка проекта


Создаем готовый проект на основе шаблона MVC.

После создания переходим в управление пакетами NuGet. Через поиск находим ClosedXML и устанавливаем его.

Далее в контроллере Home подключаем библиотеки:

using System.IO;
using ClosedXML.Excel;

На этом подготовка проекта закончена и можно принимать и отдавай файл.

Чтение файла


1. Создадим разметку для загрузки файла:

Выберите файл

@using (Html.BeginForm("Load", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    <input type="file" name="load" /><br>
    <input type="submit" value="Загрузить" />
}

2. В контроллере Home создадим метод для чтения файла

       [HttpPost]
        public ActionResult Load(HttpPostedFileBase load)
        {
            if (load != null)
            {
                // получаем имя файла
                string fileName = Path.GetFileName(load.FileName);
                // сохраняем файл в папку на сервере
                load.SaveAs(Server.MapPath("~/App_Data/" + fileName));
                // получаем сохраненный файл
                string xsltPath = Path.Combine(System.Web.HttpContext.Current.Server.MapPath(@"~/App_Data"), fileName);
               // начало использования библиотеке ClosedXML
                var workbook = new XLWorkbook(xsltPath);
                var worksheet = workbook.Worksheet(1);
                // получим все строки в файле
                var rows = worksheet.RangeUsed().RowsUsed(); // Skip header row
                // пример чтения строк файла.
                foreach (var row in rows)
                {
                   // Вместо строки можно заносить в базу согласно модели.
                   string   rowNumber = $"Имя {row.Cell(1).Value} Фамилия {row.Cell(2).Value}";
                   // для проверки, что данные были получены - можно поставить точку останова
                }
            }
            return RedirectToAction("Index");
        }

Создание файла


В контроллере Home создадим метод:

        public FileResult SaveEndOfBase()
        {
            var workbook = new XLWorkbook();
            var worksheet = workbook.Worksheets.Add("Лист1");

            //создадим заголовки у столбцов
            worksheet.Cell("A" + 1).Value = "Имя";
            worksheet.Cell("B" + 1).Value = "Фамиля";
            worksheet.Cell("C" + 1).Value = "Возраст";

            // 

            worksheet.Cell("A" + 2).Value = "Иван";
            worksheet.Cell("B" + 2).Value = "Иванов";
            worksheet.Cell("C" + 2).Value = 18;
            //пример изменения стиля ячейки
            worksheet.Cell("B" + 2).Style.Fill.BackgroundColor = XLColor.Red;

            // пример создания сетки в диапазоне
            var rngTable = worksheet.Range("A1:G" + 10);
            rngTable.Style.Border.RightBorder = XLBorderStyleValues.Thin;
            rngTable.Style.Border.BottomBorder = XLBorderStyleValues.Thin;

            worksheet.Columns().AdjustToContents(); //ширина столбца по содержимому

            // вернем пользователю файл без сохранения его на сервере
            using (MemoryStream stream = new MemoryStream())
            {
                workbook.SaveAs(stream);
                return File(stream.ToArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Base.xlsx");
            }
        }

Приведен очень простой пример, но его легко можно изменить под свои нужды.
Работа со стилями приведена для примера. Подробнее можно посмотреть в официальной документации.
Tags:
asp.net mvc, c#, excel

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.