我已经实现了一个使用.NET Core中的NPOI读取excel文件的算法。现在我想要的是在web-app上传一个excel文件,并在上传时读取excel文件并将其保存到数据库。
我对模型,视图和控制器应如何处理有点困惑。以下是优化的需求列表:
你的控制器可以是这样的:
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 }
});
}
希望这能回答你所有的问题!