将Excel文件中的数据导入到数据库中不仅能够提升数据处理的效率和准确性,还能极大地促进数据分析和决策制定的过程。尤其在企业级应用中,Excel作为数据输入和初步整理的工具非常普遍,但其功能对于复杂查询、大规模数据管理和跨部门的数据共享来说有所局限。通过使用C#在.NET平台上实现这一过程,可以充分利用其强大的数据操作能力和丰富的库支持,确保数据从Excel无缝迁移到诸如SQLite等关系型数据库中,从而实现更高效的数据管理、增强的数据安全性和更好的性能优化,同时为后续的数据挖掘和商业智能分析打下坚实的基础。
本文将介绍如何在.NET平台使用C#导入Excel文件数据到数据库中。
- 导入Excel数据到SQLite数据库
- 导入Excel数据到Access数据库
本文所使用的方法需要用到免费的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#代码转换为操作步骤的介绍:
- 设置SQLite数据库文件路径为
Sample.db
,并指定Excel输出文件路径为output/DatabaseToExcel.xlsx
。 - 创建一个新的
Workbook
实例以表示Excel工作簿,并清除默认的工作表。 - 使用
SQLiteConnection
创建一个到SQLite数据库的新连接,并打开这个连接。 - 通过调用
GetSchema("Tables")
从数据库获取所有表的名字,并存储在一个DataTable
对象中。 遍历每个表名:
- 对于每个表,添加一个新的工作表到工作簿中,工作表名称设为当前表名。
- 构建SQL查询语句以选择表中的所有数据,并使用
SQLiteCommand
执行此查询。 使用
SQLiteDataReader
读取查询结果,并进行以下操作:- 获取列名并将它们写入新工作表的第一行。
- 设置第一行(即标题行)的字体样式为粗体,字号为12。
继续遍历数据行,并对每一行执行以下操作:
- 将每一行的数据值写入相应的单元格中。
- 自动调整每列的宽度以适应内容。
- 设置数据行的字体大小为11。
- 关闭与SQLite数据库的连接。
- 保存生成的工作簿到之前定义的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#代码转换为操作步骤的介绍:
- 设置Excel文件路径为
Sample.xlsx
,并指定Access数据库文件路径为output/Database.accdb
。 - 使用
Workbook
类打开指定路径的Excel文件,并加载该文件到内存中。 - 创建一个用于连接Access数据库的OleDb连接字符串。
- 检查Access数据库文件是否存在。如果不存在,则提示用户首先创建Access数据库文件,并终止程序执行。
- 创建一个新的OleDb连接对象,并打开与Access数据库的连接。
遍历Excel工作簿中的每个工作表:
- 获取当前工作表的名称,并将其作为新表的名称。
- 从工作表的第一行获取列名,并构建创建新表的SQL语句,假定所有列的数据类型均为文本类型(TEXT)。
尝试执行以下操作,对于每个工作表:
- 使用构建的
CREATE TABLE
SQL语句创建新的表。
- 使用构建的
对于每个工作表中的每一行数据(跳过第一行,因为它包含列名):
- 构建
INSERT INTO
SQL语句以插入数据行,同时处理可能的SQL注入问题,例如通过转义单引号。
- 构建
- 执行构建的
INSERT INTO
命令,将一行数据插入到对应的Access表中。 - 如果在处理某个工作表时发生错误,捕获异常并打印错误信息,继续处理下一个工作表。
- 关闭与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数据到数据库中。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。