在处理大量数据时,如何高效地导入数据成为一个关键问题。传统的Excel导入方式在处理百万级别的数据时,往往会遇到性能瓶颈。幸运的是,EasyExcel库的出现,极大地提升了大数据量导入导出的性能。本文将介绍如何使用C#结合EasyExcel库,在短短12秒内将百万级别的数据快速导入MySQL数据库。
EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目,但由于其高效性能,许多开发者希望在其他语言中也实现类似功能。在C#中,虽然没有官方的EasyExcel库,但我们可以借鉴其设计理念,使用流式读取和写入的方式,以及利用异步编程技术来提升性能。
在开始之前,请确保你已经安装了以下工具和库:
下面是一个简化的C#示例,展示了如何使用流式读取Excel文件,并将数据异步导入到MySQL数据库中。
using System;
using System.Data;
using System.Threading.Tasks;
using MySql.Data.MySqlClient;
using OfficeOpenXml; // 需要安装EPPlus库
public class ExcelImporter
{
private string connectionString = "你的MySQL连接字符串";
private const int BatchSize = 10000; // 每次批量插入的记录数
public async Task ImportExcelToMySQLAsync(string excelFilePath)
{
using (var package = new ExcelPackage(new FileInfo(excelFilePath)))
{
ExcelWorksheet worksheet = package.Workbook.Worksheets[0]; // 假设数据在第一页
var totalRowCount = worksheet.Dimension.Rows;
var startRow = 2; // 假设第一行是标题行,从第二行开始读取数据
using (var connection = new MySqlConnection(connectionString))
{
await connection.OpenAsync();
using (var transaction = connection.BeginTransaction())
{
for (int row = startRow; row <= totalRowCount; row++)
{
var sqlCommand = new MySqlCommand();
sqlCommand.Connection = connection;
sqlCommand.Transaction = transaction;
// 构建SQL插入语句,这里以插入两个字段为例
var column1 = worksheet.Cells[row, 1].Value.ToString();
var column2 = worksheet.Cells[row, 2].Value.ToString();
sqlCommand.CommandText = $"INSERT INTO your_table (column1, column2) VALUES ('{column1}', '{column2}')";
// 批量插入,减少数据库交互次数以提升性能
if ((row - startRow) % BatchSize == 0 || row == totalRowCount)
{
await sqlCommand.ExecuteNonQueryAsync();
// 可以选择性地提交事务,并开启新的事务,以便分批次处理错误和回滚
transaction.Commit();
transaction = connection.BeginTransaction();
}
else
{
sqlCommand.CommandText += ";"; // MySQL支持一次执行多条语句,用分号隔开
}
}
transaction.Commit(); // 提交最后一批事务
}
}
}
}
}
注意:上述代码是一个简化的示例,用于说明基本的流程和思路。在生产环境中,你需要考虑更多的错误处理、数据验证和安全性问题(比如SQL注入)。此外,为了最大化性能,可能还需要对MySQL数据库进行调优。
通过合理地利用流式读取Excel文件和异步编程技术,结合数据库调优,我们完全有可能在12秒内将百万级别的数据快速导入MySQL数据库。这不仅可以提升数据处理效率,还能为业务带来更快的响应时间和更好的用户体验。
原文作者:后端Q;如有侵权,请联系管理员删除。