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

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["年龄"]}");}
}
http://www.xdnf.cn/news/14021.html

相关文章:

  • 华为云Flexus+DeepSeek征文|基于华为云一键部署 Dify 应用的性能测试实践:构建聊天应用并使用 JMeter做压力测试
  • HarmonyOS5 运动健康app(一):健康饮食(附代码)
  • 苹果获智能钱包专利,Find My生态版图或再扩张:钱包会“说话”还能防丢
  • 【论文阅读笔记】ICLR 2025 | 解析Ref-Gaussian如何实现高质量可交互反射渲染
  • pom文件引用外部jar依赖
  • Web开发实战:Gin + GORM 构建企业级 API 项目
  • 使用 C/C++ 和 OpenCV 判断是否抬头
  • Spring 事务传播行为详解
  • 自己的服务器被 DDOS跟CC攻击了怎么处理,如何抵御攻击?
  • 公司内网远程访问配置教程:本地服务器(和指定端口应用)实现外网连接使用
  • 29-Oracle 23ai Flashback Log Placement(闪回日志灵活配置)
  • 进程控制
  • Trae Builder 模式:从需求到全栈项目的端到端实践
  • 书写时垂直笔画比水平笔画表现更好的心理机制分析
  • Android binder内核漏洞研究(一)——环境搭建
  • 【MySQL基础】表的约束的类型与使用指南
  • 从Apache OFBiz 17.12.01的反序列化漏洞到Docker逃逸的渗透之红队思路
  • GaussDB 分布式数据库调优(架构到全链路优化)
  • C#实战:解决NPOI读取Excel单元格数值0.00001显示为1E-05的问题
  • [特殊字符] Harmony OS Next里的Web组件:网页加载的全流程掌控手册
  • macOS 查看当前命令行的ruby的安装目录
  • 大语言模型的分类与top3
  • Spark 之 Subquery
  • matlab实现非线性Granger因果检验
  • 深度学习:PyTorch张量基本运算、形状改变、索引操作、升维降维、维度转置、张量拼接
  • 将后端数据转换为docx文件
  • 京东零售基于Flink的推荐系统智能数据体系 |Flink Forward Asia 峰会实录分享
  • 论文阅读:arxiv 2025 How Likely Do LLMs with CoT Mimic Human Reasoning?
  • 自动化模型管理:MediaPipe Android SDK 中的模型文件下载与加载机制
  • Flutter:步骤条组件