ASP.NET MVC-将Excel内容保存到数据库
我想在我的web应用程序中添加一项功能,用户可以上传一个excel文件,该文件可能如下所示(我将提供一个用户可以填写的excel文件模板): 并将标题名称地址电话后的每一行传递给我的注册控制器或服务。现在我的问题是什么是最好的方法(对于用户体验,速度很重要)来做到这一点ASP.NET MVC-将Excel内容保存到数据库,asp.net,asp.net-mvc,excel,Asp.net,Asp.net Mvc,Excel,我想在我的web应用程序中添加一项功能,用户可以上传一个excel文件,该文件可能如下所示(我将提供一个用户可以填写的excel文件模板): 并将标题名称地址电话后的每一行传递给我的注册控制器或服务。现在我的问题是什么是最好的方法(对于用户体验,速度很重要)来做到这一点 我不是在寻找完整的工作代码,我只是在寻找速度方面最有效的方法。您可以使用OleDb连接到excel文件。成功连接后,您可以使用excel文件中的行填充数据表,然后执行foreach将每一行传递给控制器 void Process(
我不是在寻找完整的工作代码,我只是在寻找速度方面最有效的方法。您可以使用OleDb连接到excel文件。成功连接后,您可以使用excel文件中的行填充数据表,然后执行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
}
}
您可以使用OleDb连接到excel文件。成功连接后,您可以使用excel文件中的行填充数据表,然后执行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
}
}
您应该创建一个保存插入逻辑的存储过程。一旦用户上载Excel文件,您就可以使用Excel interop打开它,获取捕获的数据并调用插入存储过程。如果您需要更快的插入速度,您可以随时使用 1.在MVC项目中添加对Microsoft.Office.Interop.Excel.dll的引用 2.创建一个视图,提示用户上载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" />
}
@使用(Html.BeginForm(“Import”、“Home”、FormMethod.Post、new{enctype=“multipart/formdata”}))
{
@Html.Raw(ViewBag.Error)
Excel文件
}
3.创建一个控制器操作,打开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();
}
[HttpPost]
公共操作结果导入(HttpPostedFileBase Excel文件)
{
//将引用添加到Microsoft.Office.Interop.Excel.dll后,将其添加到using语句中-using Excel=Microsoft.Office.Interop.Excel;
如果((excelFile.ContentLength!=0)和(&(excelFile.FileName.EndsWith(“xls”)| | excelFile.FileName.EndsWith(“xlsx”))
{
字符串路径=Server.MapPath(“~/Files/”+excelFile.FileName);
如果(!System.IO.File.Exists(path))
{
excelFile.SaveAs(路径);
Excel.Application=new Excel.Application();
Excel.Workbook工作簿=application.Workbooks.Open(路径);
Excel.Worksheet Worksheet=(Excel.Worksheet)workbook.ActiveSheet;
Excel.Range=worksheet.UsedRange;
对于(int i=2;i
您也可以将操作设置为异步,但实际上没有帮助,因为写入数据库是一个IO操作,所以异步不会做任何事情。您应该创建一个保存插入逻辑的存储过程。一旦用户上载Excel文件,您可以使用Excel interop打开它,获取捕获的数据并调用insert存储过程。如果您需要更快的插入速度,可以随时使用 1.在MVC项目中添加对Microsoft.Office.Interop.Excel.dll的引用 2.创建一个视图,提示用户上载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" />
}
@使用(Html.BeginForm(“Import”、“Home”、FormMethod.Post、new{enctype=“multipart/formdata”}))
{
@Html.Raw(ViewBag.Error)
Excel文件
}
3.创建一个控制器操作,打开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();
}
[HttpPost]
公共操作结果导入(HttpPostedFileBase Excel文件)
{
//将引用添加到Microsoft.Office.Interop.Excel.dll后,将其添加到using语句中-using Excel=Microsoft.Office.Interop.Excel;
如果((excelFile.ContentLength!=0)和(&(excelFile.FileName.EndsWith(“xls”)| | excelFile.FileName.EndsWith(“xlsx”))
{
字符串路径=Server.MapPath(“~/Files/”+excelFile.FileName);
如果(!System.IO.File.Exists(path))
{
excelFile.SaveAs(路径);
Excel.Application=new Excel.Application();
Excel.Workbook工作簿=application.Workbooks.Open(路径);
Excel.Worksheet Worksheet=(Excel.Worksheet)workbook.ActiveSheet;
Excel.Range=worksheet.UsedRange;
对于(int i=2;i
您也可以将操作设置为异步,但实际上没有帮助,因为写入数据库是一个IO操作,所以异步不会做任何事情。对其使用ADO,如果您有DB,则插入DB_表,从源代码中选择*。如果不是,我建议使用一个与行相关的类,所以clsExcelImportRow{Name,Address,Phone}并使用ADO选择数据并循环记录集,每行添加一个类。如果您有DB,请在其上使用ADO,以便插入到DB_表中,从源选择*。如果不是的话,我建议使用一个与行相关的类,所以clsExcelImportRow{Name,Address,Phone}并使用ADO选择数据并循环记录集,在每行添加一个类。有没有办法使列数动态化?我的意思是,如果excel有4列,而我的第一个场景有3列。有没有一种方法可以使列的数量动态化?我的意思是,如果excel有4列,而我的第一个场景有3列。