Как сравнивать файлы XLSX в C# с использованием потоков – Полное руководство
Сравнение Excel‑таблиц вручную утомительно и подвержено ошибкам, особенно когда нужно проверять большие финансовые отчёты или аудитировать наборы данных. В этом руководстве вы узнаете, как сравнивать xlsx файлы эффективно с помощью GroupDocs.Comparison для .NET, используя потоковую обработку. Мы пройдём каждый шаг, объясним, почему потоки важны, и дадим практические советы, которые вы сможете сразу применить в своих проектах.
Быстрые ответы
- Какая библиотека обрабатывает сравнение 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 + input and output formats и работать с multi‑hundred‑page spreadsheets, удерживая пиковое потребление памяти ниже 100 MB на типичном серверном оборудовании. Это делает его идеальным для веб‑сервисов, микросервисов и локальных пакетных задач.
Предварительные требования
- GroupDocs.Comparison for .NET – загрузите с официального сайта здесь.
- C# development environment – Visual Studio 2022 или любая IDE, поддерживающая .NET 6+.
- Excel files – два файла
.xlsx, которые вы хотите сравнить. - Basic understanding of streams – концепции
System.IO.Streamиспользуются во всём примере.
Импорт пространств имён
Следующие пространства имён дают доступ к движку сравнения и утилитам работы с потоками.
Пространство имён GroupDocs.Comparison содержит основные классы сравнения, а System.IO предоставляет типы FileStream и MemoryStream, необходимые для работы с потоками.
Пошаговое руководство по реализации
Как использование потоков влияет на производительность?
Загружайте каждую рабочую книгу с помощью File.OpenRead() и передавайте полученный поток напрямую в сравниватель. Такой подход избегает временных файлов, сокращает время ввода‑вывода до 30 % на SSD‑накопителях и сохраняет процесс полностью в памяти, что критично для высокопроизводительных веб‑API.
Шаг 1: Инициализировать переменные вывода
Определите, где будет сохранён результат сравнения. Использование Path.Combine() гарантирует правильный разделитель каталогов в Windows, Linux или macOS.
Pro Tip: В продакшн‑среде записывайте вывод во временную папку или облачное хранилище, чтобы не захламлять каталог приложения.
Шаг 2: Создать объект Comparer
Класс Comparer — центральный компонент, оркестрирующий сравнение двух и более документов.
Создайте экземпляр Comparer, открыв исходную рабочую книгу через File.OpenRead(). Оператор using гарантирует автоматическое закрытие файлового потока, предотвращая утечки дескрипторов.
Шаг 3: Добавить целевой документ
Добавьте вторую рабочую книгу в сравниватель. При необходимости можно цепочкой добавить ещё несколько целей, если нужно сравнить один основной файл с несколькими вариантами — удобно для региональных отчётов или сценариев контроля версий.
Шаг 4: Выполнить сравнение
Вызовите метод Compare для генерации дифф‑документа. Результат записывается в новый поток, созданный с помощью File.Create(). Выходной файл подсвечивает все изменённые ячейки, строки и листы, упрощая визуальный обзор.
Compare method executes the comparison and returns the result document as a stream.
Шаг 5: Показать сообщение об успехе
После завершения сравнения запишите краткое сообщение об успехе, включающее путь к результату. В реальном API вы бы возвращали поток вызывающему коду или сохраняли его в облачном хранилище для последующего доступа.
Распространённые проблемы и их устранение
- Ошибки «файл используется»: Убедитесь, что ни один другой процесс (включая Excel) не открыл файл. Потоки, открытые через
File.OpenRead(), получают блокировку только для чтения, что уменьшает большинство конфликтов. - Пики памяти при больших файлах: Для книг более 100 MB включите флаг
ComparerOptionsEnableMemoryOptimization(если доступен) и следите за приватной памятью процесса. - Сравнение разных форматов: GroupDocs.Comparison поддерживает согласованные пары форматов; избегайте сравнения
.xlsс.xlsxв одной операции, чтобы предотвратить несоответствия макета. - Позиционирование потока: При повторном использовании потока всегда сбрасывайте его с помощью
stream.Seek(0, SeekOrigin.Begin)перед передачей в сравниватель.
Robust error handling: Catch ComparisonException for corrupted workbooks and log the file name for later investigation.ComparisonException is thrown by GroupDocs.Comparison when the input document is corrupted or uses an unsupported format.
Производительность и лучшие практики
- Своевременно освобождать потоки: Оборачивайте каждый
FileStreamв блокusing. - Пакетная обработка: Используйте
Parallel.ForEachс асинхронными сравнивателями для одновременной обработки нескольких пар файлов, но ограничьте степень параллелизма, чтобы избежать перегрузки CPU. - Robust error handling: Catch
ComparisonExceptionfor corrupted workbooks and log the file name for later investigation. - Проверка входных потоков: Проверьте MIME‑тип или заголовок файла перед сравнением, чтобы отклонять загрузки, не являющиеся Excel, на ранней стадии.
ComparerOptions provides configuration settings for the comparison process, such as memory optimization and sensitivity controls.
Расширенные сценарии использования
- Сравнение BLOB из базы данных: Получите BLOB Excel из SQL Server, оберните его в
MemoryStreamи передайте напрямую в сравниватель — без временных файлов. - Интеграция с облачным хранилищем: Используйте Azure Blob Storage SDK для получения
BlobStreamи передачи его в сравниватель, позволяя полностью безсерверные рабочие процессы. - API‑конечная точка в реальном времени: Предоставьте POST‑endpoint, принимающий два файла multipart/form‑data, сравнивающий их «на лету» и возвращающий diff в виде загружаемого потока.
Заключение
Используя потоковый API GroupDocs.Comparison, вы получаете memory‑efficient, secure и scalable способ сравнения XLSX‑файлов в C#. Это руководство охватило всё—from настройки до продвинутых облачных сценариев, предоставив прочную основу для интеграции сравнения электронных таблиц в любое решение на .NET.
Часто задаваемые вопросы
Q: Совместим ли GroupDocs.Comparison for .NET со всеми форматами Excel?
A: Да, он поддерживает более 20 форматов, связанных с Excel, включая .xls, .xlsx, .xlsm и .csv, обеспечивая широкую совместимость как со старыми, так и с современными рабочими книгами.
Q: Можно ли настроить визуальный стиль результата сравнения?
A: Абсолютно. API позволяет задавать цвета подсветки, менять стиль границы и регулировать уровень чувствительности изменений через ComparisonOptions.
Q: Нужна ли коммерческая лицензия для продакшн‑использования?
A: Для любой коммерческой эксплуатации требуется действующая лицензия GroupDocs.Comparison. Вы можете получить её здесь.
Q: Доступна ли бесплатная пробная версия?
A: Да, вы можете скачать полностью функциональную пробную версию здесь для оценки всех возможностей перед покупкой.
Q: Где можно получить поддержку сообщества?
A: Форум GroupDocs.Comparison здесь — активное место для вопросов и обмена решениями с другими разработчиками.
Last Updated: 2026-06-21
Tested With: GroupDocs.Comparison 23.10 for .NET
Author: 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}.");