Uploading Excel Data to CostItem Model in ASP.NET Core

Answered using OpenAI o1 mini by OpenAI o1

Question:

у меня есть модель public class CostItem { public int Id { get; set; } public string NodeCode { get; set; } public string CostName { get; set; } public string CommentISR { get; set; } public string ContractorComment { get; set; } public string UnitOfMeasure { get; set; } public decimal ConsumptionCoefficient { get; set; } public int BaseObjectCount { get; set; } public int TotalCount { get; set; } public decimal PriceWithVAT { get; set; } public decimal PriceWithoutVAT { get; set; } public int ProjectCode { get; set; } // Код проекта } Мне нужно загрузить в неё данные из файла xlsx в проекте Asp.net core mvc. Напиши код код контроллера и представления для загрузки данных с использованием бесплатных утилит.

Answer:

Для загрузки данных из файла Excel (формат .xlsx) в модель CostItem в проекте ASP.NET Core MVC, вы можете использовать библиотеку EPPlus, которая позволяет работать с Excel файлами. Ниже приведен пример кода контроллера и представления для загрузки данных.

Шаг 1: Установка пакета EPPlus

Сначала установите пакет EPPlus через NuGet. Вы можете сделать это с помощью команды в консоли диспетчера пакетов:

Install-Package EPPlus

Или добавив его в ваш файл .csproj:

<PackageReference Include="EPPlus" Version="5.8.3" />

Шаг 2: Создание контроллера

Создайте контроллер, который будет обрабатывать загрузку файла и извлечение данных из него.

using System.Collections.Generic;
using System.IO;
using System.Linq;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using OfficeOpenXml;

namespace YourNamespace.Controllers
{
    public class CostItemController : Controller
    {
        [HttpGet]
        public IActionResult Upload()
        {
            return View();
        }

        [HttpPost]
        public IActionResult Upload(IFormFile file)
        {
            if (file == null || file.Length == 0)
            {
                ModelState.AddModelError("", "Please upload a file.");
                return View();
            }

            var costItems = new List<CostItem>();

            using (var stream = new MemoryStream())
            {
                file.CopyTo(stream);
                using (var package = new ExcelPackage(stream))
                {
                    var worksheet = package.Workbook.Worksheets.First();
                    var rowCount = worksheet.Dimension.Rows;

                    for (int row = 2; row <= rowCount; row++) // Начинаем со второй строки, чтобы пропустить заголовки
                    {
                        var costItem = new CostItem
                        {
                            Id = int.Parse(worksheet.Cells[row, 1].Text),
                            NodeCode = worksheet.Cells[row, 2].Text,
                            CostName = worksheet.Cells[row, 3].Text,
                            CommentISR = worksheet.Cells[row, 4].Text,
                            ContractorComment = worksheet.Cells[row, 5].Text,
                            UnitOfMeasure = worksheet.Cells[row, 6].Text,
                            ConsumptionCoefficient = decimal.Parse(worksheet.Cells[row, 7].Text),
                            BaseObjectCount = int.Parse(worksheet.Cells[row, 8].Text),
                            TotalCount = int.Parse(worksheet.Cells[row, 9].Text),
                            PriceWithVAT = decimal.Parse(worksheet.Cells[row, 10].Text),
                            PriceWithoutVAT = decimal.Parse(worksheet.Cells[row, 11].Text),
                            ProjectCode = int.Parse(worksheet.Cells[row, 12].Text)
                        };

                        costItems.Add(costItem);
                    }
                }
            }

            // Здесь вы можете сохранить costItems в базе данных или выполнить другие действия

            return RedirectToAction("Index"); // Перенаправление на другую страницу после загрузки
        }
    }
}

Шаг 3: Создание представления

Создайте представление Upload.cshtml для загрузки файла.

@{
    ViewData["Title"] = "Upload Cost Items";
}

<h2>Upload Cost Items</h2>

<form asp-action="Upload" method="post" enctype="multipart/form-data">
    <div class="form-group">
        <label for="file">Select Excel file:</label>
        <input type="file" name="file" class="form-control" />
    </div>
    <button type="submit" class="btn btn-primary">Upload</button>
</form>

@if (!ViewData.ModelState.IsValid)
{
    <div class="alert alert-danger">
        @foreach (var error in ViewData.ModelState.Values.SelectMany(v => v.Errors))
        {
            <p>@error.ErrorMessage</p>
        }
    </div>
}

Шаг 4: Настройка маршрутов

Убедитесь, что у вас настроены маршруты для контроллера в Startup.cs или Program.cs, в зависимости от версии ASP.NET Core, которую вы используете.

Заключение

Теперь у вас есть контроллер и представление для загрузки данных из файла Excel в модель CostItem. Не забудьте добавить обработку ошибок и валидацию данных в зависимости от ваших