使用.NET核心MVC上传和读取excel文件

问题描述 投票:0回答:1

我已经实现了一个使用.NET Core中的NPOI读取excel文件的算法。现在我想要的是在web-app上传一个excel文件,并在上传时读取excel文件并将其保存到数据库。

我对模型,视图和控制器应如何处理有点困惑。以下是优化的需求列表:

  • 确保用户上传.xlsx文件(不是其他文件)
  • 在上传时读取Excel数据
  • 将数据保存在数据库中
entity-framework model-view-controller file-upload .net-core npoi
1个回答
1
投票

你的控制器可以是这样的:

    public ActionResult Import(System.Web.HttpPostedFileBase uploadFile)
    {
        if (uploadFile != null)
            {
                if (uploadFile.ContentLength > 0)
                {
                    var fileExtension = Path.GetExtension(uploadFile.FileName);
                    if (fileExtension.ToLower().Equals(".xlsx"))
                    {
                        BinaryReader b = new BinaryReader(uploadFile.InputStream);
                        int count = uploadFile.ContentLength;
                        byte[] binData = b.ReadBytes(count);
                        using (MemoryStream stream = new MemoryStream(binData))
                        {
                            //call the service layer to read the data from stream
                        }
                     }
                  }
             }
    }

您的服务层就是您已经想到的,使用NPOI来阅读。

根据您从excel文件中读取的数据,您的模型可能是这样的:

public class Product
{
    public int ProductID {get; set;}
    public string Name {get; set;}
    public decimal Price {get; set;}
}

在数据库中,您可以使用存储过程,该存储过程可以使用用户定义的表类型来获取多行数据。在读取服务层中的数据后,可以从存储库中调用此存储过程。

最后,在视图中,您可以使用包含文件上载对话框的表单并传递用户上载的文件。调用控制器的Javascript可能是这样的:

function x () {
            var inputdata = null;
            var form = $('#__ImportFileForm');
            var token = $('input[name="__RequestVerificationToken"]', form).val();
            var fd = new FormData();
            fd.append("__RequestVerificationToken", token);
            fd.append("uploadFile", $("#uploadFile")[0].files[0]);
            inputdata = fd;
            inputdata.skipAjaxPrefilter = true;

            $.ajax({
                type: "Post",
                url: url,
                data: inputdata,
                processData: false,
                contentType: false,
                traditional: true,
                async: true,
                success: function(data) { //do what you want },
                error: function(data, ajaxOptions, thrownError) { //do what you want }
            });
}

希望这能回答你所有的问题!

© www.soinside.com 2019 - 2024. All rights reserved.