csharp,using System.Data.OleDb;,// 打开Excel文件连接,string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=path_to_excel;Extended Properties='Excel 12.0 Xml;HDR=YES'";,using (OleDbConnection conn = new OleDbConnection(connStr)),{, conn.Open();, string query = "SELECT FROM [Sheet1$]";, OleDbCommand cmd = new OleDbCommand(query, conn);, OleDbDataReader reader = cmd.ExecuteReader();, while (reader.Read()), {, // 获取Excel数据, int id = Convert.ToInt32(reader["ID"]);, string name = reader["Name"].ToString();, // 更新数据库, string updateQuery = $"UPDATE TableName SET Name = '{name}' WHERE ID = {id}";, using (SqlConnection dbConn = new SqlConnection("your_connection_string")), {, dbConn.Open();, SqlCommand dbCmd = new SqlCommand(updateQuery, dbConn);, dbCmd.ExecuteNonQuery();, }, },},
“
在C#中上传Excel文件并更新数据库是一个常见的需求,尤其是在处理大量数据导入和更新时,以下是实现这一功能的详细步骤:
安装必要的NuGet包:
EPPlus
:用于读取和写入Excel文件。
Dapper
:一个轻量级的ORM,用于执行数据库操作。
System.Data.SqlClient
:用于连接SQL Server数据库(如果使用其他数据库,请安装相应的客户端库)。
Install-Package EPPlus Install-Package Dapper Install-Package System.Data.SqlClient
使用EPPlus库读取Excel文件中的数据,假设Excel文件有多个工作表,每个工作表包含不同的数据类型。
using OfficeOpenXml; using System.IO; using System.Data; public DataTable ReadExcelFile(string filePath, string sheetName) { using (var package = new ExcelPackage(new FileInfo(filePath))) { var worksheet = package.Workbook.Worksheets[sheetName]; var dataTable = new DataTable(); foreach (var firstRowCell in worksheet.Cells[1, 1, 1, worksheet.Dimension.End.Column]) { dataTable.Columns.Add(firstRowCell.Text); } for (int rowNumber = 2; rowNumber <= worksheet.Dimension.End.Row; rowNumber++) { var row = worksheet.Cells[rowNumber, 1, rowNumber, worksheet.Dimension.End.Column]; var newRow = dataTable.NewRow(); foreach (var cell in row) { newRow[cell.Start.Column 1] = cell.Text; } dataTable.Rows.Add(newRow); } return dataTable; } }
使用Dapper库将读取到的Excel数据更新到数据库中,假设我们有一个名为Employees
的表,并且Excel文件中的数据需要插入或更新该表中的数据。
using Dapper; using System.Data.SqlClient; public void UpdateDatabase(DataTable dataTable, string connectionString) { using (var connection = new SqlConnection(connectionString)) { connection.Open(); // 清空目标表(可选) connection.Execute("DELETE FROM Employees"); // 批量插入数据 foreach (DataRow row in dataTable.Rows) { var parameters = new DynamicParameters(); for (int i = 0; i < dataTable.Columns.Count; i++) { parameters.Add($"@{dataTable.Columns[i].ColumnName}", row[i]); } connection.Execute("INSERT INTO Employees (" + string.Join(", ", dataTable.Columns.Cast<DataColumn>().Select(c => c.ColumnName)) + ") VALUES (" + string.Join(", ", Enumerable.Repeat("@p{0}", dataTable.Columns.Count).Select((v, i) => v.Replace("{0}", i.ToString()))) + ")", parameters); } } }
将上述两部分代码整合到一个方法中,实现从Excel文件读取数据并更新数据库的功能。
public void UploadExcelAndUpdateDatabase(string excelFilePath, string sheetName, string connectionString) { var dataTable = ReadExcelFile(excelFilePath, sheetName); UpdateDatabase(dataTable, connectionString); }
在主程序或其他适当位置调用上述方法。
class Program { static void Main() { string excelFilePath = "path/to/your/excel/file.xlsx"; string sheetName = "Sheet1"; string connectionString = "your_database_connection_string"; var app = new YourAppClass(); app.UploadExcelAndUpdateDatabase(excelFilePath, sheetName, connectionString); } }
Q1: 如果Excel文件中的工作表名称不固定,如何动态获取所有工作表的名称?
A1: 可以使用EPPlus库的Workbook.Worksheets
属性来获取所有工作表的名称,以下是一个示例代码片段:
using OfficeOpenXml; using System.IO; using System.Collections.Generic; public List<string> GetSheetNames(string filePath) { using (var package = new ExcelPackage(new FileInfo(filePath))) { return package.Workbook.Worksheets.Select(ws => ws.Name).ToList(); } }
Q2: 如果需要更新现有记录而不是插入新记录,应该如何修改代码?
A2: 可以将插入语句改为更新语句,并根据某个唯一标识符(如ID)来匹配需要更新的记录,以下是一个示例代码片段:
using Dapper; using System.Data.SqlClient; public void UpdateDatabase(DataTable dataTable, string connectionString) { using (var connection = new SqlConnection(connectionString)) { connection.Open(); foreach (DataRow row in dataTable.Rows) { var parameters = new DynamicParameters(); for (int i = 0; i < dataTable.Columns.Count; i++) { if (dataTable.Columns[i].ColumnName == "ID") // 假设ID是主键列 { parameters.Add("@ID", row["ID"], DbType.Int32); } else { parameters.Add($"@{dataTable.Columns[i].ColumnName}", row[i]); } } connection.Execute("UPDATE Employees SET [Column1] = @Column1, [Column2] = @Column2 WHERE ID = @ID", parameters); } } }