Excel парсер на C#
Приветствую! Здесь вы наверняка найдете, что ищете. Примеры в лаборатории рассчитаны на то, что мы разбираем что-то конкретное.
Текущая статья посвящена чтению Excel на C# — парсинг таблиц и извлечение данных.
Поэтому за теорией по текущей теме вам — в энциклопедию. Если ещё не погружались, то маршрут прост:
- Основы
- Система и сеть
- Данные и разметка
- Код и разработка
- Языки
- Искусственный интеллект
- Проект
- Инфраструктура и безопасность
- Спин-офф
Обязательно пройдитесь.
А теперь приступим к нашему предмету.
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.