将 Excel 上传到数据库 (PL/SQL) 从 ASP.NET MVC



我有一个界面,允许用户选择在 ASP.NET MVC 4中开发的excel工作表.在这里,用户将数据填充到excel工作表(2000 +(中,然后将数据插入数据库表(oracle 12c(。我能够读取 excel 文件并将数据存储到数据库中,但它太慢了。我遍历每一行,每次插入数据时都调用存储过程。请向我建议将 excel 文件上传到 oracle 数据库的最佳和最快方法。

请使用下面提到的代码。它有效。

  public JsonResult UploadVolunteer(HttpPostedFileBase postedFile)
        {
            string filePath = string.Empty;
            if (postedFile != null)
            {
                string path = Server.MapPath("~/ExcelFiles/");
                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }
                filePath = path + Path.GetFileName(postedFile.FileName);
                string extension = Path.GetExtension(postedFile.FileName);
                postedFile.SaveAs(filePath);
                string conString = string.Empty;
                switch (extension)
                {
                    case ".xls": //Excel 97-03.
                        conString = ConfigurationManager.ConnectionStrings["Excel03ConString"].ConnectionString;
                        break;
                    case ".xlsx": //Excel 07 and above.
                        conString = ConfigurationManager.ConnectionStrings["Excel07ConString"].ConnectionString;
                        break;
                }
                DataTable dt = new DataTable();
                conString = string.Format(conString, filePath);
                using (OleDbConnection connExcel = new OleDbConnection(conString))
                {
                    using (OleDbCommand cmdExcel = new OleDbCommand())
                    {
                        using (OleDbDataAdapter odaExcel = new OleDbDataAdapter())
                        {
                            cmdExcel.Connection = connExcel;
                            //Get the name of First Sheet.
                            connExcel.Open();
                            DataTable dtExcelSchema;
                            dtExcelSchema = connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                            string sheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();
                            connExcel.Close();
                            //Read Data from First Sheet.
                            connExcel.Open();
                            cmdExcel.CommandText = "SELECT * From [" + sheetName + "]";
                            odaExcel.SelectCommand = cmdExcel;
                            odaExcel.Fill(dt);
                            connExcel.Close();
                        }
                    }
                }
                conString = ConfigurationManager.ConnectionStrings["MDRFDBContext"].ConnectionString;
                using (SqlConnection con = new SqlConnection(conString))
                {
                    using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con))
                    {
                        //Set the database table name.
                        sqlBulkCopy.DestinationTableName = "dbo.Volunteer";
                        //[OPTIONAL]: Map the Excel columns with that of the database table
                        sqlBulkCopy.ColumnMappings.Add("Volunteer_Id", "Volunteer_Id");
                        sqlBulkCopy.ColumnMappings.Add("Volunteer_Name", "Volunteer_Name");
                        sqlBulkCopy.ColumnMappings.Add("Volunteer_Age", "Volunteer_Age");
                        sqlBulkCopy.ColumnMappings.Add("Volunteer_Gender", "Volunteer_Gender");
                        sqlBulkCopy.ColumnMappings.Add("Volunteer_Religion", "Volunteer_Religion");
                        sqlBulkCopy.ColumnMappings.Add("Volunteer_Mother_Tongue", "Volunteer_Mother_Tongue");
                        sqlBulkCopy.ColumnMappings.Add("Volunteer_Phone_No", "Volunteer_Phone_No");
                        sqlBulkCopy.ColumnMappings.Add("Study_Id", "Study_Id");
                        sqlBulkCopy.ColumnMappings.Add("Screening_Status", "Screening_Status");
                        sqlBulkCopy.ColumnMappings.Add("Volunteer_Status", "Volunteer_Status");
                        sqlBulkCopy.ColumnMappings.Add("Consent_Obtained", "Consent_Obtained");
                        sqlBulkCopy.ColumnMappings.Add("Screening_Result_Reason", "Screening_Result_Reason");
                        sqlBulkCopy.ColumnMappings.Add("Screening_Emp_Id", "Screening_Emp_Id");
                        sqlBulkCopy.ColumnMappings.Add("Consent_Form", "Consent_Form");
                        sqlBulkCopy.ColumnMappings.Add("Created_By", "Created_By");
                        sqlBulkCopy.ColumnMappings.Add("Created_Date", "Created_Date");
                        sqlBulkCopy.ColumnMappings.Add("Modified_By", "Modified_By");
                        sqlBulkCopy.ColumnMappings.Add("Modified_Date", "Modified_Date");
                        sqlBulkCopy.ColumnMappings.Add("Approved_By", "Approved_By");
                        sqlBulkCopy.ColumnMappings.Add("Approved_Date", "Approved_Date");
                        sqlBulkCopy.ColumnMappings.Add("Volunteer_Site", "Volunteer_Site");
                        sqlBulkCopy.ColumnMappings.Add("Volunteer_Sub_Status", "Volunteer_Sub_Status");
                        sqlBulkCopy.ColumnMappings.Add("Path", "Path");
                        //sqlBulkCopy.ColumnMappings.Add("Volunteer_Id", "Volunteer_Id");
                        //sqlBulkCopy.ColumnMappings.Add("Volunteer_Id", "Volunteer_Id");
                        //sqlBulkCopy.ColumnMappings.Add("Volunteer_Id", "Volunteer_Id");
                        //sqlBulkCopy.ColumnMappings.Add("Volunteer_Id", "Volunteer_Id");
                        //sqlBulkCopy.ColumnMappings.Add("Volunteer_Id", "Volunteer_Id");
                        //sqlBulkCopy.ColumnMappings.Add("Volunteer_Id", "Volunteer_Id");
                        con.Open();
                        sqlBulkCopy.WriteToServer(dt);
                        con.Close();
                    }
                }
            }
            return Json("Sucess");
        }

在 webconfig 中,我们要添加下面提到的代码:

 <connectionStrings>
    <add name="Excel03ConString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=YES'"/>
    <add name="Excel07ConString" connectionString="Provider=Microsoft.ACE.OLEDB.14.0;Data Source={0};Extended Properties='Excel 8.0;HDR=YES'"/>
    <add name="MDRFDBContext" connectionString="Data Source=fujitsu;Initial Catalog=MDRFDataBase; Connection Timeout=0; User ID=sa; Password=root" providerName="System.Data.SqlClient" /> 
  </connectionStrings>
 using Spire.XLS; 

      string filePath = txt_File_Location.Text;
                    string Access = System.Windows.Forms.Application.StartupPath + "\BRW_SalesOrder";
                    string Excel = txt_File_Location.Text;
                    string connect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Excel + ";Extended Properties=Excel 12.0;";
                    Excel.Application xlApp;
                    Excel.Workbook xlWorkBook;
                    Excel.Worksheet xlWorkSheet;
                    Excel.Range range;
                    string str, str1;
                    int rCnt, rCnt1;
                    int cCnt, cCnt1;
                    int rw = 0;
                    int cl = 0;
                    xlApp = new Excel.Application();
                    xlWorkBook = xlApp.Workbooks.Open(Excel, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "t", false, false, 0, true, 1, 0);
                    xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
                    range = xlWorkSheet.UsedRange;
                    rw = range.Rows.Count;
                    cl = range.Columns.Count;

                    //Ship-Via,Payment-Terms,Po Number, Order-Date
                    Microsoft.Office.Interop.Excel.Range Range_Number_Ship, Range_Number_PT, Range_Number_CPO, Range_Number_OD, r2;
                    Range_Number_Ship = xlWorkSheet.UsedRange.Find("Ship Via");
                    Range_Number_PT = xlWorkSheet.UsedRange.Find("Payment Terms");
                    Range_Number_CPO = xlWorkSheet.UsedRange.Find("Customer PO Number");
                    Range_Number_OD = xlWorkSheet.UsedRange.Find("Order Date");
                    string f_number_Ship = "", f_number_PT = "", f_number_CPO = "", f_number_OD = "";
                    r2 = xlWorkSheet.Cells;
                    int n_c_Ship = Range_Number_Ship.Column;
                    int n_r_Ship = Range_Number_Ship.Row;
                    int n_c_PT = Range_Number_PT.Column;
                    int n_r_PT = Range_Number_PT.Row;
                    int n_c_CPO = Range_Number_CPO.Column;
                    int n_r_CPO = Range_Number_CPO.Row;
                    int n_c_OD = Range_Number_OD.Column;
                    int n_r_OD = Range_Number_OD.Row;
                    var number_Ship = ((Range)r2[n_r_Ship, n_c_Ship + 4]).Value;
                    f_number_Ship = (string)number_Ship;
                    var number_PT = ((Range)r2[n_r_PT, n_c_PT + 4]).Value;
                    f_number_PT = (string)number_PT;
                    var number_CPO = ((Range)r2[n_r_CPO, n_c_CPO + 4]).Value;
                    f_number_CPO = (string)number_CPO;
                    var number_OD = ((Range)r2[n_r_OD, n_c_OD + 4]).Value;
                    f_number_OD = ((DateTime)number_OD).ToString("MM/dd/yyyy");
                    //Ship-Address
                    Microsoft.Office.Interop.Excel.Range Range_Number_SHIPADD, r6;
                    Range_Number_SHIPADD = xlWorkSheet.UsedRange.Find("Ship To");
                    string f_number_SHIPADD = ""; ;
                    r6 = xlWorkSheet.Cells;
                    int n_c_SHIPADD = Range_Number_SHIPADD.Column;
                    int n_r_SHIPADD = Range_Number_SHIPADD.Row;
                    for (rCnt = n_r_SHIPADD + 1; rCnt <= rw; n_r_SHIPADD++)
                    {
                        var number_SHIPADD = ((Range)r6[n_r_SHIPADD + 1, n_c_SHIPADD]).Value;
                        if (number_SHIPADD == null)
                        {
                            break;
                        }
                        else
                        {
                            f_number_SHIPADD = (string)number_SHIPADD;
                        }
                    }
                    //Sales-Representation
                    Microsoft.Office.Interop.Excel.Range Range_Number_SalesRep, r7;
                    Range_Number_SalesRep = xlWorkSheet.UsedRange.Find("Sales Rep");
                    string f_number_SalesRep = ""; ;
                    r7 = xlWorkSheet.Cells;
                    int n_c_SalesRep = Range_Number_SalesRep.Column;
                    int n_r_SalesRep = Range_Number_SalesRep.Row;
                    for (rCnt = n_r_SalesRep + 1; rCnt <= rw; n_r_SalesRep++)
                    {
                        var number_SalesRep = ((Range)r7[n_r_SalesRep, n_c_SalesRep]).Value;
                        if (number_SalesRep == null)
                        {
                            break;
                        }
                        else
                        {
                            f_number_SalesRep = (string)number_SalesRep;
                            StringBuilder sb = new StringBuilder();
                            sb.AppendLine(f_number_SalesRep);

                            string pattern = @"Sales Rep: [A-Za-z]+s[A-Za-z]+";
                            var result = Regex.Match(f_number_SalesRep, pattern, RegexOptions.Multiline).ToString().Split(':')[1];
                            f_number_SalesRep = result.ToString();

                            //  string test = f_number_SalesRep.Substring(f_number_SalesRep.IndexOf("Sales Rep"), (f_number_SalesRep.IndexOf("nPhone") - f_number_SalesRep.IndexOf("Sales Rep"))).Split(':')[1];
                            //  MessageBox.Show(test);
                        }
                    }
                    //Product-Code
                    Microsoft.Office.Interop.Excel.Range Range_Number_Produ, r;
                    Range_Number_Produ = xlWorkSheet.UsedRange.Find("Produ");
                    string f_number_Produ = "";
                    r = xlWorkSheet.Cells;
                    int n_c = Range_Number_Produ.Column;
                    int n_r = Range_Number_Produ.Row;
                    string product_no;
                    //Product-Desc
                    Microsoft.Office.Interop.Excel.Range Range_Number_Descr, r3;
                    Range_Number_Descr = xlWorkSheet.UsedRange.Find("Description");
                    string f_number_Descr = "", f_new_Desc = "";
                    r3 = xlWorkSheet.Cells;
                    int n_c_Descr = Range_Number_Descr.Column;
                    int n_r_Descr = Range_Number_Descr.Row;
                    rCnt1 = n_r + 1;
                    rCnt = n_r_Descr + 1;
                    //Unit Price
                    Microsoft.Office.Interop.Excel.Range Range_Number_UP, r4;
                    Range_Number_UP = xlWorkSheet.UsedRange.Find("Unit Price");
                    double f_number_UP;
                    r4 = xlWorkSheet.Cells;
                    int n_c_UP = Range_Number_UP.Column;
                    int n_r_UP = Range_Number_UP.Row;
                    int rCnt3 = n_r_UP + 1;

                    //Quantity

                    Microsoft.Office.Interop.Excel.Range Range_Number_QTY, r5;
                    Range_Number_QTY = xlWorkSheet.UsedRange.Find("Qty");
                    double f_number_QTY;
                    r5 = xlWorkSheet.Cells;
                    int n_c_QTY = Range_Number_QTY.Column;
                    int n_r_QTY = Range_Number_QTY.Row;
                    int rCnt4 = n_r_QTY + 1;
                    string bn;
                test:
                    for (; rCnt1 <= rw; )
                    {
                        var number_Produ = ((Range)r[n_r + 1, n_c]).Value;
                        f_number_Produ = (string)number_Produ;
                        if (f_number_Produ != null)
                        {
                            //MessageBox.Show(f_number_Produ);
                            product_no = f_number_Produ;
                            // comboBox2.Items.Add(product_no);
                            for (; rCnt <= rw; )
                            {
                                var number_Descr = ((Range)r3[n_r_Descr + 1, n_c_Descr - 1]).Value;
                                f_number_Descr = (string)number_Descr;
                                if (f_number_Descr != "Sub Total:")
                                {
                                    f_new_Desc = f_number_Descr;
                                    for (; rCnt4 <= rw; )
                                    {
                                        var number_QTY = (((Range)r5[n_r_QTY + 1, n_c_QTY]).Value).ToString();
                                        bn = "Buyer Name:";
                                        if (number_QTY == bn)
                                        {
                                            break;
                                        }
                                        else
                                        {
                                            f_number_QTY = double.Parse(number_QTY.ToString());
                                        }
                                        for (; rCnt3 <= rw; )
                                        {
                                            var number_UP = ((Range)r4[n_r_UP + 1, n_c_UP - 1]).Value;
                                            if (number_UP != null)
                                            {
                                                f_number_UP = double.Parse(number_UP.ToString());
                                                //string filePath1 = "D:\PDF Brandwise Orders for MIke.xlsx";
                                                //string Access1 = "D:\BRW_SalesOrder.mdb";
                                                //string Excel11 = "D:\PDF Brandwise Orders for MIke.xlsx";
                                                //string connect1 = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Excel + ";Extended Properties=Excel 12.0;";
                                                using (OleDbConnection conn = new OleDbConnection(connect))
                                                {
                                                    using (OleDbCommand cmd = new OleDbCommand())
                                                    {
                                                        OleDbCommand cmd2 = new OleDbCommand();
                                                        cmd2.Connection = conn;
                                                        cmd.Connection = conn;
                                                        conn.Close();
                                                        conn.Open();
                                                        cmd.CommandText = "INSERT INTO [MS Access;Database=" + Access + "].[Excel_table] (Division,[Customer ID],[Order Date],[Terms Code],[Salesperson],[Ship Via],[Ship To Address Code],[Customer PO],[Item Code]) values('00','" + f_number_CPO + "','" + f_number_OD + "','" + f_number_PT + "','" + f_number_SalesRep + "','" + f_number_Ship + "','" + f_number_SHIPADD + "','" + f_number_CPO + "','" + f_number_Produ + "')";
                                                        cmd.ExecuteNonQuery();
                                                        cmd2.CommandText = "UPDATE [MS Access;Database=" + Access + "].[Excel_table] set [Item Description]='" + f_new_Desc + "', [Unit Price]='" + f_number_UP + "', [Quantity Ordered]='" + f_number_QTY + "' where [Item Code]='" + product_no + "' and Salesperson='" + f_number_SalesRep + "' and [Order Date]='" + f_number_OD + "' ";
                                                        cmd2.ExecuteNonQuery();
                                                        n_r++;
                                                        n_r_Descr++;
                                                        n_r_UP++;
                                                        n_r_QTY++;
                                                        goto test;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                                else
                                {
                                    break;
                                }
                            }
                        }
                        else
                        {
                            break;
                        }
                    }
                    xlWorkBook.Close(true, null, null);
                    xlApp.Quit();
                    Marshal.ReleaseComObject(xlWorkSheet);
                    Marshal.ReleaseComObject(xlWorkBook);
                    Marshal.ReleaseComObject(xlApp);   
                    MessageBox.Show("Sucessfully upl
oaded...");

最新更新