Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET MVC-将Excel内容保存到数据库_Asp.net_Asp.net Mvc_Excel - Fatal编程技术网

ASP.NET MVC-将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(

我想在我的web应用程序中添加一项功能,用户可以上传一个excel文件,该文件可能如下所示(我将提供一个用户可以填写的excel文件模板):

并将标题名称地址电话后的每一行传递给我的注册控制器或服务。现在我的问题是什么是最好的方法(对于用户体验,速度很重要)来做到这一点


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

您可以使用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列。