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

 更新时间:2024年12月09日 09:08:26   作者:Eiceblue  
将Excel文件中的数据导入到数据库中不仅能够提升数据处理的效率和准确性,还能极大地促进数据分析和决策制定的过程,本文将介绍如何在.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对象使用的资源。

代码示例:

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对象使用的资源。

代码示例:

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文件数据到数据库的文章就介绍到这了,更多相关C#导入Excel数据到数据库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#利用反射来判断对象是否包含某个属性的实现方法

    C#利用反射来判断对象是否包含某个属性的实现方法

    这篇文章主要介绍了C#利用反射来判断对象是否包含某个属性的实现方法,很有借鉴价值的一个技巧,需要的朋友可以参考下
    2014-08-08
  • C#图像处理之头发检测的方法

    C#图像处理之头发检测的方法

    这篇文章主要介绍了C#图像处理之头发检测的方法,可实现针对图像中头发的检测功能,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • C#中String与string的区别分析

    C#中String与string的区别分析

    这篇文章主要介绍了C#中String与string的区别,对于加深C#数据类型与类的理解有很好的参考借鉴价值,需要的朋友可以参考下
    2014-08-08
  • C#实现装箱与拆箱操作简单实例

    C#实现装箱与拆箱操作简单实例

    这篇文章主要介绍了C#实现装箱与拆箱操作,对于新手理解装箱与拆箱有一定的帮助,需要的朋友可以参考下
    2014-07-07
  • C#中IEnumerable接口用法实例分析

    C#中IEnumerable接口用法实例分析

    这篇文章主要介绍了C#中IEnumerable接口用法,实例分析了IEnumerable接口的功能与使用技巧,需要的朋友可以参考下
    2015-04-04
  • 新手小白用C# winform 读取Excel表的实现

    新手小白用C# winform 读取Excel表的实现

    这篇文章主要介绍了新手小白用C# winform 读取Excel表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • C#求解哈夫曼树,实例代码

    C#求解哈夫曼树,实例代码

    C#求解哈夫曼树,实例代码,需要的朋友可以参考一下
    2013-04-04
  • C#中跨线程访问控件的实现方法

    C#中跨线程访问控件的实现方法

    C#中不允许跨线程直接访问界面控件,即一个线程中如主线程创建的控件不允许被其他线程例如子线程直接访问,在一个线程中设置其他线程所有的控件属性通常有两种方法,本文将详细的给大家介绍一下,需要的朋友可以参考下
    2024-12-12
  • C#解析json字符串总是多出双引号的原因分析及解决办法

    C#解析json字符串总是多出双引号的原因分析及解决办法

    json好久没用了,今天在用到json的时候,发现对字符串做解析的时候总是多出双引号,下面给大家介绍C#解析json字符串总是多出双引号的原因分析及解决办法,需要的朋友参考下吧
    2016-03-03
  • C#解析char型指针所指向的内容(实例解析)

    C#解析char型指针所指向的内容(实例解析)

    在c++代码中定义了一个功能函数,这个功能函数会将计算的结果写入一个字符串型的数组中output,然后c#会调用c++导出的dll中的接口函数,然后获取这个output并解析成string类型,本文通过实例解析C# char型指针所指向的内容,感兴趣的朋友一起看看吧
    2024-03-03

最新评论