如何在 C# 中使用流比较 XLSX 文件 – 完整指南

手动比较 Excel 电子表格既繁琐又容易出错,尤其是在需要验证大型财务报告或审计数据集时。在本教程中,您将学习如何使用 GroupDocs.Comparison for .NET 通过基于流的处理高效比较 xlsx 文件。我们将逐步演示每一步,解释流的重要性,并提供可直接复制到您项目中的实用技巧。

快速答案

  • 哪个库处理 Excel 比较? GroupDocs.Comparison for .NET.
  • 我可以在不将文件保存到磁盘的情况下比较文件吗? 可以——使用流直接处理内存中的数据。
  • 生产环境是否需要许可证? 必须使用商业许可证;提供免费试用版。
  • 支持哪些 .NET 版本? .NET Framework 4.5+、.NET Core 3.1+、.NET 5/6/7。
  • 覆盖了多少种 Excel 格式? 超过 20 种,包括 .xls、.xlsx、.xlsm 和 .csv。

什么是 “how to compare xlsx”?

“How to compare xlsx” 指的是以编程方式检测两个 Excel 工作簿文件之间的差异。GroupDocs.Comparison for .NET 读取每个工作簿,评估单元格级别的更改,并生成带有高亮显示的结果文档,展示插入、删除和修改。比较会高亮显示更改的单元格、行和工作表,便于一目了然地审阅差异。

为什么使用基于流的比较?

流处理通过分块读取文件而不是将整个工作簿加载到内存,降低了内存压力。GroupDocs.Comparison 能够处理 50+ 种输入和输出格式,并处理 数百页的电子表格,同时在典型服务器硬件上将峰值内存使用保持在 100 MB 以下。这使其非常适合 Web 服务、微服务和本地批处理作业。

前置条件

  1. GroupDocs.Comparison for .NET – 从官方网站下载 这里
  2. C# 开发环境 – Visual Studio 2022 或任何支持 .NET 6+ 的 IDE。
  3. Excel 文件 – 您想要比较的两个 .xlsx 工作簿。
  4. 对流的基本了解 – 示例中使用了 System.IO.Stream 概念。

导入命名空间

以下命名空间为您提供比较引擎和流工具的访问权限。

GroupDocs.Comparison 命名空间包含核心比较类,而 System.IO 提供处理流所需的 FileStreamMemoryStream 类型。

步骤实现指南

使用流会如何影响性能?

使用 File.OpenRead() 加载每个工作簿,并将得到的流直接传递给比较器。此方法避免了临时文件,在 SSD 存储上可将 I/O 时间缩短最高 30 %,并且整个过程完全在内存中进行,这对高吞吐量的 Web API 至关重要。

步骤 1:初始化输出变量

定义比较结果的存储位置。使用 Path.Combine() 可确保在 Windows、Linux 或 macOS 上使用正确的目录分隔符。

专业提示: 在生产环境中,将输出写入临时文件夹或云存储桶,以保持应用程序目录整洁。

步骤 2:创建 Comparer 对象

Comparer 类是协调两个或多个文档比较的核心组件。

通过使用 File.OpenRead() 打开源工作簿来创建 Comparer 实例。using 语句可确保文件流自动关闭,防止文件句柄泄漏。

步骤 3:添加目标文档

将第二个工作簿添加到比较器中。如果需要将一个主文件与多个变体进行比较,可以链式添加额外的目标——这在区域报告或版本控制场景中非常有用。

步骤 4:执行比较

调用 Compare 方法生成差异文档。结果写入使用 File.Create() 创建的新流。输出文件会高亮显示所有更改的单元格、行和工作表,使可视化审阅变得直观。

Compare 方法执行比较并将结果文档作为流返回。

步骤 5:显示成功信息

比较完成后,记录包含输出路径的简短成功信息。在实际 API 中,您会将流返回给调用方或存储在云存储中以供后续检索。

常见问题与故障排除

  • 文件被占用错误: 确保没有其他进程(包括 Excel)打开该文件。使用 File.OpenRead() 打开的流会获取只读共享锁,减轻大多数冲突。
  • 大文件导致内存激增: 对于超过 100 MB 的工作簿,启用 ComparerOptionsEnableMemoryOptimization 标志(如果可用),并监控进程的私有内存。
  • 混合格式比较: GroupDocs.Comparison 支持一致的格式配对;请避免在同一次操作中比较 .xls.xlsx 文件,以防布局不匹配。
  • 流定位: 在复用流时,务必使用 stream.Seek(0, SeekOrigin.Begin) 将其重置到起始位置后再传递给比较器。

健壮的错误处理: 捕获 ComparisonException 以处理损坏的工作簿,并记录文件名以便后续调查。
ComparisonException 是 GroupDocs.Comparison 在输入文档损坏或使用不受支持的格式时抛出的异常。

性能与最佳实践

  • 及时释放流: 将每个 FileStream 包装在 using 块中。
  • 批处理: 使用 Parallel.ForEach 与异步比较器并发处理多个文件对,但限制并行度以避免 CPU 争用。
  • 健壮的错误处理: 捕获 ComparisonException 以处理损坏的工作簿,并记录文件名以便后续调查。
  • 验证输入流: 在比较前检查 MIME 类型或文件头,以提前拒绝非 Excel 上传。

ComparerOptions 提供比较过程的配置设置,例如内存优化和灵敏度控制。

高级使用场景

  • 数据库 BLOB 比较: 从 SQL Server 检索 Excel BLOB,包装为 MemoryStream,直接传递给比较器——无需临时文件。
  • 云存储集成: 使用 Azure Blob Storage SDK 获取 BlobStream 并传递给比较器,实现完全无服务器的工作流。
  • 实时 API 端点: 暴露一个接受两个 multipart/form‑data 文件的 POST 端点,实时比较并将差异以可下载流返回。

结论

通过利用 GroupDocs.Comparison 的基于流的 API,您可以获得一种 内存高效安全可扩展 的方式在 C# 中比较 XLSX 文件。本指南涵盖了从环境搭建到高级云场景的全部内容,为您在任何 .NET 解决方案中集成电子表格比较奠定了坚实基础。

常见问题

问:GroupDocs.Comparison for .NET 是否兼容所有 Excel 格式?
答: 是的,它支持超过 20 种与 Excel 相关的格式,包括 .xls、.xlsx、.xlsm 和 .csv,确保对传统和现代工作簿的广泛兼容性。

问:我可以自定义比较结果的视觉样式吗?
答: 当然可以。API 允许您通过 ComparisonOptions 设置高亮颜色、更改边框样式,并调整更改灵敏度级别。

问:生产环境是否需要商业许可证?
答: 任何商业部署都需要有效的 GroupDocs.Comparison 许可证。您可以在 此处 获取。

问:是否提供免费试用?
答: 是的,您可以在 此处 下载功能完整的试用版,以在购买前评估所有功能。

问:在哪里可以获得社区支持?
答: GroupDocs.Comparison 论坛 此处 是一个活跃的地方,您可以向其他开发者提问并分享解决方案。


最后更新: 2026-06-21
测试环境: GroupDocs.Comparison 23.10 for .NET
作者: GroupDocs

using System;
using System.IO;
string outputDirectory = "Your Document Directory";
string outputFileName = Path.Combine(outputDirectory, "result.xlsx");
using (Comparer comparer = new Comparer(File.OpenRead("source.xlsx")))
comparer.Add(File.OpenRead("target.xlsx"));
comparer.Compare(File.Create(outputFileName));
Console.WriteLine($"\nDocuments compared successfully.\nCheck output in {outputDirectory}.");

相关教程