ASP.NET MVC – 将Excel内容保存到数据库

我想添加一个function,我的Web应用程序,用户可以上传一个Excel文件,可能看起来像这样(我将提供一个Excel文件模板,用户可以填写):

Name Address Phone John California 000-111 Matt Seattle 000-222 ... 

并将标题Name-Address-Phone后的每一行传递给我的注册控制器或服务。 现在我的问题是什么是最好的方式(用户体验,速度是重要的)来做到这一点?

我不是在寻找一个完整的工作代码,我只是在寻求速度方面最有效的方法。

你应该创build一个保存插入逻辑的存储过程。一旦用户上传Excel文件,你可以使用Excel interop打开它,获取捕获的数据并调用插入存储过程。如果你需要更快的插入速度,你总是可以使用SQL批量复制 。

1.在您的MVC项目中添加对Microsoft.Office.Interop.Excel.dll的引用

2.创build一个提示用户上传Excel文件的视图。

 @using (Html.BeginForm("Import", "Home", FormMethod.Post, new { enctype = "multipart/form-data" })) { @Html.Raw(ViewBag.Error) <span>Excel File </span><input type="file" name="excelfile" /> <br /> <input type="submit" value="Import" /> } 

3.创build一个打开Excel文件的控制器动作 – >循环遍历行 – >将数据插入到SQL中

 [HttpPost] public ActionResult Import(HttpPostedFileBase excelFile) { //Add this to the using statements after adding a refrence to Microsoft.Office.Interop.Excel.dll - using Excel = Microsoft.Office.Interop.Excel; if ((excelFile.ContentLength != 0) && (excelFile.FileName.EndsWith("xls") || excelFile.FileName.EndsWith("xlsx"))) { string path = Server.MapPath("~/Files/" + excelFile.FileName); if (!System.IO.File.Exists(path)) { excelFile.SaveAs(path); Excel.Application application = new Excel.Application(); Excel.Workbook workbook = application.Workbooks.Open(path); Excel.Worksheet worksheet = (Excel.Worksheet)workbook.ActiveSheet; Excel.Range range = worksheet.UsedRange; for (int i = 2; i < range.Rows.Count + 1; i++) { string name = ((Excel.Range)range.Cells[i,1]).Text; string address = ((Excel.Range)range.Cells[i,2]).Text; string phone = ((Excel.Range)range.Cells[i,3]).Text; //Write the logic to add the values to the database } } } return View(); } 

你也可以使动作asynchronous,但它并没有真正的帮助,因为写入数据库是一个IO操作,所以asynchronous不会做任何事情。

您可以使用OleDb连接到您的Excel文件。 成功的连接后,你可以用excel文件中的行填充一个DataTable,然后做一个foreach把每一行传递给你的控制器。

 void Process(string path) { try { string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\";"; using (var connection = new OleDbConnection(connString)) { using (var command = new OleDbCommand("select * from [SheetName$]", connection)) { connection.Open(); using (var adapter = new OleDbDataAdapter(command)) { DataTable dataTable = new DataTable(); adapter.Fill(dataTable); foreach (DataRow row in dataTable.Rows) { string Name, Address, Phone = string.Empty; try { Name = row["Name"].ToString(); Address = row["Address"].ToString(); Phone = row["Phone"].ToString(); //new RegistrationController(Name, Address, Phone); } catch (Exception ex) { // Handle exceptions } } } } } } // Might be possibly thrown when opening connection catch (OleDbException ex) { // Handle exceptions } // Might be possibly thrown when filling datatable catch (InvalidOperationException ex) { // Handle exceptions } }