Excel парсер на C#

Приветствую! Здесь вы наверняка найдете, что ищете. Примеры в лаборатории рассчитаны на то, что мы разбираем что-то конкретное.

Текущая статья посвящена чтению Excel на C# — парсинг таблиц и извлечение данных.

Поэтому за теорией по текущей теме вам — в энциклопедию. Если ещё не погружались, то маршрут прост:

  1. Основы
  2. Система и сеть
  3. Данные и разметка
  4. Код и разработка
  5. Языки
  6. Искусственный интеллект
  7. Проект
  8. Инфраструктура и безопасность
  9. Спин-офф

Обязательно пройдитесь.

А теперь приступим к нашему предмету.

Теория и соседние материалы

Excel парсер на C#

Excel парсер — это утилита, считывающая данные из файлов формата .xlsx (и иногда .xls) и преобразующая их в структурированные объекты C# для последующей обработки. Такой инструмент полезен при импорте данных из таблиц, автоматизации отчётов, миграции информации между системами или анализе пользовательских выгрузок.

В .NET существует несколько подходов к чтению Excel-файлов:

  • ClosedXML — удобная библиотека поверх Open XML SDK, не требующая установленного Microsoft Office.
  • EPPlus — мощная альтернатива, также работающая с .xlsx.
  • Microsoft.Office.Interop.Excel — COM-интерфейс, требующий наличия Excel на машине (не рекомендуется для серверных приложений).
  • NPOI — кроссплатформенная библиотека, поддерживающая как .xls, так и .xlsx.

Ниже представлен пример на основе ClosedXML, как наиболее простого и надёжного решения для большинства задач.


Установка зависимостей

Добавьте пакет через NuGet:

dotnet add package ClosedXML

Простой парсер: чтение всех ячеек

Этот пример читает все строки и столбцы из первого листа Excel-файла и выводит их в консоль.

Особенности:

  • RangeUsed() автоматически определяет границы данных, игнорируя пустые строки и столбцы.
  • Все значения приводятся к строкам, что подходит для общего случая.
  • Поддерживает только .xlsx (Office Open XML).

Типизированный парсер: десериализация в объекты

Часто требуется преобразовать строки Excel в экземпляры классов. Для этого можно сопоставить заголовки с полями объекта.


Модель данных

public class Employee
{
    public string FullName { get; set; } = string.Empty;
    public string Department { get; set; } = string.Empty;
    public int Salary { get; set; }
    public DateTime HireDate { get; set; }
}

Парсер с маппингом

Преимущества:

  • Чёткое соответствие между колонками и свойствами объекта.
  • Валидация и безопасный парсинг типов.
  • Легко расширяемо для других моделей.

Расширенный парсер с поддержкой нескольких листов и ошибок

Для production-кода важно обрабатывать исключения и поддерживать гибкость.


Работа с формулами и форматами

ClosedXML позволяет получать не только значения, но и исходные формулы, стили, комментарии:

var cell = worksheet.Cell("A1");
Console.WriteLine($"Значение: {cell.Value}");
Console.WriteLine($"Формула: {cell.FormulaA1}");
Console.WriteLine($"Цвет фона: {cell.Style.Fill.BackgroundColor}");

Однако для большинства парсеров достаточно Value, так как Excel при сохранении обычно вычисляет формулы и сохраняет результат.


Альтернатива: EPPlus (краткий пример)

Если вы предпочитаете EPPlus:

using OfficeOpenXml;

// Включить лицензирование (требуется с версии 5+)
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;

using var package = new ExcelPackage(new FileInfo("data.xlsx"));
var sheet = package.Workbook.Worksheets[0];
var value = sheet.Cells["A1"].Text;

Ограничения и рекомендации

  • Формат файла: ClosedXML работает только с .xlsx. Для .xls используйте NPOI.
  • Производительность: При работе с большими файлами (>100 тыс. строк) рассмотрите потоковую обработку или использование DataTable.
  • Безопасность: Не парсите Excel-файлы из недоверенных источников — они могут содержать макросы или вредоносные ссылки.
  • Локализация: Даты и числа зависят от региональных настроек Excel. Используйте явный парсинг с CultureInfo.InvariantCulture.