使用 C# 和 ASP.NET 将数据从 Excel 文件导出到 SQL Server 表的最佳方法? [复制]

Posted

技术标签:

【中文标题】使用 C# 和 ASP.NET 将数据从 Excel 文件导出到 SQL Server 表的最佳方法? [复制]【英文标题】:Best approach to export data from Excel file to SQL Server table using C# and ASP.NET? [duplicate] 【发布时间】:2020-04-29 17:54:23 【问题描述】:

我制作了一个小网络应用程序,让用户能够将 .xlsx 文件上传到服务器的数据库表,但我遇到了 OLEDB 连接字符串:

System.InvalidOperationException: 'El proofedor 'Microsoft.ACE.OLEDB.12.0' no está registrado en elequipo local。'

由于应用程序将被上传到公司的服务器,因此安装 x32 驱动程序是不可行的,并且将项目更改为以 x32 版本运行也无济于事。我正在寻找一种更好的方法来实现这一点,并将 .xlsx 文件保留为用户输入。

protected void btnImportar_Click(object sender, EventArgs e)

        //SUBE Y GUARDA ARCHIVO
        string rutaArchivo = Server.MapPath(subeArchivo.FileName);

        string excelPath = Server.MapPath("~/cargas/") + Path.GetFileName(subeArchivo.PostedFile.FileName)/* + "_" + DateTime.Now.ToString("yyyyMMdd")*/;
        lblRutaArchivo.Text = rutaArchivo;

        subeArchivo.SaveAs(excelPath);

        string conStringExcel = string.Empty;
        string extension = Path.GetExtension(subeArchivo.PostedFile.FileName);

        switch (extension)
        
            case ".xls": //Excel 97-03
                conStringExcel = ConfigurationManager.ConnectionStrings["Excel03conStringExcel"].ConnectionString;
                break;

            case ".xlsx": //Excel 07 or higher
                conStringExcel = ConfigurationManager.ConnectionStrings["Excel07+conStringExcel"].ConnectionString;
                break;
        

        conStringExcel = string.Format(conStringExcel, excelPath);

        using (OleDbConnection connExcel = new OleDbConnection(conStringExcel))
        
            connExcel.Open(); // ERROR SHOWS UP HERE
            string hojaExcel = connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null).Rows[0]["CAR_DCT"].ToString();
            DataTable dtExcelData = new DataTable();

            //TODAS LAS COLUMNAS COMO STRING
            dtExcelData.Columns.AddRange(new DataColumn[7] 
               new DataColumn("ID_USU_CAR", typeof(string)),
               new DataColumn("RUT_DCT", typeof(string)),
               new DataColumn("TIP_CON", typeof(string)),
               new DataColumn("ID_CON", typeof(string)),
               new DataColumn("INI_BEN", typeof(string)),
               new DataColumn("FIN_BEN", typeof(string)),
               new DataColumn("MON_CLP", typeof(string))
            );

            using (OleDbDataAdapter oda = new OleDbDataAdapter("SELECT * FROM [" + hojaExcel + "]", connExcel))
            
                oda.Fill(dtExcelData);
            

            connExcel.Close();

            using (connSQL)
            
                using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(connSQL))
                
                    //Set the database table name
                    sqlBulkCopy.DestinationTableName = "dbo.TH_AD.CAR_DCT_BEN_TMP";

                    //MAPEO COLUMNAS
                    //ID_USU_CARGA RUT_DV  TIP_CON ID_CON  INI_BEN FIN_BEN MON_CLP

                    sqlBulkCopy.ColumnMappings.Add("ID_USU_CAR", "ID_USU_CAR");
                    sqlBulkCopy.ColumnMappings.Add("RUT_DCT", "RUT_DCT");
                    sqlBulkCopy.ColumnMappings.Add("TIP_CON", "TIP_CON");
                    sqlBulkCopy.ColumnMappings.Add("ID_CON", "ID_CON");
                    sqlBulkCopy.ColumnMappings.Add("INI_BEN", "INI_BEN");
                    sqlBulkCopy.ColumnMappings.Add("FIN_BEN", "FIN_BEN");
                    sqlBulkCopy.ColumnMappings.Add("MON_CLP", "MON_CLP");

                    connSQL.Open();
                    sqlBulkCopy.WriteToServer(dtExcelData);
                    connSQL.Close();
                
            
        

【问题讨论】:

如果您使用 SQL 连接,您可以使用 SqlConnection 代替。它比 OleDb 更有效,但限制您使用 SQL。此外,您可能应该考虑使用 hojaExcel 的参数来避免 sql 注入。 【参考方案1】:

尝试检查 Spire.XLS,它具有获取 DataTable 的功能,然后您可以加载到您的批量功能。

【讨论】:

以上是关于使用 C# 和 ASP.NET 将数据从 Excel 文件导出到 SQL Server 表的最佳方法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何从asp.net中的js函数调用c#函数?

如何使用 C# 从 ASP.NET 中的 SQL Server 数据库中检索和显示 GridView 中的值

使用asp.net gridview和c#从phpmyadmin数据库显示图像

如何从列表视图中获取数据作为字符串 C# asp.net

将数据传递到处理程序的 Jquery ajax 不起作用(Asp.net、C#、Jquery)

如何从 ASP.net MVC 程序中获取纯 c# 程序中的 JSON 数据?