Jak porównać pliki Excel w .NET

Czy kiedykolwiek ręcznie sprawdzałeś różnice między dwoma plikami Excel? Niezależnie od tego, czy śledzisz zmiany w raportach finansowych, porównujesz wersje zestawów danych, czy audytujesz integralność danych, ręczne porównywanie jest czasochłonne i podatne na błędy. W tym przewodniku dowiesz się, jak porównać pliki Excel szybko i niezawodnie przy użyciu GroupDocs.Comparison dla .NET.

Szybkie odpowiedzi

  • Jakiej biblioteki mogę użyć? GroupDocs.Comparison for .NET
  • Ile linii kodu jest potrzebnych? Mniej niż 10 linii dla podstawowego diffu
  • Czy mogę porównać duże skoroszyty Excel? Tak – użyj opcji wydajności, aby obsłużyć duże pliki
  • Czy potrzebuję licencji? Darmowa wersja próbna działa do testów; licencja komercyjna jest wymagana w produkcji
  • Czy można zautomatyzować porównywanie Excel w interfejsie API webowym? Zdecydowanie – zobacz przykład kontrolera ASP.NET

Dlaczego porównywać pliki Excel programowo?

Zanim przejdziemy do kodu, porozmawiajmy o tym, dlaczego automatyczne porównywanie Excel jest przełomowe:

  • Version Control – Automatycznie śledź zmiany między wersjami dokumentów bez ręcznego otwierania plików
  • Data Auditing – Zapewnij spójność danych w całych działach i systemach
  • Quality Assurance – Wykrywaj niezgodności w raportach, zanim dotrą do interesariuszy
  • Workflow Automation – Zintegruj logikę porównywania z większymi procesami biznesowymi

Biblioteka GroupDocs.Comparison zajmuje się całą ciężką pracą, więc nie musisz martwić się parsowaniem formatów Excel ani implementacją skomplikowanych algorytmów diff.

Co to jest narzędzie do diffu plików Excel?

Narzędzie excel file diff tool porównuje dwie wersje arkusza kalkulacyjnego i podświetla dodatki, usunięcia oraz modyfikacje. GroupDocs.Comparison działa jako potężne, programistyczne narzędzie do diffu, które działa bezpośrednio z Twojego kodu .NET.

Wymagania wstępne i konfiguracja

Czego będziesz potrzebować

  • Development Environment: Środowisko programistyczne: Visual Studio 2019 lub nowsze (VS Code również działa)
  • GroupDocs.Comparison Library: Biblioteka GroupDocs.Comparison: Version 25.4.0 or later
  • Basic Knowledge: Podstawowa wiedza: Familiarity with C# and file handling in .NET
  • Sample Files: Pliki przykładowe: Dwa pliki Excel do testów (pokażemy, jak stworzyć scenariusze testowe)

Instalacja GroupDocs.Comparison dla .NET

Masz kilka opcji instalacji:

Opcja 1: Konsola Menedżera Pakietów NuGet

dotnet add package GroupDocs.Comparison --version 25.4.0

Opcja 2: Menedżer Pakietów Visual Studio

  1. Kliknij prawym przyciskiem myszy swój projekt w Solution Explorer
  2. Wybierz Manage NuGet Packages
  3. Wyszukaj GroupDocs.Comparison
  4. Zainstaluj najnowszą wersję

Opcje licencjonowania

Podczas pierwszych kroków możesz używać GroupDocs.Comparison w wersji próbnej. Do użytku produkcyjnego potrzebna będzie licencja:

  • Free Trial: Bezpłatna wersja próbna: Pełna funkcjonalność z znakami wodnymi oceny
  • Temporary License: Licencja tymczasowa: Zamów tutaj for testing
  • Commercial License: Licencja komercyjna: Opcje zakupu for production use

Jak porównać pliki Excel przy użyciu GroupDocs.Comparison

Teraz zbudujemy kompletną aplikację do porównywania plików Excel. Zacznijmy od prostego rozwiązania i dodawajmy bardziej zaawansowane funkcje w miarę postępu.

Krok 1: Podstawowa konfiguracja projektu

Najpierw utwórz nowy projekt C# i dodaj niezbędne dyrektywy using:

using GroupDocs.Comparison;
using System;
using System.IO;

Krok 2: Konfiguracja ścieżek plików

Skonfiguruj ścieżki plików w przejrzysty i łatwy do utrzymania sposób:

string documentDirectory = "YOUR_DOCUMENT_DIRECTORY";
string resultOutputDirectory = "YOUR_OUTPUT_DIRECTORY";

string sourceFilePath = Path.Combine(documentDirectory, "source_cells.xlsx");
string targetFilePath = Path.Combine(documentDirectory, "target_cells.xlsx");
string resultFilePath = Path.Combine(resultOutputDirectory, "comparison_result.xlsx");

Wskazówka: Używaj ścieżek względnych dla lepszej przenośności w różnych środowiskach programistycznych. Coś w stylu Path.Combine("TestData", "source_cells.xlsx") świetnie działa w większości scenariuszy.

Krok 3: Inicjalizacja klasy Comparer

Tutaj dzieje się magia. Klasa Comparer jest Twoim punktem wejścia dla wszystkich operacji porównywania:

using (Comparer comparer = new Comparer(sourceFilePath))
{
    // Add target file for comparison
    comparer.Add(targetFilePath);
}

Co się tutaj dzieje? Konstruktor Comparer ładuje Twój źródłowy plik Excel do pamięci i przygotowuje go do porównania. Instrukcja using zapewnia prawidłowe zwolnienie zasobów – jest to kluczowe przy pracy z potencjalnie dużymi plikami Excel.

Krok 4: Wykonanie porównania

Teraz właściwe porównanie. Jest zaskakująco proste:

using (Comparer comparer = new Comparer(sourceFilePath))
{
    comparer.Add(targetFilePath);
    // Compare and save results
    comparer.Compare(resultFilePath);
}

W tle, GroupDocs.Comparison analizuje oba pliki komórka po komórce, identyfikując:

  • Dodane wiersze i kolumny
  • Usuniętą zawartość
  • Zmodyfikowane wartości komórek
  • Zmiany formatowania
  • Różnice w formułach

Wyniki są zapisywane do wskazanego pliku wyjściowego z wyraźnie podświetlonymi różnicami.

Krok 5: Kompletny działający przykład

Oto kompletny, gotowy do produkcji przykład, którego możesz użyć od razu:

using GroupDocs.Comparison;
using System;
using System.IO;

class Program
{
    static Main()
    {
        try
        {
            // Set up file paths
            string documentDirectory = @"C:\TestFiles";
            string outputDirectory = @"C:\ComparisonResults";
            
            string sourceFile = Path.Combine(documentDirectory, "quarterly_report_v1.xlsx");
            string targetFile = Path.Combine(documentDirectory, "quarterly_report_v2.xlsx");
            string resultFile = Path.Combine(outputDirectory, "comparison_result.xlsx");
            
            // Ensure output directory exists
            Directory.CreateDirectory(outputDirectory);
            
            // Perform comparison
            using (Comparer comparer = new Comparer(sourceFile))
            {
                comparer.Add(targetFile);
                comparer.Compare(resultFile);
            }
            
            Console.WriteLine($"Comparison complete! Results saved to: {resultFile}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error during comparison: {ex.Message}");
        }
    }
}

Automatyzacja porównywania Excel – Zaawansowane opcje konfiguracji

Podstawowe porównanie jest potężne, ale możesz potrzebować większej kontroli nad procesem. Oto kilka zaawansowanych opcji.

Dostosowywanie ustawień porównywania

using (Comparer comparer = new Comparer(sourceFilePath))
{
    comparer.Add(targetFilePath);
    
    // Configure comparison options
    CompareOptions options = new CompareOptions()
    {
        ShowRevisions = true,
        DetectStyleChanges = true,
        GenerateSummaryPage = true
    };
    
    comparer.Compare(resultFilePath, options);
}

Porównywanie wielu plików

Potrzebujesz porównać więcej niż dwa pliki? Żaden problem:

using (Comparer comparer = new Comparer(sourceFilePath))
{
    comparer.Add(targetFile1Path);
    comparer.Add(targetFile2Path);
    comparer.Add(targetFile3Path);
    
    comparer.Compare(resultFilePath);
}

Przykłady implementacji w rzeczywistych scenariuszach

Scenariusz 1: Weryfikacja raportu finansowego

public class FinancialReportValidator
{
    public bool ValidateReportChanges(string previousReport, string currentReport)
    {
        string comparisonResult = Path.GetTempFileName() + ".xlsx";
        
        using (Comparer comparer = new Comparer(previousReport))
        {
            comparer.Add(currentReport);
            comparer.Compare(comparisonResult);
            
            // Check if there are significant changes
            return HasSignificantChanges(comparisonResult);
        }
    }
    
    private bool HasSignificantChanges(string comparisonFile)
    {
        // Your business logic here
        // For example, check if revenue columns changed by more than 5%
        return false;
    }
}

Scenariusz 2: Weryfikacja migracji danych

public class DataMigrationValidator
{
    public async Task<bool> VerifyMigration(string sourceData, string migratedData)
    {
        try
        {
            string resultPath = $"migration_validation_{DateTime.Now:yyyyMMdd_HHmmss}.xlsx";
            
            using (Comparer comparer = new Comparer(sourceData))
            {
                comparer.Add(migratedData);
                comparer.Compare(resultPath);
            }
            
            // Send result to stakeholders
            await NotifyStakeholders(resultPath);
            return true;
        }
        catch (Exception ex)
        {
            // Log error and handle gracefully
            Console.WriteLine($"Migration validation failed: {ex.Message}");
            return false;
        }
    }
}

Typowe problemy i rozwiązania

Nawet przy prostym API możesz napotkać pewne wyzwania. Oto najczęstsze problemy i sposoby ich rozwiązania.

Problem 1: „Plik jest używany przez inny proces”

Problem: Pliki Excel są zablokowane przez inne aplikacje.
Rozwiązanie: Zawsze używaj instrukcji using i upewnij się, że Excel nie jest otwarty:

// Good practice
using (Comparer comparer = new Comparer(sourceFilePath))
{
    // Your comparison logic
}

// Check if file is in use before comparison
private bool IsFileLocked(string filePath)
{
    try
    {
        using (FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.None))
        {
            return false;
        }
    }
    catch (IOException)
    {
        return true;
    }
}

Problem 2: Wydajność przy dużych plikach

Problem: Porównywanie trwa zbyt długo przy dużych plikach Excel.
Rozwiązanie: Rozważ następujące strategie optymalizacji:

// Process files in chunks or limit comparison scope
CompareOptions options = new CompareOptions()
{
    // Only compare content, skip formatting for speed
    DetectStyleChanges = false,
    
    // Limit comparison to specific ranges if possible
    // Note: Range limitation may require custom implementation
};

Problem 3: Zużycie pamięci

Problem: Aplikacja zużywa zbyt dużo pamięci przy dużych plikach.
Rozwiązanie: Wdroż właściwe zarządzanie zasobami:

public void CompareFilesWithMemoryManagement(string source, string target, string output)
{
    // Ensure garbage collection
    GC.Collect();
    GC.WaitForPendingFinalizers();
    
    using (Comparer comparer = new Comparer(source))
    {
        comparer.Add(target);
        comparer.Compare(output);
    }
    
    // Force cleanup
    GC.Collect();
}

Wskazówki optymalizacji wydajności – szybsze wykrywanie zmian w Excel

Najlepsze praktyki zarządzania pamięcią

  1. Zawsze używaj instrukcji using do automatycznego zwalniania zasobów
  2. Przetwarzaj pliki kolejno zamiast równolegle przy dużych plikach
  3. Rozważ limity rozmiaru plików – podziel ogromne pliki na mniejsze fragmenty
  4. Monitoruj zużycie pamięci podczas rozwoju i testów

Optymalizacja prędkości

// Optimize for speed
CompareOptions fastOptions = new CompareOptions()
{
    DetectStyleChanges = false,        // Skip formatting comparison
    ShowRevisions = false,             // Skip revision tracking
    GenerateSummaryPage = false        // Skip summary generation
};

Strategia przetwarzania wsadowego – efektywne porównywanie dużych skoroszytów Excel

public async Task CompareMultipleFilePairs(List<(string source, string target)> filePairs)
{
    foreach (var (source, target) in filePairs)
    {
        string output = $"comparison_{Path.GetFileNameWithoutExtension(source)}.xlsx";
        
        using (Comparer comparer = new Comparer(source))
        {
            comparer.Add(target);
            comparer.Compare(output);
        }
        
        // Small delay to prevent resource exhaustion
        await Task.Delay(100);
    }
}

Integracja z aplikacjami ASP.NET – automatyzacja porównywania Excel przez API

Chcesz dodać porównywanie Excel do swojej aplikacji webowej? Oto prosty przykład kontrolera:

[ApiController]
[Route("api/[controller]")]
public class ExcelComparisonController : ControllerBase
{
    [HttpPost("compare")]
    public async Task<IActionResult> CompareExcelFiles(IFormFile sourceFile, IFormFile targetFile)
    {
        if (sourceFile == null || targetFile == null)
            return BadRequest("Both source and target files are required.");
        
        try
        {
            // Save uploaded files temporarily
            string tempDir = Path.GetTempPath();
            string sourcePath = Path.Combine(tempDir, sourceFile.FileName);
            string targetPath = Path.Combine(tempDir, targetFile.FileName);
            string resultPath = Path.Combine(tempDir, $"comparison_{Guid.NewGuid()}.xlsx");
            
            using (var sourceStream = new FileStream(sourcePath, FileMode.Create))
            {
                await sourceFile.CopyToAsync(sourceStream);
            }
            
            using (var targetStream = new FileStream(targetPath, FileMode.Create))
            {
                await targetFile.CopyToAsync(targetStream);
            }
            
            // Perform comparison
            using (Comparer comparer = new Comparer(sourcePath))
            {
                comparer.Add(targetPath);
                comparer.Compare(resultPath);
            }
            
            // Return result file
            var resultBytes = await System.IO.File.ReadAllBytesAsync(resultPath);
            
            // Cleanup temporary files
            System.IO.File.Delete(sourcePath);
            System.IO.File.Delete(targetPath);
            System.IO.File.Delete(resultPath);
            
            return File(resultBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "comparison_result.xlsx");
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"Comparison failed: {ex.Message}");
        }
    }
}

Kiedy używać porównywania plików Excel

Porównywanie Excel jest szczególnie przydatne w następujących scenariuszach:

Usługi finansowe

  • Quarterly Report Reviews – porównaj bieżące raporty z raportami z poprzedniego kwartału
  • Budget Tracking – monitoruj zmiany budżetu w różnych działach
  • Audit Preparation – zapewnij spójność danych przed audytami zewnętrznymi

Zarządzanie danymi

  • ETL Validation – zweryfikuj transformacje danych podczas migracji
  • Quality Assurance – upewnij się, że zaimportowane dane odpowiadają systemom źródłowym
  • Version Control – śledź zmiany w plikach danych głównych

Business Intelligence

  • Report Validation – porównaj raporty automatyczne z ręcznymi obliczeniami
  • Data Reconciliation – dopasuj dane pomiędzy różnymi systemami
  • Change Tracking – monitoruj zmiany KPI w czasie

Najczęściej zadawane pytania

Q: Jaki jest maksymalny rozmiar pliku, który GroupDocs.Comparison może obsłużyć?
A: Biblioteka może obsługiwać pliki do kilku setek MB, ale wydajność zależy od dostępnej pamięci. Dla plików większych niż 50 MB rozważ implementację przetwarzania w partiach lub podejścia strumieniowego.

Q: Czy mogę porównać chronione hasłem pliki Excel?
A: Tak, ale musisz podać hasło podczas procesu porównywania. Biblioteka obsługuje zaszyfrowane pliki Excel przy użyciu odpowiednich danych uwierzytelniających.

Q: Jak dokładne jest porównanie skomplikowanych plików Excel z formułami?
A: GroupDocs.Comparison dokładnie wykrywa zmiany formuł, w tym odwołania do komórek i modyfikacje funkcji. Traktuje formuły jako zmiany treści i podświetla je odpowiednio.

Q: Czy mogę dostosować wizualny wygląd wyników porównania?
A: Biblioteka oferuje kilka wbudowanych stylów podświetlania. Do niestandardowego stylu możesz przetworzyć plik wyjściowy po zakończeniu lub zbadać opcje stylizacji w API.

Q: Czy istnieje sposób, aby porównać tylko określone arkusze w pliku Excel?
A: Choć biblioteka domyślnie porównuje całe pliki, możesz wstępnie przetworzyć pliki, aby wyodrębnić konkretne arkusze przed porównaniem, lub po przetworzyć wyniki, aby odfiltrować istotne zmiany.

Q: Jak GroupDocs.Comparison wykrywa zmiany w Excel?
A: Wykonuje diff komórka po komórce, sprawdzając wartości, formuły, formatowanie oraz modyfikacje strukturalne, takie jak dodane lub usunięte wiersze/kolumny.

Q: Czy narzędzie dobrze radzi sobie z bardzo dużymi skoroszytami Excel?
A: Tak – wyłączając wykrywanie stylów (DetectStyleChanges = false) i używając przetwarzania wsadowego, możesz efektywnie porównywać duże pliki Excel.

Dodatkowe zasoby


Ostatnia aktualizacja: 2026-04-10
Testowano z: GroupDocs.Comparison 25.4.0
Autor: GroupDocs