使用 IRONXL 在 C# 中导入 CSV 文件 | ASP.NET Core教程 | IronXL Curtis Chau 已更新:2026年3月1日 下载 IronXL NuGet 下载 DLL 下载 免费试用 LLM副本 LLM副本 将页面复制为 Markdown 格式,用于 LLMs 在 ChatGPT 中打开 向 ChatGPT 咨询此页面 在双子座打开 向 Gemini 询问此页面 在 Grok 中打开 向 Grok 询问此页面 打开困惑 向 Perplexity 询问有关此页面的信息 分享 在 Facebook 上分享 分享到 X(Twitter) 在 LinkedIn 上分享 复制链接 电子邮件文章 在ASP.NET Core中使用 C# 导入 CSV 文件意味着需要读取文件流、解析分隔行,并将每条记录映射到类型化对象——所有这些操作都必须在对数据进行任何有用的操作之前完成。 IronXL通过一个 API 处理每个步骤,该 API 对 CSV、XLSX 和 TSV 文件同样适用,因此您可以将时间用于应用程序逻辑,而不是处理字符串分割等特殊情况。 立即开始免费试用,即可跟随教程并在您自己的环境中测试这些代码示例。 如何在.NET项目中安装IronXL ? 在编写任何解析代码之前,请将IronXL添加到您的项目中。 在 Visual Studio 中打开包管理器控制台,或者在项目目录中打开终端,然后运行以下命令之一: Install-Package IronXl.Excel dotnet add package IronXl.Excel Install-Package IronXl.Excel dotnet add package IronXl.Excel SHELL 该软件包面向.NET 10、 .NET 6+、. .NET Framework 4.6.2+ 和.NET Standard 2.0,因此适用于任何现代项目类型。 服务器上无需安装微软Office。 软件包恢复后,在任何调用该库的文件的顶部添加 using IronXL;。 有关详细的设置选项,包括全局工具安装和 CI/CD 管道配置,请访问IronXL安装指南。 如何在ASP.NET Core中导入 CSV 文件? 在ASP.NET Core中导入 CSV 文件需要从服务器读取文件流,解析每一行,并将值映射到模型类。 虽然有些开发者会选择手动实现或使用第三方软件包,但IronXL提供了一种无需额外配置即可处理 CSV 文件和 Excel 格式的单一方法。 以下代码展示了如何使用 IronXL 的 WorkBook.LoadCSV 方法加载 CSV 文件: using IronXL; // Load the CSV file directly using the full file path var csv = WorkBook.LoadCSV("products.csv"); WorkSheet worksheet = csv.DefaultWorkSheet; // Access CSV data by iterating through rows foreach (var row in worksheet.Rows) { string productName = row.Columns[1].StringValue; decimal price = row.Columns[2].DecimalValue; Console.WriteLine($"Product: {productName}, Price: {price}"); } using IronXL; // Load the CSV file directly using the full file path var csv = WorkBook.LoadCSV("products.csv"); WorkSheet worksheet = csv.DefaultWorkSheet; // Access CSV data by iterating through rows foreach (var row in worksheet.Rows) { string productName = row.Columns[1].StringValue; decimal price = row.Columns[2].DecimalValue; Console.WriteLine($"Product: {productName}, Price: {price}"); } $vbLabelText $csharpLabel 了解 WorkBook.LoadCSV 方法 WorkBook.LoadCSV 方法读取 CSV 文件并创建一个工作表,其中每一行成为一行,每个分隔值成为一个单元格。 IronXL会自动检测分隔符(逗号、分号或制表符),并处理值中包含逗号的带引号的字段。 对于标准 CSV 文件,无需手动配置分隔符。 单元格值访问器如 IntValue 和 DateTimeValue 处理类型转换,因此您可以避免使用 int.TryParse 或 decimal.Parse 进行手动解析。 当单元格为空或包含无法识别的值时,这些访问器会返回类型的默认值,而不是抛出异常,从而防止在批量导入操作期间出现未处理的错误。 这种方法消除了自定义实现中容易出错的手动字符串解析,特别是对于转义引号、Windows 风格的换行符和多行单元格值等特殊情况。 有关支持的格式和分隔符选项的更多详细信息,请参阅IronXL CSV 文档。 如何为 CSV 数据创建模型类? 将 CSV 数据映射到强类型对象需要一个反映文件结构的模型类。 您可以将原始字符串数据转换为特定类型,例如整数、小数和日期时间值。 对于产品库存数据,创建一个类,其属性与每个 CSV 列相匹配: public class Product { public int Id { get; set; } public string Name { get; set; } = string.Empty; public decimal Price { get; set; } public int Quantity { get; set; } } public class Product { public int Id { get; set; } public string Name { get; set; } = string.Empty; public decimal Price { get; set; } public int Quantity { get; set; } } $vbLabelText $csharpLabel 将 CSV 行解析为类型化集合 定义好模型类后,就可以将 CSV 记录解析为类型化集合。 以下示例使用循环索引跳过标题行,并将后续每一行映射到 Product 对象: using IronXL; WorkBook workbook = WorkBook.LoadCSV("inventory.csv"); WorkSheet ws = workbook.DefaultWorkSheet; var records = new List<Product>(); // Skip header row (index 0), iterate through data rows for (int i = 1; i < ws.Rows.Count(); i++) { var row = ws.Rows[i]; var product = new Product { Id = row.Columns[0].IntValue, Name = row.Columns[1].StringValue, Price = row.Columns[2].DecimalValue, Quantity = row.Columns[3].IntValue }; records.Add(product); } Console.WriteLine($"Loaded {records.Count} products."); using IronXL; WorkBook workbook = WorkBook.LoadCSV("inventory.csv"); WorkSheet ws = workbook.DefaultWorkSheet; var records = new List<Product>(); // Skip header row (index 0), iterate through data rows for (int i = 1; i < ws.Rows.Count(); i++) { var row = ws.Rows[i]; var product = new Product { Id = row.Columns[0].IntValue, Name = row.Columns[1].StringValue, Price = row.Columns[2].DecimalValue, Quantity = row.Columns[3].IntValue }; records.Add(product); } Console.WriteLine($"Loaded {records.Count} products."); $vbLabelText $csharpLabel records 集合现在包含类型化的 Product 对象,可用于数据库操作、JSON 序列化或进一步的业务逻辑。 IronXL 的单元格值访问器会自动处理类型转换,包括可选字段的空值处理。 处理可选字段和可为空字段 实际的 CSV 文件通常包含空单元格或可选列。 IronXL 的值访问器在单元格为空时返回默认值,而不是抛出异常。 对于可为空的类型,您可以使用条件检查: // Reading an optional DateTime field DateTime? lastUpdated = string.IsNullOrEmpty(row.Columns[4].StringValue) ? null : row.Columns[4].DateTimeValue; // Reading an optional DateTime field DateTime? lastUpdated = string.IsNullOrEmpty(row.Columns[4].StringValue) ? null : row.Columns[4].DateTimeValue; $vbLabelText $csharpLabel 这种模式可以保护你的导入代码,而无需将每个单元格访问都包装在 try-catch 块中。 有关处理复杂数据类型和大型文件的指导,请访问IronXL WorkSheet 文档。 如何在 Web API 中处理 CSV 文件上传? 构建一个接受浏览器上传 CSV 文件的 API 端点需要将ASP.NET Core 的 IFormFile 与 IronXL 的解析功能结合起来。 以下代码演示了一个完整的控制器实现,该控制器解析上传的文件并返回 JSON 响应: using IronXL; using Microsoft.AspNetCore.Mvc; [Route("api/[controller]")] [ApiController] public class CsvController : ControllerBase { [HttpPost("upload")] public async Task<IActionResult> UploadCsv(IFormFile file) { if (file == null || file.Length == 0) return BadRequest("Please upload a valid CSV file."); try { using var stream = new MemoryStream(); await file.CopyToAsync(stream); stream.Position = 0; WorkBook workbook = WorkBook.Load(stream, "csv"); WorkSheet ws = workbook.DefaultWorkSheet; var records = new List<Product>(); // Skip header row, iterate through data rows for (int i = 1; i < ws.Rows.Count(); i++) { var row = ws.Rows[i]; records.Add(new Product { Id = row.Columns[0].IntValue, Name = row.Columns[1].StringValue, Price = row.Columns[2].DecimalValue, Quantity = row.Columns[3].IntValue }); } return Ok(new { message = "Import successful", count = records.Count, data = records }); } catch (Exception ex) { return BadRequest($"Error processing file: {ex.Message}"); } } } using IronXL; using Microsoft.AspNetCore.Mvc; [Route("api/[controller]")] [ApiController] public class CsvController : ControllerBase { [HttpPost("upload")] public async Task<IActionResult> UploadCsv(IFormFile file) { if (file == null || file.Length == 0) return BadRequest("Please upload a valid CSV file."); try { using var stream = new MemoryStream(); await file.CopyToAsync(stream); stream.Position = 0; WorkBook workbook = WorkBook.Load(stream, "csv"); WorkSheet ws = workbook.DefaultWorkSheet; var records = new List<Product>(); // Skip header row, iterate through data rows for (int i = 1; i < ws.Rows.Count(); i++) { var row = ws.Rows[i]; records.Add(new Product { Id = row.Columns[0].IntValue, Name = row.Columns[1].StringValue, Price = row.Columns[2].DecimalValue, Quantity = row.Columns[3].IntValue }); } return Ok(new { message = "Import successful", count = records.Count, data = records }); } catch (Exception ex) { return BadRequest($"Error processing file: {ex.Message}"); } } } $vbLabelText $csharpLabel 配置端点和多部分表单 要使 [HttpPost("upload")] 操作接受文件上传,项目必须支持 multipart 表单数据。 在 Program.cs 中,为了实现最小的 API 设置,请确保您已调用 builder.Services.AddControllers() 和 app.MapControllers()。 端点可通过 /api/csv/upload 访问。 从浏览器表单进行测试时,将表单的 enctype 属性设置为 multipart/form-data,并使用文件输入元素。 对于Postman等 API 客户端,请在请求体中选择"form-data",添加一个名为 file 的键,并附加 CSV 文件。控制器将返回一个包含记录数和已解析数据数组的 JSON 对象,客户端JavaScript可以立即使用该对象。 解析前验证文件类型 在将数据流传递给IronXL之前,请验证文件扩展名,拒绝非 CSV 格式的上传文件: var extension = Path.GetExtension(file.FileName).ToLowerInvariant(); if (extension != ".csv" && extension != ".txt") return BadRequest("Only CSV files are accepted."); var extension = Path.GetExtension(file.FileName).ToLowerInvariant(); if (extension != ".csv" && extension != ".txt") return BadRequest("Only CSV files are accepted."); $vbLabelText $csharpLabel 此检查可防止格式错误的二进制数据到达解析器,并向 API 使用者提供清晰的错误消息。 您可以扩展此验证,使用 file.ContentType 检查 MIME 类型,以实现更严格的强制执行。 如何将CSV数据保存到数据库? 将 CSV 文件解析为类型化对象后,通常会将记录持久化到数据库中。 以下示例通过使用 Entity Framework Core 的 AddRangeAsync 进行批量插入来扩展服务层模式: using IronXL; public class CsvImportService { private readonly AppDbContext _context; public CsvImportService(AppDbContext context) { _context = context; } public async Task<int> ImportProductsAsync(Stream csvStream) { WorkBook workbook = WorkBook.LoadCSV(csvStream); WorkSheet ws = workbook.DefaultWorkSheet; var products = new List<Product>(); foreach (var row in ws.Rows.Skip(1)) { products.Add(new Product { Id = row.Columns[0].IntValue, Name = row.Columns[1].StringValue, Price = row.Columns[2].DecimalValue, Quantity = row.Columns[3].IntValue }); } await _context.Products.AddRangeAsync(products); return await _context.SaveChangesAsync(); } } using IronXL; public class CsvImportService { private readonly AppDbContext _context; public CsvImportService(AppDbContext context) { _context = context; } public async Task<int> ImportProductsAsync(Stream csvStream) { WorkBook workbook = WorkBook.LoadCSV(csvStream); WorkSheet ws = workbook.DefaultWorkSheet; var products = new List<Product>(); foreach (var row in ws.Rows.Skip(1)) { products.Add(new Product { Id = row.Columns[0].IntValue, Name = row.Columns[1].StringValue, Price = row.Columns[2].DecimalValue, Quantity = row.Columns[3].IntValue }); } await _context.Products.AddRangeAsync(products); return await _context.SaveChangesAsync(); } } $vbLabelText $csharpLabel 将服务集成到依赖注入中 在 Program.cs 中注册 CsvImportService,以便控制器可以通过构造函数注入来请求它: builder.Services.AddScoped<CsvImportService>(); builder.Services.AddScoped<CsvImportService>(); $vbLabelText $csharpLabel 然后更新控制器构造函数,使其接受服务并调用 ImportProductsAsync,而不是内联构建列表。这种分离可以保持控制器操作简洁,并将数据访问逻辑移至可测试的服务类中。 Entity Framework Core 将 AddRangeAsync 调用批量处理成每个批次的单个 INSERT 语句,这对于包含数千行的 CSV 文件来说性能良好。 对于非常大的导入(数万行),请考虑使用EF Core 的批量扩展或原始 SQL 语句来减少与数据库的往返次数。 如何使用IronXL将数据导出回 CSV 文件? IronXL不仅限于读取 CSV 文件,它还可以写入 CSV 文件。 SaveAsCsv 方法可以将任何工作表导出为 CSV 文件,这对于生成报告或将数据发送到下游系统非常有用: using IronXL; WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLS); WorkSheet ws = workbook.DefaultWorkSheet; // Write headers ws["A1"].Value = "Id"; ws["B1"].Value = "Name"; ws["C1"].Value = "Price"; // Write data rows ws["A2"].Value = 1; ws["B2"].Value = "Widget A"; ws["C2"].Value = 9.99; ws["A3"].Value = 2; ws["B3"].Value = "Widget B"; ws["C3"].Value = 14.49; // Save as CSV workbook.SaveAsCsv("export.csv"); Console.WriteLine("CSV export complete."); using IronXL; WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLS); WorkSheet ws = workbook.DefaultWorkSheet; // Write headers ws["A1"].Value = "Id"; ws["B1"].Value = "Name"; ws["C1"].Value = "Price"; // Write data rows ws["A2"].Value = 1; ws["B2"].Value = "Widget A"; ws["C2"].Value = 9.99; ws["A3"].Value = 2; ws["B3"].Value = "Widget B"; ws["C3"].Value = 14.49; // Save as CSV workbook.SaveAsCsv("export.csv"); Console.WriteLine("CSV export complete."); $vbLabelText $csharpLabel 导出的文件默认使用逗号分隔符。 对于欧洲地区常见的以分号分隔的文件,请使用显式分隔符参数调用 SaveAsCsv("export.csv", ";")。 您还可以保存到 MemoryStream,并使用 File(stream, "text/csv", "export.csv") 从 API 端点以文件下载方式返回结果。 有关导出选项的完整参考,请访问IronXL保存和导出文档。 为什么IronXL比手动解析 CSV 文件更好? 手动解析 CSV 文件看起来很简单,直到你遇到一些特殊情况:例如,包含用引号括起来的逗号的值、嵌入在单元格中的换行符、转义的引号以及 UTF-8 文件开头的字节顺序标记。 在自定义循环中正确处理所有这些需要大量的测试和持续的维护。 IronXL在内部解决了所有这些问题。 对比两种方法,可以明显看出它们的优势: IronXL与手动 StreamReader 在 C# 中解析 CSV 文件的比较 能力 IronXL 手动 StreamReader 自动分隔符检测 是 否——必须手动配置 引用字段处理 内置 需要自定义逻辑 类型转换(整数、十进制、日期时间) 内置配件 需要调用 Parse/TryParse 函数 多行单元格值 自动处理 难以正确实施 物料清单处理 自动翻译 需要 StreamReader 配置 Excel格式支持(XLSX、XLS) 相同的 API 需要单独的库 导出为 CSV SaveAsCsv 方法 需要单独的写入逻辑 跨格式一致性 IronXL 的一个实际优势是,相同的 WorkBook.Load 和工作表迭代模式适用于 XLSX、XLS、ODS 和 CSV 文件。 如果您的应用程序需要接受用户提供的多种电子表格格式,您可以在不更改解析逻辑的情况下切换格式。 将文件流传递给 WorkBook.Load, IronXL会根据文件签名自动检测格式。 这种跨格式 API 意味着您只需编写和测试一条代码路径,而无需为 CSV 和 Excel 分别维护单独的实现。 有关支持的格式的完整列表,请参阅IronXL支持的文件格式页面。 大文件的性能考虑因素 对于小于 100 MB 的 CSV 文件, IronXL无需任何调整即可良好运行。 对于较大的文件,请考虑以下策略: 从路径加载文件,而不是将其复制到 MemoryStream,以减少内存分配。 将数据插入数据库时,分批处理行,而不是在第一次插入之前收集所有记录。 使用 LINQ 避免将标题行物化为 ws.Rows.Skip(1) 对象。 IronXL性能指南涵盖了针对大批量导入场景的额外优化,包括并行处理和流式模式。 下一步计划是什么? 现在,您已经拥有了ASP.NET Core中 CSV 导入每个阶段的工作模式:安装库、从磁盘或上传的流加载文件、将行映射到类型化模型对象、使用 Entity Framework Core 将记录持久化到数据库,以及在需要时将数据导出回 CSV。 在此基础上,您可以探索以下资源: IronXL NuGet包-- NuGet上的包详细信息和版本历史记录 IronXL教程概述——涵盖筛选、公式计算和图表生成的指导性教程 IronXL API 参考——完整的类和方法文档 IronXL GitHub示例-- GitHub上可下载的示例项目 IronXL许可选项——针对开发、测试和生产环境的许可级别 Microsoft CSV 解析文档-- IronXL所基于的.NET IO 模型背景 ASP.NET Core文件上传文档-- 关于 IFormFile 和 multipart 上传配置的官方指南 IronXL读取和导入 Excel 教程——涵盖读取 XLSX 和 CSV 文件。 IronXL创建和写入教程——涵盖数据写入和保存为多种格式的内容 IronXL数据排序和筛选——加载后对导入数据进行操作 如果您的项目中使用了IronXL ,除了 CSV 之外,添加对 XLSX 上传的支持无需额外的代码更改——同一个 WorkBook.Load 调用即可处理两者。 这种一致性意味着您可以随着应用程序需求的增长,逐步扩展导入端点的功能集。 常见问题解答 如何在ASP.NET Core应用程序中导入 CSV 文件? 您可以使用IronXL在ASP.NET Core应用程序中导入 CSV 文件,方法是处理文件上传、解析 CSV 数据并将其映射到模型类对象。IronXL 提供了一个 API 来高效地完成这些任务。 在 C# 中使用IronXL进行 CSV 导入有哪些好处? IronXL提供了一个 API,简化了 CSV 文件的导入过程。它允许您轻松解析数据、将其映射到模型并将记录转换为 JSON,使其成为数据驱动型应用程序的理想选择。 IronXL能否将CSV数据解析为模型类对象? 是的, IronXL可以将 CSV 数据解析为模型类对象,从而让您在.NET应用程序中高效地处理结构化数据。 在导入 CSV 文件时, IronXL如何帮助进行数据库集成? IronXL通过解析 CSV 数据并将其映射到模型对象来帮助数据库集成,这些模型对象可以轻松地插入或更新到数据库中。 是否可以使用IronXL将 CSV 记录转换为 JSON 格式返回? 是的,使用IronXL,您可以将 CSV 记录转换为 JSON 格式,这对于创建 Web API 或与前端应用程序集成非常有用。 除了 CSV 格式外, IronXL还能处理哪些文件格式? 除了 CSV 格式外, IronXL还可以处理各种 Excel 文件格式,如 XLSX、XLS 等,为不同的电子表格需求提供了多功能性。 IronXL是否支持导入大型CSV文件? IronXL旨在高效处理大型 CSV 文件导入,确保数据驱动型应用程序的性能和可靠性。 Curtis Chau 立即与工程团队聊天 技术作家 Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。 相关文章 已更新2026年3月1日 在.NET C# 中下载 Excel 文件:将数据导出为 XLSX、CSV 等格式 使用 C# 和IronXL在ASP.NET Core中下载 Excel 文件。从 MVC 控制器导出数据到 XLSX、CSV 和 XML 格式,并返回 MemoryStream 和 File() 函数。包含代码示例。 阅读更多 已更新2026年3月1日 如何在Blazor中使用IronXL导出 Excel 文件 学习如何使用IronXL在Blazor Server 应用程序中将数据导出到 Excel。本指南涵盖项目设置、服务设计、条件格式设置、多工作表报表和错误处理,并提供完整的 C# 代码示例。 阅读更多 已更新2026年2月27日 如何在 C# 中读取 Excel 文件而不是使用 StreamReader 了解为什么 StreamReader 无法读取 Excel 文件,以及如何在 C# .NET中使用IronXL从磁盘或内存流加载 XLSX 和 XLS 工作簿。 阅读更多 如何在ASP.NET C# 中将 Excel 导入 GridView使用IronXL将 Excel 文件导入 ...
已更新2026年3月1日 在.NET C# 中下载 Excel 文件:将数据导出为 XLSX、CSV 等格式 使用 C# 和IronXL在ASP.NET Core中下载 Excel 文件。从 MVC 控制器导出数据到 XLSX、CSV 和 XML 格式,并返回 MemoryStream 和 File() 函数。包含代码示例。 阅读更多
已更新2026年3月1日 如何在Blazor中使用IronXL导出 Excel 文件 学习如何使用IronXL在Blazor Server 应用程序中将数据导出到 Excel。本指南涵盖项目设置、服务设计、条件格式设置、多工作表报表和错误处理,并提供完整的 C# 代码示例。 阅读更多
已更新2026年2月27日 如何在 C# 中读取 Excel 文件而不是使用 StreamReader 了解为什么 StreamReader 无法读取 Excel 文件,以及如何在 C# .NET中使用IronXL从磁盘或内存流加载 XLSX 和 XLS 工作簿。 阅读更多