Pull to refresh

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:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.