Извлечение данных из файла Excel для использования в ASP.net основное приложение

#asp.net #excel #entity-framework #asp.net-core

#asp.net #excel #entity-framework #asp.net-core

Вопрос:

Я разрабатываю приложение, в котором мне нужно получать данные из таблицы Excel и использовать их в приложении, но у меня возникают проблемы с доступом к данным. Должен ли я использовать Entity Framework и перемещать данные в базу данных или я просто импортирую данные из Excel и использую их?

Комментарии:

1. У меня возникли проблемы с доступом к данным — какие у вас проблемы? Можете ли вы показать нам, что вы пробовали? Ваш вопрос относительно EF или Excel во многом зависит от ваших намерений. Что вам нужно сделать с этими данными?

Ответ №1:

Не уверен, с какими проблемами вы сталкиваетесь при доступе к данным. Но вот пример импорта данных Excel в Asp.net основное приложение, вы могли бы обратиться к нему.

В этом примере он загрузит файл Excel в папку wwwroot сначала с помощью JavaScript, а затем с помощью DotNetCore.Пакет NPOI (с открытым исходным кодом, вы можете установить его через Nuget) для извлечения данных из Excel. Подробные шаги, как показано ниже:

Предположим, что есть testdata.xlsx файл, содержимое, как показано ниже:

введите описание изображения здесь

Код в контроллере:

     private readonly IWebHostEnvironment _hostEnvironment;
    public HomeController(ILogger<HomeController> logger, IWebHostEnvironment environment)
    {
        _logger = logger; 
        _hostEnvironment = environment;
    }

    public IActionResult Upload()
    {
        return View();
    }
    [HttpPost]
    public IActionResult Import()
    {
        IFormFile file = Request.Form.Files[0]; 
        string folderName = "UploadExcel"; 
        string webRootPath = _hostEnvironment.WebRootPath; 
        string newPath = Path.Combine(webRootPath, folderName); 
        StringBuilder sb = new StringBuilder(); 
        if (!Directory.Exists(newPath)) 
        { 
            Directory.CreateDirectory(newPath); 
        } 
        if (file.Length > 0) 
        { 
            string sFileExtension = Path.GetExtension(file.FileName).ToLower(); 
            ISheet sheet; 
            string fullPath = Path.Combine(newPath, file.FileName); 
            using (var stream = new FileStream(fullPath, FileMode.Create)) 
            { 
                file.CopyTo(stream); 
                stream.Position = 0; 
                if (sFileExtension == ".xls") 
                { 
                    HSSFWorkbook hssfwb = new HSSFWorkbook(stream); //This will read the Excel 97-2000 formats   
                    sheet = hssfwb.GetSheetAt(0); //get first sheet from workbook   
                } 
                else 
                { 
                    XSSFWorkbook hssfwb = new XSSFWorkbook(stream); //This will read 2007 Excel format   
                    sheet = hssfwb.GetSheetAt(0); //get first sheet from workbook    
                } 
                IRow headerRow = sheet.GetRow(0); //Get Header Row 
                int cellCount = headerRow.LastCellNum; 
                sb.Append("<table class='table table-bordered'><tr>");                     
                for (int j = 0; j < cellCount; j  ) 
                { 
                    NPOI.SS.UserModel.ICell cell = headerRow.GetCell(j); 
                    if (cell == null || string.IsNullOrWhiteSpace(cell.ToString())) continue; 
                    sb.Append("<th>"   cell.ToString()   "</th>"); 
                } 
                sb.Append("</tr>"); 
                sb.AppendLine("<tr>");

                var emplist = new List<EmployeeViewModel>();

                for (int i = (sheet.FirstRowNum   1); i <= sheet.LastRowNum; i  ) //Read Excel File 
                { 
                    IRow row = sheet.GetRow(i); 
                    if (row == null) continue; 
                    if (row.Cells.All(d => d.CellType == CellType.Blank)) continue; 
                    for (int j = row.FirstCellNum; j < cellCount; j  ) 
                    { 
                        if (row.GetCell(j) != null) 
                            sb.Append("<td>"   row.GetCell(j).ToString()   "</td>"); 
                    } 
                    sb.AppendLine("</tr>");
                    EmployeeViewModel emp = new EmployeeViewModel() {
                        EmployeeID = Convert.ToInt32(row.Cells[0].ToString()),
                        EmployeeName = row.Cells[1].ToString(),
                        Age = Convert.ToInt32(row.Cells[2].ToString()),
                        Sex = row.Cells[3].ToString(),
                        Designation = row.Cells[4].ToString()
                    };

                    emplist.Add(emp);
                }

                var result = emplist;
                sb.Append("</table>"); 
            } 
        }  
        return this.Content(sb.ToString());
        //return View("Upload");
    }
  

Код в представлении загрузки:

 <form asp-controller="Home" asp-action="Export">
    <div class="container">
        <div class="row">
            <div class="col-md-4">
                <input type="file" id="fileupload" name="files" class="form-control" />
            </div>
            <div class="col-md-3">
                <input type="button" name="Upload" value="Upload" id="btnupload" class="btn btn-primary" />
                <a href="@Url.Action("Download", "Home")">Download</a>
            </div>
            <div class="col-md-5">
                <input type="submit" name="Export" value="Create and Export" id="btnExport"
                       class="btn btn-primary" asp-action="Export" />
            </div>
        </div>
        <div class="clearfix">amp;nbsp;</div>
        <div class="row">
            <div id="divPrint"></div>
        </div>
    </div>
</form>
  

И код Java Script:

 <script type="text/javascript">
$(function () {
    $('#btnupload').on('click', function () {
        var fileExtension = ['xls', 'xlsx'];
        var filename = $('#fileupload').val();
        if (filename.length == 0) {
            alert("Please select a file.");
            return false;
        }
        else {
            var extension = filename.replace(/^.*./, '');
            if ($.inArray(extension, fileExtension) == -1) {
                alert("Please select only excel files.");
                return false;
            }
        }
        var fdata = new FormData();
        var fileUpload = $("#fileupload").get(0);
        var files = fileUpload.files;
        fdata.append(files[0].name, files[0]);
        $.ajax({
            type: "POST",
            url: "/Home/Import",
            beforeSend: function (xhr) {
                xhr.setRequestHeader("XSRF-TOKEN",
                    $('input:hidden[name="__RequestVerificationToken"]').val());
            },
            data: fdata,
            contentType: false,
            processData: false,
            success: function (response) {
                if (response.length == 0)
                    alert('Some error occured while uploading');
                else {
                    $('#divPrint').html(response);
                }
            },
            error: function (e) {
                $('#divPrint').html(e.responseText);
            }
        });
    })
    $('#btnExport').on('click', function () {
        var fileExtension = ['xls', 'xlsx'];
        var filename = $('#fileupload').val();
        if (filename.length == 0) {
            alert("Please select a file then Import");
            return false;
        }
    });
});
</script>
  

Результат выглядит следующим образом:

введите описание изображения здесь

Вы также можете создать модель сотрудника для хранения данных:

 public class EmployeeViewModel
{
    public int EmployeeID { get; set; }
    public string EmployeeName { get; set; }
    public int Age { get; set; }
    public string Sex { get; set; }
    public string Designation { get; set; }
}
  

Затем, при циклическом просмотре строк Excel, используйте следующий код, чтобы получить список сотрудников:

                 var emplist = new List<EmployeeViewModel>();

                for (int i = (sheet.FirstRowNum   1); i <= sheet.LastRowNum; i  ) //Read Excel File 
                { 
                    IRow row = sheet.GetRow(i); 
                    if (row == null) continue; 
                    if (row.Cells.All(d => d.CellType == CellType.Blank)) continue; 
                    for (int j = row.FirstCellNum; j < cellCount; j  ) 
                    { 
                        if (row.GetCell(j) != null) 
                            sb.Append("<td>"   row.GetCell(j).ToString()   "</td>"); 
                    } 
                    sb.AppendLine("</tr>");
                    EmployeeViewModel emp = new EmployeeViewModel() {
                        EmployeeID = Convert.ToInt32(row.Cells[0].ToString()),
                        EmployeeName = row.Cells[1].ToString(),
                        Age = Convert.ToInt32(row.Cells[2].ToString()),
                        Sex = row.Cells[3].ToString(),
                        Designation = row.Cells[4].ToString()
                    };

                    emplist.Add(emp);
                }
  

Если приведенный выше пример не соответствует вашим требованиям, пожалуйста, более подробно объясните, какие проблемы у вас возникли и какую библиотеку вы используете для загрузки Excel.

Ссылка:

Импорт и экспорт файла Excel с использованием NPOI

Импорт (вставка) данных файла Excel в базу данных ASP.Net Core MVC (с использованием библиотеки OLEDB)