.NET用C#导入Excel数据到数据库

将Excel文件中的数据导入到数据库中不仅能够提升数据处理的效率和准确性,还能极大地促进数据分析和决策制定的过程。尤其在企业级应用中,Excel作为数据输入和初步整理的工具非常普遍,但其功能对于复杂查询、大规模数据管理和跨部门的数据共享来说有所局限。通过使用C#在.NET平台上实现这一过程,可以充分利用其强大的数据操作能力和丰富的库支持,确保数据从Excel无缝迁移到诸如SQLite等关系型数据库中 ,从而实现更高效的数据管理、增强的数据安全性和更好的性能优化,同时为后续的数据挖掘和商业智能分析打下坚实的基础。

本文将介绍如何在.NET平台使用C#导入Excel文件数据到数据库中

文章目录

本文所使用的方法需要用到免费的Free Spire.XLS for .NET,NuGet:PM> Install-Package FreeSpire.XLS,以及System.Data.SQLite,NuGet:PM> Install-Package System.Data.SQLite

导入Excel数据到SQLite数据库

我们可以使用Free Spire.XLS for .NET中的Workbook.LoadFromFile方法载入Excel文件,然后使用CellRange.Value读取单元格的数据,并搭配System.Data.SQLite模块将数据写入到SQLite数据库中。以下是操作步骤示例:

以下是将提供的C#代码转换为操作步骤的介绍:

  1. 设置SQLite数据库文件路径为Sample.db,并指定Excel输出文件路径为output/DatabaseToExcel.xlsx
  2. 创建一个新的Workbook实例以表示Excel工作簿,并清除默认的工作表。
  3. 使用SQLiteConnection创建一个到SQLite数据库的新连接,并打开这个连接。
  4. 通过调用GetSchema("Tables")从数据库获取所有表的名字,并存储在一个DataTable对象中。
  5. 遍历每个表名:
    • 对于每个表,添加一个新的工作表到工作簿中,工作表名称设为当前表名。
  6. 构建SQL查询语句以选择表中的所有数据,并使用SQLiteCommand执行此查询。
  7. 使用SQLiteDataReader读取查询结果,并进行以下操作:
    • 获取列名并将它们写入新工作表的第一行。
    • 设置第一行(即标题行)的字体样式为粗体,字号为12。
  8. 继续遍历数据行,并对每一行执行以下操作:
    • 将每一行的数据值写入相应的单元格中。
    • 自动调整每列的宽度以适应内容。
    • 设置数据行的字体大小为11。
  9. 关闭与SQLite数据库的连接。
  10. 保存生成的工作簿到之前定义的Excel文件路径,并释放workbook对象使用的资源。

代码示例:

csharp 复制代码
using System.Data.SQLite;
using Spire.Xls;

namespace ExcelToSQLite
{
    class Program
    {
        static void Main(string[] args)
        {
            // Excel 文件路径
            string excelFilePath = "G:/Documents/Sample37.xlsx";

            // SQLite 数据库路径
            string sqliteFilePath = "output/Database.db";

            // 打开 Excel 文件
            Workbook workbook = new Workbook();
            workbook.LoadFromFile(excelFilePath);

            // 如果数据库文件不存在,则创建它
            if (!File.Exists(sqliteFilePath))
            {
                SQLiteConnection.CreateFile(sqliteFilePath);
                Console.WriteLine("已创建新的 SQLite 数据库文件:output.db");
            }

            // 创建 SQLite 连接
            using (SQLiteConnection connection = new SQLiteConnection($"Data Source={sqliteFilePath};Version=3;"))
            {
                connection.Open();

                // 遍历每个工作表
                foreach (Worksheet sheet in workbook.Worksheets)
                {
                    string tableName = sheet.Name;

                    // 获取第一行作为列名
                    var columns = sheet.Rows[0].CellList;
                    string createTableQuery = $"CREATE TABLE IF NOT EXISTS [{tableName}] (";

                    foreach (var column in columns)
                    {
                        createTableQuery += $"[{column.Value}] TEXT,";
                    }
                    createTableQuery = createTableQuery.TrimEnd(',') + ");";

                    // 创建表
                    using (SQLiteCommand createTableCommand = new SQLiteCommand(createTableQuery, connection))
                    {
                        createTableCommand.ExecuteNonQuery();
                    }

                    // 插入数据
                    for (int i = 1; i < sheet.Rows.Length; i++) // 跳过第一行
                    {
                        var row = sheet.Rows[i];
                        string insertQuery = $"INSERT INTO [{tableName}] VALUES (";
                        foreach (var cell in row.CellList)
                        {
                            insertQuery += $"'{cell.Value?.Replace("'", "''")}',"; // 防止 SQL 注入
                        }
                        insertQuery = insertQuery.TrimEnd(',') + ");";

                        using (SQLiteCommand insertCommand = new SQLiteCommand(insertQuery, connection))
                        {
                            insertCommand.ExecuteNonQuery();
                        }
                    }
                }

                connection.Close();
                workbook.Dispose();
            }

            Console.WriteLine("Excel 数据已成功写入新的 SQLite 数据库!");
        }
    }
}

结果

导入Excel数据到SQLite数据库

写入到Access数据库则需要用到System.Data.OleDb模块,以下是操作步骤示例:

以下是将提供的C#代码转换为操作步骤的介绍:

  1. 设置Excel文件路径为Sample.xlsx,并指定Access数据库文件路径为output/Database.accdb
  2. 使用Workbook类打开指定路径的Excel文件,并加载该文件到内存中。
  3. 创建一个用于连接Access数据库的OleDb连接字符串。
  4. 检查Access数据库文件是否存在。如果不存在,则提示用户首先创建Access数据库文件,并终止程序执行。
  5. 创建一个新的OleDb连接对象,并打开与Access数据库的连接。
  6. 遍历Excel工作簿中的每个工作表:
    • 获取当前工作表的名称,并将其作为新表的名称。
  7. 从工作表的第一行获取列名,并构建创建新表的SQL语句,假定所有列的数据类型均为文本类型(TEXT)。
  8. 尝试执行以下操作,对于每个工作表:
    • 使用构建的CREATE TABLE SQL语句创建新的表。
  9. 对于每个工作表中的每一行数据(跳过第一行,因为它包含列名):
    • 构建INSERT INTO SQL语句以插入数据行,同时处理可能的SQL注入问题,例如通过转义单引号。
  10. 执行构建的INSERT INTO命令,将一行数据插入到对应的Access表中。
  11. 如果在处理某个工作表时发生错误,捕获异常并打印错误信息,继续处理下一个工作表。
  12. 关闭与Access数据库的连接,并释放workbook对象使用的资源。

代码示例:

csharp 复制代码
using System.Data.OleDb;
using Spire.Xls;

namespace ExcelToAccess
{
    class Program
    {
        static void Main(string[] args)
        {
            // Excel 文件路径
            string excelFilePath = "G:/Documents/Sample37.xlsx";

            // Access 数据库路径
            string accessDbPath = "output/Database.accdb";

            // 打开 Excel 文件
            Workbook workbook = new Workbook();
            workbook.LoadFromFile(excelFilePath);

            // 为 Access 创建 OleDb 连接字符串
            string connectionString = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={accessDbPath};Persist Security Info=False;";

            // 如果数据库文件不存在,提示创建 - 注意:此步骤通常在代码外部完成
            if (!System.IO.File.Exists(accessDbPath))
            {
                Console.WriteLine("请先创建一个 Access 数据库文件。");
                return;
            }

            // 创建 OleDb 连接
            using (OleDbConnection connection = new OleDbConnection(connectionString))
            {
                connection.Open();

                // 遍历每个工作表
                foreach (Worksheet sheet in workbook.Worksheets)
                {
                    string tableName = sheet.Name;

                    // 获取第一行作为列名
                    var columns = sheet.Rows[0].CellList;
                    string createTableQuery = $"CREATE TABLE [{tableName}] (";

                    foreach (var column in columns)
                    {
                        createTableQuery += $"[{column.Value}] TEXT,"; // 假设所有列都是文本类型
                    }
                    createTableQuery = createTableQuery.TrimEnd(',') + ");";

                    try
                    {
                        // 创建表
                        using (OleDbCommand createTableCommand = new OleDbCommand(createTableQuery, connection))
                        {
                            createTableCommand.ExecuteNonQuery();
                        }

                        // 插入数据
                        for (int i = 1; i < sheet.Rows.Length; i++) // 跳过第一行
                        {
                            var row = sheet.Rows[i];
                            string insertQuery = $"INSERT INTO [{tableName}] VALUES (";
                            foreach (var cell in row.CellList)
                            {
                                insertQuery += $"'{cell.Value?.Replace("'", "''")}',"; // 防止 SQL 注入
                            }
                            insertQuery = insertQuery.TrimEnd(',') + ");";

                            using (OleDbCommand insertCommand = new OleDbCommand(insertQuery, connection))
                            {
                                insertCommand.ExecuteNonQuery();
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine($"处理工作表 {sheet.Name} 时发生错误:{ex.Message}");
                    }
                }

                connection.Close();
                workbook.Dispose();
            }

            Console.WriteLine("Excel 数据已成功写入新的 Access 数据库!");
        }
    }
}

结果

本文介绍如何在.NET平台使用C#导入Excel数据到数据库中。

相关推荐
isyangli_blog1 小时前
OpenDayLight (Carbon 版本) 启动与组件安装
开发语言·php
vb2008111 小时前
FastAPI APIRouter
开发语言·python
Benszen1 小时前
KVM虚拟化解决方案
开发语言·perl
会编程的土豆1 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
東雪木1 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
杨充2 小时前
1.3 浮点型数据设计灵魂
开发语言·python·算法
噜噜噜阿鲁~2 小时前
python学习笔记 | 11.3、面向对象高级编程-多重继承
java·开发语言
basketball6162 小时前
Go 语言从入门到进阶:4. 数组和MAP使用方法总结
开发语言·后端·golang
春生野草2 小时前
反射、Tomcat执行
java·开发语言
键盘上的猫头鹰3 小时前
【MySQL 教程(八)】索引、事务、用户管理、导入导出与分页查询
数据库·python·mysql