C# WinForm 读取 Excel 并写入 SQL Server 数据库完整流程

青禾
青禾
发布时间:2026-10-14 | 4人浏览过
原创

在 C# Windows Forms (WinForm) 开发中,经常需要处理本地数据文件的导入需求。本文将演示如何构建一个简易窗体应用,通过按钮触发文件选择对话框获取 Excel 路径,随后使用 OLEDB 接口解析 Excel 数据,最终将这些数据逐行插入到 SQL Server 数据库中,提供一份可直接参考的代码逻辑。

实现思路与准备

要实现 Excel 到 SQL Server 的数据迁移,核心步骤包括界面交互、文件解析和数据库操作。我们需要一个 UI 来展示选中的文件路径,两个主要事件:一是触发打开文件对话框,二是执行数据处理。对于数据处理部分,由于原文未提供具体的 ReadExcel 实现及数据库连接细节,我们将补充标准的 OLEDB 读取方法和基础的 ADO.NET 插入逻辑,确保流程闭环。

注意:操作涉及数据库写入,请在测试环境中先备份现有数据,避免误操作导致数据丢失。

第一步:构建基础界面与文件选择

首先,在 Visual Studio 中创建一个新的 Windows Forms 项目。在 Form 设计器上添加以下控件:

  • TextBox:用于显示选中的 Excel 文件绝对路径(建议设置 ReadOnly = true)。
  • Button (命名为 btnSelect):点击后弹出文件选择对话框。
  • Button (命名为 btnProcess):点击后执行 Excel 读取并入库操作。

双击 btnSelect 按钮生成点击事件,编写代码如下。此处修复了原稿中变量名不一致 (openFiledialog1 vs openFileDialog1) 及拼写错误 (sendeer -> sender, EventArg -> EventArgs) 的问题:

private void btnSelect_Click(object sender, EventArgs e)
{
    // 创建 OpenFileDialog 实例
    OpenFileDialog openFileDialog1 = new OpenFileDialog();
    
    // 设置过滤器,仅允许选择 Excel 文件 (.xls 和 .xlsx 均需支持)
    openFileDialog1.Filter = "Excel文件|*.xls;*.xlsx";
    openFileDialog1.Title = "请选择Excel文件";
    
    // 显示对话框并检查用户是否点击了确定
    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
        // 将选中文件的路径显示在 TextBox 中
        textBox1.Text = openFileDialog1.FileName;
    }
}

第二步:解析 Excel 数据

接下来实现 ReadExcel 方法。我们将使用 System.Data.OleDb 命名空间下的 OleDbConnection 和 OleDbDataAdapter 来读取 Excel。假设 Excel 文件的第一行为标题行,后续行为数据行。

using System.Data;
using System.Data.OleDb;

private DataSet ReadExcel(string excelPath)
{
    string connString = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={excelPath};Extended Properties=\"Excel 12.0 Xml;HDR=YES\";";
    
    // HDR=YES 表示第一行是列名
    string query = "SELECT * FROM [Sheet1$]"; // 根据实际情况可能需要更改 Sheet 名称
    
    using (OleDbConnection conn = new OleDbConnection(connString))
    {
        conn.Open();
        using (OleDbDataAdapter adapter = new OleDbDataAdapter(query, conn))
        {
            DataSet ds = new DataSet();
            adapter.Fill(ds);
            return ds;
        }
    }
}

第三步:将数据存入 SQL Server

最后,双击 btnProcess 按钮实现数据入库逻辑。这里演示如何将 DataTable 中的数据遍历并使用参数化查询插入 SQL Server,以防止 SQL 注入风险。

using System.Data.SqlClient;

private void btnProcess_Click(object sender, EventArgs e)
{
    if (string.IsNullOrWhiteSpace(textBox1.Text))
    {
        MessageBox.Show("请先选择Excel文件!");
        return;
    }

    try
    {
        // 1. 读取 Excel 数据
        DataSet dtSet = ReadExcel(textBox1.Text);
        if (dtSet == null || dtSet.Tables.Count == 0 || dtSet.Tables[0].Rows.Count == 0)
        {
            MessageBox.Show("Excel 文件为空或格式无效。");
            return;
        }

        DataTable excelData = dtSet.Tables[0];

        // 2. 定义 SQL 连接字符串(请替换为实际的服务器地址和库名)
        string sqlConnString = "Server=localhost;Database=MyDB;User Id=sa;Password=yourpassword;";

        using (SqlConnection conn = new SqlConnection(sqlConnString))
        {
            conn.Open();
            
            // 定义插入语句,假设表中至少有 Name 和 Value 两列,具体根据实际表结构调整
            string insertSql = "INSERT INTO TargetTable (Column1, Column2) VALUES (@Col1, @Col2)";

            using (SqlCommand cmd = new SqlCommand(insertSql, conn))
            {
                // 添加参数
                cmd.Parameters.Add("@Col1", SqlDbType.NVarChar).Size = 50;
                cmd.Parameters.Add("@Col2", SqlDbType.Float);

                // 3. 遍历 Excel 数据行进行插入
                foreach (DataRow row in excelData.Rows)
                {
                    // 示例:假设 Excel 第一列映射到 Column1,第二列映射到 Column2
                    cmd.Parameters["@Col1"].Value = row[0]?.ToString();
                    cmd.Parameters["@Col2"].Value = Convert.ToDouble(row[1]);
                    
                    cmd.ExecuteNonQuery();
                }
            }
        }
        
        MessageBox.Show("数据导入成功!");
    }
    catch (Exception ex)
    {
        MessageBox.Show($"导入失败: {ex.Message}");
    }
}

以上代码构成了从选择文件、解析 Excel 到写入数据库的完整闭环。请注意,实际使用时需根据 Excel 的具体列名、数据类型以及目标 SQL Server 表结构调整字段映射关系。此外,对于超大型 Excel 文件,建议使用 OleDB 的流式读取方式或第三方库如 EPPlus 以提高性能。

以上就是 C# WinForm 读取 EXCEL 并存入 SQL 数据库的详细内容,更多关于 C# 数据操作与数据库集成的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表