На работе потребовалось сделать маленький проект на 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");
}
}
Приведен очень простой пример, но его легко можно изменить под свои нужды.
Работа со стилями приведена для примера. Подробнее можно посмотреть в официальной документации.
Автор: мистер Олимпия