使用 IRONXL 如何在不使用互操作的情况下,使用 C# 在 Excel 中创建数据透视表 Curtis Chau 已更新:2026年3月1日 下载 IronXL NuGet 下载 DLL 下载 免费试用 LLM副本 LLM副本 将页面复制为 Markdown 格式,用于 LLMs 在 ChatGPT 中打开 向 ChatGPT 咨询此页面 在双子座打开 向 Gemini 询问此页面 在 Grok 中打开 向 Grok 询问此页面 打开困惑 向 Perplexity 询问有关此页面的信息 分享 在 Facebook 上分享 分享到 X(Twitter) 在 LinkedIn 上分享 复制链接 电子邮件文章 使用 C# 在 Excel 中创建数据透视表非常简单,只需选择合适的库即可——Excel互操作性 需要每台机器上都安装 Office,而IronXL可以在任何运行.NET 的环境中运行。本指南将通过完整的代码示例详细介绍这两种方法,涵盖设置、数据聚合、字段配置和部署注意事项,以便您根据项目需求做出正确的选择。 Excel互操作性 和IronXL有什么区别? 在编写任何一行代码之前,了解每种方法的底层原理会很有帮助。 Excel互操作性 使用COM(组件对象模型)直接从 C# 驱动 Microsoft Excel。 .NET进程会与正在运行的 Excel 实例通信,这意味着计算机上必须安装 Excel。您操作的每个对象(工作簿、工作表、区域、透视缓存)都是 COM 包装器,必须显式释放每个包装器,以避免进程泄漏。 IronXL采取了一条截然不同的道路。 它直接读取和写入Open XML 文件格式,完全无需启动 Excel。 最终得到的是一个标准的.NET库,它具有熟悉的对象模式、垃圾回收内存,并且不依赖于 Office 安装或许可。 这种架构使得IronXL适用于服务器端工作负载、Docker 容器、Linux 主机以及任何.NET 6、 .NET 8 或.NET 10 环境。 Excel互操作性 与IronXL对比概览 标准 Excel互操作性 IronXL 办公室要求 是 无 仅限 Windows 是 否——跨平台 内存管理 手动 COM 版本 自动(.NET GC) 服务器部署 难的 直截了当 原生透视表 完整的 Excel 透视表 API 通过 LINQ 进行数据聚合 需要许可证 办公许可证 IronXL仅限授权 如何安装各个库? 设置 Excel 互操作性 Excel互操作性 以NuGet包的形式提供。 在您的项目中运行以下任一命令: Install-Package Microsoft.Office.Interop.Excel dotnet add package Microsoft.Office.Interop.Excel Install-Package Microsoft.Office.Interop.Excel dotnet add package Microsoft.Office.Interop.Excel SHELL 请注意,仅此软件包是不够的——目标计算机必须安装匹配版本的 Microsoft Excel 并已获得正确的许可。 这种依赖关系排除了大多数服务器、容器和云场景。 设置IronXL 通过NuGet安装IronXL ,无需其他系统要求: Install-Package IronXl.Excel dotnet add package IronXl.Excel Install-Package IronXl.Excel dotnet add package IronXl.Excel SHELL 安装完成后,您可以在任何支持.NET 的平台上立即开始读取和写入 Excel 文件。 无需Office许可证,无需COM注册,无需服务器配置。 有关其他选项,包括离线安装和项目参考设置,请参阅IronXL安装指南。 立即开始使用 IronXL。 免费开始 如何使用 C# Interop 创建 Excel 数据透视表? Interop 透视表工作流程遵循严格的顺序:从源范围创建透视缓存,然后在单独的工作表上构建 PivotTable 对象,然后配置字段方向。 以下示例使用与.NET 10 兼容的顶级 C# 语句: using Excel = Microsoft.Office.Interop.Excel; using System.Runtime.InteropServices; // Launch Excel and set up workbooks var excelApp = new Excel.Application(); excelApp.Visible = false; var workbook = excelApp.Workbooks.Add(); var dataSheet = (Excel.Worksheet)workbook.Worksheets[1]; dataSheet.Name = "SalesData"; var pivotSheet = (Excel.Worksheet)workbook.Worksheets.Add(); pivotSheet.Name = "Pivot"; // Populate header row dataSheet.Cells[1, 1] = "Product"; dataSheet.Cells[1, 2] = "Region"; dataSheet.Cells[1, 3] = "Sales"; // Add sample data rows object[,] rows = { { "Laptop", "无rth", 1200 }, { "Laptop", "South", 1500 }, { "Phone", "无rth", 800 }, { "Phone", "South", 950 }, { "Tablet", "East", 600 }, { "Tablet", "West", 750 }, { "Monitor", "无rth", 400 }, { "Monitor", "South", 500 }, { "Keyboard", "East", 300 }, }; for (int i = 0; i < rows.GetLength(0); i++) { dataSheet.Cells[i + 2, 1] = rows[i, 0]; dataSheet.Cells[i + 2, 2] = rows[i, 1]; dataSheet.Cells[i + 2, 3] = rows[i, 2]; } // Build pivot cache from source range Excel.Range dataRange = dataSheet.Range["A1:C10"]; Excel.PivotCache pivotCache = workbook.PivotCaches().Create( Excel.XlPivotTableSourceType.xlDatabase, dataRange); // Create the PivotTable on the pivot sheet Excel.PivotTables pivotTables = (Excel.PivotTables)pivotSheet.PivotTables(); Excel.PivotTable pivotTable = pivotTables.Add( pivotCache, pivotSheet.Range["A3"], "SalesPivot"); // Assign field orientations ((Excel.PivotField)pivotTable.PivotFields("Product")).Orientation = Excel.XlPivotFieldOrientation.xlRowField; ((Excel.PivotField)pivotTable.PivotFields("Region")).Orientation = Excel.XlPivotFieldOrientation.xlColumnField; ((Excel.PivotField)pivotTable.PivotFields("Sales")).Orientation = Excel.XlPivotFieldOrientation.xlDataField; // Enable grand totals pivotTable.RowGrand = true; pivotTable.ColumnGrand = true; // Save and close workbook.SaveAs(@"C:\output\pivot_interop.xlsx"); workbook.Close(false); excelApp.Quit(); // Release every COM object -- skipping any of these causes Excel to stay in memory Marshal.ReleaseComObject(pivotTable); Marshal.ReleaseComObject(pivotTables); Marshal.ReleaseComObject(pivotCache); Marshal.ReleaseComObject(dataRange); Marshal.ReleaseComObject(pivotSheet); Marshal.ReleaseComObject(dataSheet); Marshal.ReleaseComObject(workbook); Marshal.ReleaseComObject(excelApp); using Excel = Microsoft.Office.Interop.Excel; using System.Runtime.InteropServices; // Launch Excel and set up workbooks var excelApp = new Excel.Application(); excelApp.Visible = false; var workbook = excelApp.Workbooks.Add(); var dataSheet = (Excel.Worksheet)workbook.Worksheets[1]; dataSheet.Name = "SalesData"; var pivotSheet = (Excel.Worksheet)workbook.Worksheets.Add(); pivotSheet.Name = "Pivot"; // Populate header row dataSheet.Cells[1, 1] = "Product"; dataSheet.Cells[1, 2] = "Region"; dataSheet.Cells[1, 3] = "Sales"; // Add sample data rows object[,] rows = { { "Laptop", "无rth", 1200 }, { "Laptop", "South", 1500 }, { "Phone", "无rth", 800 }, { "Phone", "South", 950 }, { "Tablet", "East", 600 }, { "Tablet", "West", 750 }, { "Monitor", "无rth", 400 }, { "Monitor", "South", 500 }, { "Keyboard", "East", 300 }, }; for (int i = 0; i < rows.GetLength(0); i++) { dataSheet.Cells[i + 2, 1] = rows[i, 0]; dataSheet.Cells[i + 2, 2] = rows[i, 1]; dataSheet.Cells[i + 2, 3] = rows[i, 2]; } // Build pivot cache from source range Excel.Range dataRange = dataSheet.Range["A1:C10"]; Excel.PivotCache pivotCache = workbook.PivotCaches().Create( Excel.XlPivotTableSourceType.xlDatabase, dataRange); // Create the PivotTable on the pivot sheet Excel.PivotTables pivotTables = (Excel.PivotTables)pivotSheet.PivotTables(); Excel.PivotTable pivotTable = pivotTables.Add( pivotCache, pivotSheet.Range["A3"], "SalesPivot"); // Assign field orientations ((Excel.PivotField)pivotTable.PivotFields("Product")).Orientation = Excel.XlPivotFieldOrientation.xlRowField; ((Excel.PivotField)pivotTable.PivotFields("Region")).Orientation = Excel.XlPivotFieldOrientation.xlColumnField; ((Excel.PivotField)pivotTable.PivotFields("Sales")).Orientation = Excel.XlPivotFieldOrientation.xlDataField; // Enable grand totals pivotTable.RowGrand = true; pivotTable.ColumnGrand = true; // Save and close workbook.SaveAs(@"C:\output\pivot_interop.xlsx"); workbook.Close(false); excelApp.Quit(); // Release every COM object -- skipping any of these causes Excel to stay in memory Marshal.ReleaseComObject(pivotTable); Marshal.ReleaseComObject(pivotTables); Marshal.ReleaseComObject(pivotCache); Marshal.ReleaseComObject(dataRange); Marshal.ReleaseComObject(pivotSheet); Marshal.ReleaseComObject(dataSheet); Marshal.ReleaseComObject(workbook); Marshal.ReleaseComObject(excelApp); $vbLabelText $csharpLabel 每个 COM 包装器都需要一个匹配的 Marshal.ReleaseComObject 调用。 即使缺少一个引用,也会导致 Excel 进程在后台持续运行,消耗内存和文件句柄,直到宿主进程结束。 清理工作量会随着电子表格操作的复杂程度而增加。 如何用IronXL达到同样的效果? IronXL不像 Interop 那样公开原生透视表 API——Open XML 透视表格式有数百个 XML 属性,大多数业务需求可以通过用纯 C# 编写的显式 LINQ 聚合更可靠地满足。 输出结果是一个干净的汇总表,当文件打开时,该汇总表能够正确地重新计算,而无需依赖 Excel 刷新数据透视表缓存。 using IronXL; using System.Data; // Create workbook and populate source data WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX); WorkSheet dataSheet = workbook.CreateWorkSheet("SalesData"); dataSheet["A1"].Value = "Product"; dataSheet["B1"].Value = "Region"; dataSheet["C1"].Value = "Sales"; object[,] rows = { { "Laptop", "无rth", 1200 }, { "Laptop", "South", 1500 }, { "Phone", "无rth", 800 }, { "Phone", "South", 950 }, { "Tablet", "East", 600 }, { "Tablet", "West", 750 }, { "Monitor", "无rth", 400 }, { "Monitor", "South", 500 }, { "Keyboard", "East", 300 }, }; for (int i = 0; i < rows.GetLength(0); i++) { dataSheet[$"A{i + 2}"].Value = rows[i, 0]; dataSheet[$"B{i + 2}"].Value = rows[i, 1]; dataSheet[$"C{i + 2}"].Value = rows[i, 2]; } // Aggregate data with LINQ -- equivalent to a pivot table row/column/value layout DataTable table = dataSheet["A1:C10"].ToDataTable(true); var summary = table.AsEnumerable() .GroupBy(row => row.Field<string>("Product")) .Select((group, idx) => new { Product = group.Key, TotalSales = group.Sum(r => Convert.ToDecimal(r["Sales"])), RegionCount = group.Select(r => r.Field<string>("Region")).Distinct().Count(), RowIndex = idx + 2 }) .OrderByDescending(x => x.TotalSales); // Write the summary sheet WorkSheet summarySheet = workbook.CreateWorkSheet("Summary"); summarySheet["A1"].Value = "Product"; summarySheet["B1"].Value = "Total Sales"; summarySheet["C1"].Value = "Regions"; foreach (var item in summary) { summarySheet[$"A{item.RowIndex}"].Value = item.Product; summarySheet[$"B{item.RowIndex}"].Value = (double)item.TotalSales; summarySheet[$"C{item.RowIndex}"].Value = item.RegionCount; } // Apply currency format to the sales column summarySheet["B:B"].FormatString = "$#,##0.00"; // Bold the header row summarySheet["A1:C1"].Style.Font.Bold = true; // Save -- no COM cleanup needed workbook.SaveAs(@"C:\output\analysis_ironxl.xlsx"); using IronXL; using System.Data; // Create workbook and populate source data WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX); WorkSheet dataSheet = workbook.CreateWorkSheet("SalesData"); dataSheet["A1"].Value = "Product"; dataSheet["B1"].Value = "Region"; dataSheet["C1"].Value = "Sales"; object[,] rows = { { "Laptop", "无rth", 1200 }, { "Laptop", "South", 1500 }, { "Phone", "无rth", 800 }, { "Phone", "South", 950 }, { "Tablet", "East", 600 }, { "Tablet", "West", 750 }, { "Monitor", "无rth", 400 }, { "Monitor", "South", 500 }, { "Keyboard", "East", 300 }, }; for (int i = 0; i < rows.GetLength(0); i++) { dataSheet[$"A{i + 2}"].Value = rows[i, 0]; dataSheet[$"B{i + 2}"].Value = rows[i, 1]; dataSheet[$"C{i + 2}"].Value = rows[i, 2]; } // Aggregate data with LINQ -- equivalent to a pivot table row/column/value layout DataTable table = dataSheet["A1:C10"].ToDataTable(true); var summary = table.AsEnumerable() .GroupBy(row => row.Field<string>("Product")) .Select((group, idx) => new { Product = group.Key, TotalSales = group.Sum(r => Convert.ToDecimal(r["Sales"])), RegionCount = group.Select(r => r.Field<string>("Region")).Distinct().Count(), RowIndex = idx + 2 }) .OrderByDescending(x => x.TotalSales); // Write the summary sheet WorkSheet summarySheet = workbook.CreateWorkSheet("Summary"); summarySheet["A1"].Value = "Product"; summarySheet["B1"].Value = "Total Sales"; summarySheet["C1"].Value = "Regions"; foreach (var item in summary) { summarySheet[$"A{item.RowIndex}"].Value = item.Product; summarySheet[$"B{item.RowIndex}"].Value = (double)item.TotalSales; summarySheet[$"C{item.RowIndex}"].Value = item.RegionCount; } // Apply currency format to the sales column summarySheet["B:B"].FormatString = "$#,##0.00"; // Bold the header row summarySheet["A1:C1"].Style.Font.Bold = true; // Save -- no COM cleanup needed workbook.SaveAs(@"C:\output\analysis_ironxl.xlsx"); $vbLabelText $csharpLabel 无需释放 COM 对象,无需终止 Excel 进程,也无需管理 Office 许可证。 同一段代码无需修改即可在 Linux、macOS 和 Windows 上编译运行。 有关聚合 API 的更多详细信息,请访问IronXL WorkSheet 文档。 输出 部署和维护方面的主要区别是什么? 部署要求 部署基于互操作性的应用程序需要验证目标环境是否运行 Windows,是否安装了正确的 Office 版本,以及服务器上是否配置了 COM 自动化权限。 云托管环境和容器化工作负载通常无法在不添加虚拟化 Windows 桌面基础架构的情况下满足这些要求,但这会显著增加成本和操作复杂性。 IronXL没有这样的限制。 添加NuGet包,将目标框架设置为.NET 6 或更高版本,应用程序即可部署到任何主机,包括 Linux 容器、Linux 上的 Azure 应用服务、AWS Lambda 和本地 Windows 服务器。 IronXL系统要求页面列出了完整的兼容性矩阵。 错误处理和调试 互操作失败表现为 COM 异常(COMException),这些异常很难映射到用户可见的消息。 已安装的 Office 版本与 Interop 程序集之间的版本不匹配会导致另一种故障模式。 调试这些问题通常需要在开发机器上重现完全相同的 Office 版本。 IronXL抛出带有描述性消息的标准 System.Exception 子类。 您可以将文件操作封装在 try-catch 块中,并在不了解 COM 错误代码的情况下提供有意义的反馈。 IronXL故障排除指南涵盖了常见异常及其解决方法。 内存和性能 COM 对象持有非托管内存。 如果你的代码处理很多工作表或在循环中运行,未能正确释放每个引用会导致内存随着时间的推移而增长——这个问题很难被发现,直到它导致生产事故。 由于 Interop 只驱动一个 Excel 窗口,因此它本质上也是单线程的。 IronXL使用由.NET垃圾回收器支持的托管对象。 当对象超出作用域时,内存会自动回收。 并行处理多个工作簿非常简单,因为没有需要用锁来保护的共享 COM 状态。 如何选择这两种方法? 选择合适的工具取决于两个限制条件:代码运行的位置,以及是否需要原生透视表 XML。 在以下情况下选择Excel互操作性: 该工作负载仅在已安装 Office 的 Windows 桌面计算机上运行。 输出文件必须完全符合原生透视表格式(切片器、分组日期字段、计算项)。 您维护着现有的互操作代码库,因此没有必要进行完全重写。 在以下情况下选择IronXL: 该应用程序运行在服务器、容器或云函数上 需要跨平台或Linux部署 您需要的是一个可使用单元测试进行测试的数据聚合逻辑,而不是依赖于 Excel 流程的逻辑。 您需要大规模或并行处理 Excel 文件。 对于大多数新的.NET 10 项目而言, IronXL是实际的默认选择。 IronXL库还涵盖了在 C# 中读取 Excel 文件、创建图表、应用单元格样式、使用公式以及将 Excel 数据导出到 DataTable——从而减少了您的技术栈中对多个库的需求。 IronXL还有哪些功能支持数据分析? 除了基本的聚合功能外, IronXL还提供了多种功能,支持更丰富的数据分析工作流程: 数据排序和筛选 在编写汇总表之前,您可以按升序或降序对数据范围进行排序。 这样可以确保输出始终以一致的顺序呈现数据,从而使下游处理更具可预测性。 有关范围级排序选项,请参阅IronXL排序文档。 应用条件格式 通过程序化方式应用条件格式规则,突出显示异常值或阈值。 例如,当销售额低于目标时,您可以将汇总表中的单元格颜色设置为红色,从而提供一目了然的视图,而无需最终用户手动配置规则。 读取现有 Excel 文件 如果源数据来自现有电子表格而不是数据库,则可以直接使用 WorkBook.Load 加载它: using IronXL; WorkBook existing = WorkBook.Load(@"C:\data\sales_report.xlsx"); WorkSheet sheet = existing.WorkSheets[0]; // Read column C starting at row 2 var salesValues = sheet["C2:C100"] .Where(cell => cell.Value != null && cell.Value.ToString() != string.Empty) .Select(cell => cell.DecimalValue) .ToList(); decimal total = salesValues.Sum(); Console.WriteLine($"Total sales from file: {total:C}"); using IronXL; WorkBook existing = WorkBook.Load(@"C:\data\sales_report.xlsx"); WorkSheet sheet = existing.WorkSheets[0]; // Read column C starting at row 2 var salesValues = sheet["C2:C100"] .Where(cell => cell.Value != null && cell.Value.ToString() != string.Empty) .Select(cell => cell.DecimalValue) .ToList(); decimal total = salesValues.Sum(); Console.WriteLine($"Total sales from file: {total:C}"); $vbLabelText $csharpLabel 此模式适用于 .csv 以及IronXL支持的其他格式。 有关支持的格式的详细信息,请参阅IronXL文件格式文档。 导出为 CSV 生成汇总工作表后,您可以将其导出为 CSV 文件,以便供不支持 Excel 的下游系统使用: workbook.SaveAsCsv(@"C:\output\summary.csv"); workbook.SaveAsCsv(@"C:\output\summary.csv"); $vbLabelText $csharpLabel 这在 ETL 管道中尤其有用,因为最终使用者是数据库导入工具或数据仓库加载器。 如何免费开始使用IronXL ? IronXL提供免费试用许可,让您无需订阅即可评估所有功能。 试用版会在输出文件上添加水印,应用正式版许可证密钥后即可移除水印。 要在代码中激活许可证密钥,请在执行任何IronXL操作之前进行设置: IronXl.License.LicenseKey = "YOUR-LICENSE-KEY-HERE"; IronXl.License.LicenseKey = "YOUR-LICENSE-KEY-HERE"; $vbLabelText $csharpLabel 您还可以通过环境变量(IRONXL_LICENSEKEY)或在ASP.NET Core项目中通过 appsettings.json 来设置密钥。 IronXL许可页面描述了所有可用的级别,包括团队和组织选项。 对于生产部署,请查看IronXL部署文档和更广泛的IronXL教程库,了解涵盖ASP.NET Core、Azure Functions 和 Docker 的模式。 如何迈出下一步? C# 中的 Excel 数据透视表并不一定意味着对 Office 的依赖和 COM 的复杂性。 使用IronXL,您可以编写可在任何平台上运行的纯.NET代码,自动处理内存,并自然地与单元测试框架和 CI/CD 管道集成。 下载免费的IronXL试用版,并使用本指南中的示例对您自己的数据运行该示例。 如果您遇到任何问题, IronXL社区论坛和支持门户网站对试用用户和授权用户均开放。 准备部署时,请查看许可选项,找到适合您团队规模和使用量的方案。 常见问题解答 使用 IronXL 创建数据透视表相对 Excel Interop 的优势是什么? 与传统的 Excel Interop 相比,IronXl.Excel 提供了一种更现代、更高效的方式在 Excel 文件中创建数据透视表。它简化了流程,减少了所需的模板代码量。 能否使用 IronXl.Excel 在 Excel 中使用 C# 创建数据透视表? 是的,IronXL 提供了一种使用 C# 在 Excel 中创建数据透视表的直接方法。它允许开发人员轻松操作 Excel 文件,而无需依赖 Excel Interop。 IronXL 兼容 .NET 应用程序吗? IronXl.Excel 与 .NET 应用程序完全兼容,因此是希望将 Excel 功能集成到 C# 项目中的开发人员的绝佳选择。 IronXL 是否要求在系统中安装 Excel? 不,IronXL 不需要在系统中安装 Microsoft Excel。它可以独立运行,与需要安装 Excel 的 Excel Interop 相比,这是一个显著的优势。 IronXL 如何简化数据透视表的创建过程? IronXL 通过提供用户友好的应用程序接口简化了这一过程,减少了对大量模板代码的需求,使开发过程更快、更高效。 使用 IronXL 的系统要求是什么? IronXL 需要与 .NET Framework 兼容的环境,但不需要安装 Microsoft Excel,这样可以简化部署并减少依赖性。 IronXL 能高效处理大型 Excel 文件吗? 是的,IronXl.Excel 设计用于高效处理大型 Excel 文件,因此适用于需要处理大量数据的业务应用程序。 与 Excel Interop 相比,使用 IronXL 是否有学习曲线? IronXL 的设计直观易学,并配有全面的文档和示例,与更复杂的 Excel Interop 相比更容易采用。 除了创建数据透视表,IronXl.Excel 还能执行哪些类型的 Excel 操作? IronXl.Excel 可以执行各种 Excel 操作,包括读写 Excel 文件、格式化单元格和应用公式等等。 IronXL 能否将数据透视表导出为 Excel 以外的格式? 虽然 IronXl.Excel 主要侧重于 Excel 操作,但它也支持将数据导出为 CSV 和 PDF 等其他格式,具体取决于您的项目要求。 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 工作簿。 阅读更多 在.NET C# 中下载 Excel 文件:将数据导出为 XLSX、CSV 等格式如何在Blazor中使用IronXL导...
已更新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 工作簿。 阅读更多