Как можно сравнить значения всех ячеек в таблице Excel?

Добрый день. <br/> У меня есть таблица с числовыми значениями в нескольких колонках. Мне нужно пройтись по каждому значению из первой, второй и третьей колонок и сравнить его со значениями из остальных колонок (на самом деле их можно объединить в одну). В случае совпадения, необходимо изменить заливку ячеек, содержащих эти совпадающие значения. Я подумал, что можно было бы создать массивы из колонок и перебрать их, но не знаю, как в таком случае изменить заливку ячеек. Кроме того, массивы будут довольно большими, так как в первых трех столбцах около 3000 значений. Насколько реально реализовать описанное на языке C#?
  • 19 октября 2024 г. 18:22
Ответы на вопрос 1
Здравствуйте!

Да, это вполне реально реализовать на C#. Вы можете использовать библиотеку **EPPlus** или **ClosedXML** для работы с файлами Excel, поскольку они позволяют легко манипулировать ячейками, форматированием и значениями в таблицах.

### Пример решения с использованием EPPlus:

1. Установите библиотеку EPPlus через NuGet:

   ```
   Install-Package EPPlus
   ```

2. Используйте следующий код для открытия файла Excel, сравнения значений и изменения заливки ячеек:

```csharp
using OfficeOpenXml;
using OfficeOpenXml.Style;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

class Program
{
    static void Main()
    {
        string filePath = "path_to_your_excel_file.xlsx"; // Укажите путь к вашему файлу
        FileInfo fileInfo = new FileInfo(filePath);

        using (ExcelPackage package = new ExcelPackage(fileInfo))
        {
            ExcelWorksheet worksheet = package.Workbook.Worksheets[0]; // Предполагается, что данные на первом листе
            int rows = worksheet.Dimension.End.Row;
            int cols = worksheet.Dimension.End.Column;

            // Список для хранения значений
            HashSet<double> values = new HashSet<double>();

            // Собираем значения из первых трех колонок
            for (int row = 1; row <= rows; row++)
            {
                for (int col = 1; col <= 3; col++)
                {
                    // Проверяем, не пустая ли ячейка
                    if (worksheet.Cells[row, col].Value != null)
                    {
                        double value;
                        if (double.TryParse(worksheet.Cells[row, col].Value.ToString(), out value))
                        {
                            values.Add(value);
                        }
                    }
                }
            }

            // Сравниваем оставшиеся колонки и меняем заливку при совпадении
            for (int row = 1; row <= rows; row++)
            {
                for (int col = 4; col <= cols; col++)
                {
                    if (worksheet.Cells[row, col].Value != null)
                    {
                        double value;
                        if (double.TryParse(worksheet.Cells[row, col].Value.ToString(), out value))
                        {
                            if (values.Contains(value))
                            {
                                // Меняем заливку
                                worksheet.Cells[row, col].Style.Fill.PatternType = ExcelFillStyle.Solid;
                                worksheet.Cells[row, col].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.Yellow); // Укажите нужный цвет
                            }
                        }
                    }
                }
            }

            // Сохраняем изменения
            package.Save();
        }

        Console.WriteLine("Работа завершена.");
    }
}
```

### Как работает код:

1. Вы создаете объект ExcelPackage, который загружает файл Excel.
2. Считываете значения из первых трех колонок и сохраняете их в хеш-сет (`HashSet<double>`) для исключения дубликатов.
3. После этого проходите по оставшимся колонкам, проверяя, есть ли значения из них в хеш-сете.
4. Если совпадение обнаружено, изменяете заливку ячейки.
5. Сохраняете изменения в файл.

### Примечания:

- Убедитесь, что файл Excel не открыт в других приложениях, когда вы выполняете код, чтобы избежать ошибок доступа.
- Выберите подходящий цвет для заливки по вашему усмотрению.
- Если значения в ваших ячейках имеют другой тип данных (например, текст), можете захотеть изменить соответствующую часть кода, чтобы обрабатывать этот тип.

Если у вас остались вопросы или нужна помощь с более конкретными частями кода, дайте знать!
Похожие вопросы