当前位置: 首页 > news >正文

C#使用ExcelDataReader高效读取excel文件写入数据库

分享一个库ExcelDataReader ,它专注读取、支持 .xls/.xlsx、内存优化。

首先安装NuGet 包
dotnet add package ExcelDataReader
dotnet add package System.Text.Encoding.CodePages

编码

内存优化​​:每次仅读取一行,适合处理百万级数据。
​​类型安全方法​​:可用 GetString(0)、GetDouble(1) 等强类型方法(需确保类型匹配)。
​​多工作表支持​​:reader.NextResult() 切换工作表

public async Task<dynamic> ImportDataAsync(IFormFile file)
{// 注册编码Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);// 解决 .NET Core 编码问题[1,2,6](@ref)using var stream = new MemoryStream();await file.CopyToAsync(stream);stream.Position = 0;//var reader = ExcelReaderFactory.CreateReader(stream, new ExcelReaderConfiguration//{//	Password = "your-password" // 支持加密文件[4](@ref)//});int importCount = 0;using var reader = ExcelReaderFactory.CreateReader(stream);var batch = new List<B_BasicInformation>();// 跳过表头(假设占1行)if (reader.Read()) { }while (reader.Read()){//流式读取大文件batch.Add(new B_BasicInformation{Name = reader.GetString(0),//可用 GetString(0)、GetDouble(1) 等强类型方法(需确保类型匹配)IdCard = reader.GetString(1),Province = reader.GetString(2),City = reader.GetString(3),Area = reader.GetString(4),Phone = reader.GetConvertString(5),Address = reader.GetString(6),StudyPhase = reader.GetString(7),Grade = reader.GetString(8),Class = reader.GetString(9),School = reader.GetString(10),SchoolCode = reader.GetConvertStringGuid(11),Gender = idCardResult.gender,Birthday = idCardResult.birthday}); if (batch.Count >= 100){//批量插入_repository._Db.Insertable(batch).ExecuteCommand();batch.Clear();}}return new {total=importCount };
}

小文件读取

public DataSet ReadExcelAsDataSet(string filePath)
{using var stream = File.Open(filePath, FileMode.Open, FileAccess.Read);using var reader = ExcelReaderFactory.CreateReader(stream);// 配置:首行作为列名,忽略空行var result = reader.AsDataSet(new ExcelDataSetConfiguration(){ConfigureDataTable = _ => new ExcelDataTableConfiguration(){UseHeaderRow = true, // 第一行为列名[4,7](@ref)FilterRow = row => row[0]?.ToString() != "" // 跳过空行[4](@ref)}});return result;
}// 使用示例:
var dataSet = ReadExcelAsDataSet("data.xlsx");
foreach (DataTable table in dataSet.Tables)
{Console.WriteLine($"表名: {table.TableName}");foreach (DataRow row in table.Rows){Console.WriteLine($"{row["姓名"]}, 年龄: {row["年龄"]}");}
}

相关文章:

  • 【Qt】Qt控件
  • 三星MZQL2960HCJR-00BAL高性能固态硬盘控制器SSD云计算和高端存储专用 电子元器件解析
  • 【为什么InnoDB用B+树?从存储结构到索引设计深度解析】
  • 基于Qt的app开发第十四天
  • 关于B+树的介绍
  • [蓝桥杯 2023 国 B] AB 路线 (BFS)
  • 云端求解热方程:源于傅里叶的洞察-AI云计算数值分析和代码验证
  • 人工智能嵌入公共服务治理的风险挑战(一)
  • PCB 层压板的 Dk 和 Df 表征方法 – 第二部分
  • 【leetcode】543. 二叉树的直径
  • OceanBase (DBA)一面面经
  • go语言快速入门
  • QCustomPlot 中实现拖动区域放大‌与恢复
  • Android S - 重复播放按键音(上下左右、OK)
  • 算法导论第四章:分治策略的艺术与科学
  • 北京大学肖臻老师《区块链技术与应用》公开课:08-BTC-比特币挖矿
  • HTML5实现好看的邀请函网页源码
  • Linux --基础IO
  • 010502管道符_防火墙出入站_不回显带外-渗透命令-基础入门-网络安全
  • 我自己动手写了一个MySQL自动化备份脚本,基于docker
  • 各大网站的名字/长沙谷歌优化
  • 新加坡 网站建设/广东互联网网络营销推广
  • 杭州响应式网站制作/网页设计代码大全
  • 如何维护网站建设/本溪seo优化
  • 网站返回404是什么意思/网络营销软件代理
  • 广州青菜篮农业有限公司网站建设项目/小红书seo排名