如何在 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 服务、微服务和本地批处理作业。
前置条件
- GroupDocs.Comparison for .NET – 从官方网站下载 这里。
- C# 开发环境 – Visual Studio 2022 或任何支持 .NET 6+ 的 IDE。
- Excel 文件 – 您想要比较的两个
.xlsx工作簿。 - 对流的基本了解 – 示例中使用了
System.IO.Stream概念。
导入命名空间
以下命名空间为您提供比较引擎和流工具的访问权限。
GroupDocs.Comparison 命名空间包含核心比较类,而 System.IO 提供处理流所需的 FileStream 和 MemoryStream 类型。
步骤实现指南
使用流会如何影响性能?
使用 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 的工作簿,启用
ComparerOptions的EnableMemoryOptimization标志(如果可用),并监控进程的私有内存。 - 混合格式比较: 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}.");