如何将Excel的GridView数据导入ASPxGridView并存入SQL Server数据库
实现需求的代码调整方案
1 基础调整:绑定数据到ASPxGridView
你现有代码仅完成了读取Excel数据绑定到标准GridView的逻辑,首先做如下基础修改:
- 确保页面中已正确引入DevExpress控件库,且ASPxGridView控件已声明(假设控件ID为
ASPxGridView1,可替换为你实际的ID) - 补充缺失的DataSet实例化、上传文件校验逻辑,新增using语句自动释放OLEDB相关资源,避免内存泄漏
- 替换原有GridView绑定逻辑为ASPxGridView绑定
- 适配xls、xlsx两种格式的Excel连接字符串
基础调整后的代码如下:
using System.Data.OleDb; using System.Data.SqlClient; using System.Configuration; using System.IO; protected void btnUpload_Click(object sender, EventArgs e) { // 上传文件有效性校验 if (!FileUpload1.HasFile) return; string fileName = Path.GetFileName(FileUpload1.FileName); string filePath = Server.MapPath("~/Temp/" + fileName); // 临时保存上传的Excel文件 FileUpload1.SaveAs(filePath); // 区分Excel版本生成对应连接字符串 string ext = Path.GetExtension(fileName); string ConStr; if (ext.Equals(".xls", StringComparison.OrdinalIgnoreCase)) { ConStr = $"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={filePath};Extended Properties='Excel 8.0;HDR=YES;IMEX=1;'"; } else { ConStr = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={filePath};Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1;'"; } DataSet ds = new DataSet(); string query = "SELECT * FROM [Sheet$]"; // using自动释放数据库连接资源 using (OleDbConnection conn = new OleDbConnection(ConStr)) { if (conn.State == ConnectionState.Closed) { conn.Open(); } OleDbCommand cmd = new OleDbCommand(query, conn); OleDbDataAdapter da = new OleDbDataAdapter(cmd); da.Fill(ds); } // 临时保存数据表到Session,避免回发时数据丢失 Session["ExcelImportData"] = ds.Tables[0]; // 绑定数据到ASPxGridView ASPxGridView1.DataSource = ds.Tables[0]; ASPxGridView1.DataBind(); // 删除临时保存的Excel文件 File.Delete(filePath); }
2 新增逻辑:数据保存到SQL Server数据库
根据业务场景选择以下两种实现方式:
方案1:SqlBulkCopy批量插入(适合数据量较大、无需逐行校验的场景)
将以下代码添加到上述方法的File.Delete(filePath);之前即可:
// 替换为你实际的SQL Server连接字符串名称(需在Web.config中提前配置) string sqlConStr = ConfigurationManager.ConnectionStrings["SqlServerConn"].ConnectionString; using (SqlConnection sqlConn = new SqlConnection(sqlConStr)) { sqlConn.Open(); using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn)) { // 替换为你实际的SQL Server目标表名 bulkCopy.DestinationTableName = "业务表名"; // 若Excel列名和SQL表列名不一致,需手动添加映射关系,示例如下: // bulkCopy.ColumnMappings.Add("Excel列名A", "SQL表列名A"); // bulkCopy.ColumnMappings.Add("Excel列名B", "SQL表列名B"); bulkCopy.WriteToServer(ds.Tables[0]); } }
方案2:逐行插入(适合需要对每行数据做业务校验、数据量较小的场景)
将以下代码添加到上述方法的File.Delete(filePath);之前即可:
string sqlConStr = ConfigurationManager.ConnectionStrings["SqlServerConn"].ConnectionString; using (SqlConnection sqlConn = new SqlConnection(sqlConStr)) { sqlConn.Open(); foreach (DataRow row in ds.Tables[0].Rows) { // 此处可自定义添加数据校验逻辑,不符合要求的数据可直接跳过插入 // 替换为你实际的插入SQL语句和对应参数 string insertSql = "INSERT INTO 业务表名(字段1,字段2,字段3) VALUES(@v1,@v2,@v3)"; SqlCommand cmd = new SqlCommand(insertSql, sqlConn); cmd.Parameters.AddWithValue("@v1", row["Excel对应列1"]); cmd.Parameters.AddWithValue("@v2", row["Excel对应列2"]); cmd.Parameters.AddWithValue("@v3", row["Excel对应列3"]); cmd.ExecuteNonQuery(); } }
3 可选优化
如果需要支持用户在ASPxGridView中编辑数据后再保存到数据库,可单独新增保存按钮,点击时读取Session["ExcelImportData"]存储的DataTable,或者直接遍历ASPxGridView的行获取修改后的数据,再执行上述SQL插入逻辑即可。
内容的提问来源于stack exchange,提问作者kaziveh
相关产品推荐
相关产品推荐

