.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数据到数据库中。

相关推荐
NCIN EXPE20 小时前
redis 使用
数据库·redis·缓存
MongoDB 数据平台20 小时前
为编码代理引入 MongoDB 代理技能和插件
数据库·mongodb
极客on之路20 小时前
mysql explain type 各个字段解释
数据库·mysql
代码雕刻家20 小时前
MySQL与SQL Server的基本指令
数据库·mysql·sqlserver
lThE ANDE20 小时前
开启mysql的binlog日志
数据库·mysql
小糖学代码20 小时前
LLM系列:1.python入门:15.JSON 数据处理与操作
开发语言·python·json·aigc
yejqvow1220 小时前
CSS如何控制placeholder文字的颜色_使用--placeholder伪元素
jvm·数据库·python
handler0120 小时前
从源码到二进制:深度拆解 Linux 下 C 程序的编译与链接全流程
linux·c语言·开发语言·c++·笔记·学习
oLLI PILO20 小时前
nacos2.3.0 接入pgsql或其他数据库
数据库
m0_7436239220 小时前
HTML怎么创建多语言切换器_HTML语言选择下拉结构【指南】
jvm·数据库·python