НейроАгент

Как создавать файлы Excel в C# без Office

Узнайте, как создавать файлы Excel (.XLS и .XLSX) в C# без Microsoft Office с использованием EPPlus, NPOI, ClosedXML и других библиотек. Полное руководство с примерами кода.

Вопрос

Как можно создавать файлы Excel (.XLS и .XLSX) на C# без необходимости установки Microsoft Office на целевой машине?

НейроАгент

Создание файлов Excel (.XLS и .XLSX) в C# без установленного Microsoft Office

Создание файлов Excel (.XLS и .XLSX) в C# без установленного Microsoft Office возможно с помощью нескольких специализированных библиотек, которые напрямую работают с форматами файлов Excel, не требуя Office interop. Эти библиотеки работают с базовыми спецификациями форматов файлов, а не с автоматизацией, что делает их идеальными для серверных сред, развертывания и приложений, где Office не может быть установлен.


Содержание


Несколько библиотек отлично подходят для создания файлов Excel без необходимости установки Microsoft Office:

  • EPPlus - Отлично подходит для файлов .XLSX, не имеет зависимостей, хорошая производительность
  • NPOI - Поддерживает форматы .XLS и .XLSX, открытый исходный код
  • ClosedXML - Пользовательский интерфейс-обертка над OpenXML, поддерживает .XLSX и .XLSM
  • GemBox.Spreadsheet - Коммерческая библиотека с бесплатным тарифом, поддерживает несколько форматов
  • IronXL - Коммерческая библиотека с простым API, поддерживает .XLSX, .XLS и .CSV

У каждой библиотеки есть свои преимущества в зависимости от конкретных требований к поддержке форматов файлов, лицензированию и функциональным возможностям.


Инструкции по установке

Установка EPPlus

bash
Install-Package EPPlus

Установка NPOI

bash
Install-Package NPOI

Установка ClosedXML

bash
Install-Package ClosedXML

Установка GemBox.Spreadsheet

bash
Install-Package GemBox.Spreadsheet

Установка IronXL

bash
Install-Package IronXL

Все библиотеки доступны через NuGet Package Manager и могут быть установлены непосредственно из консоли диспетчера пакетов Visual Studio или через интерфейс диспетчера пакетов NuGet.


Учебное пособие по EPPlus

EPPlus - популярная библиотека для работы с файлами .XLSX, которая не требует никаких зависимостей и хорошо работает в серверных средах.

Основные возможности:

  • Поддерживает только формат .XLSX (Excel 2007+)
  • Нет зависимостей в пакете NuGet
  • Хорошая производительность для больших наборов данных
  • Бесплатна для коммерческого использования (версия 5+ требует лицензию для коммерческого использования)

Базовый пример:

csharp
using OfficeOpenXml;
using System;
using System.IO;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        // Установить контекст лицензии (требуется для EPPlus 5+)
        ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
        
        // Создать список данных
        List<string[]> data = new List<string[]>
        {
            new[] { "Имя", "Возраст", "Город" },
            new[] { "Иван Иванов", "25", "Москва" },
            new[] { "Мария Петрова", "30", "Лондон" },
            new[] { "Алексей Сидоров", "35", "Париж" }
        };
        
        // Создать Excel файл
        FileInfo fileInfo = new FileInfo("C:\\Temp\\output.xlsx");
        
        using (ExcelPackage excelPackage = new ExcelPackage(fileInfo))
        {
            var worksheet = excelPackage.Workbook.Worksheets.Add("Sheet1");
            
            // Записать данные в рабочий лист
            for (int i = 0; i < data.Count; i++)
            {
                for (int j = 0; j < data[i].Length; j++)
                {
                    worksheet.Cells[i + 1, j + 1].Value = data[i][j];
                }
            }
            
            // Автоматически подогнать ширину столбцов
            worksheet.Columns.AutoFit();
            
            // Сохранить файл
            excelPackage.Save();
        }
    }
}

Расширенные возможности:

  • Формулы и вычисления
  • Стили и форматирование ячеек
  • Диаграммы и сводные таблицы
  • Условное форматирование
  • Объединенные ячейки

Примечание: Версия EPPlus 5 и выше требует лицензию для коммерческого использования, хотя существует бесплатное сообщество.


Учебное пособие по NPOI

NPOI - это порт .NET библиотеки Apache POI для Java, и это лучший выбор, когда вам нужна поддержка форматов .XLS и .XLSX.

Основные возможности:

  • Поддерживает форматы .XLS и .XLSX
  • Открытый исходный код, бесплатен для коммерческого использования
  • Зрелый и стабильный
  • Хорошая производительность

Базовый пример (XLSX):

csharp
using NPOI.XSSF.UserModel;
using NPOI.SS.UserModel;
using System;
using System.IO;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        // Создать список данных
        List<string[]> data = new List<string[]>
        {
            new[] { "Имя", "Возраст", "Город" },
            new[] { "Иван Иванов", "25", "Москва" },
            new[] { "Мария Петрова", "30", "Лондон" },
            new[] { "Алексей Сидоров", "35", "Париж" }
        };
        
        // Создать Excel файл (формат XLSX)
        using (var workbook = new XSSFWorkbook())
        {
            var sheet = workbook.CreateSheet("Sheet1");
            
            // Записать данные в рабочий лист
            for (int i = 0; i < data.Count; i++)
            {
                var row = sheet.CreateRow(i);
                for (int j = 0; j < data[i].Length; j++)
                {
                    row.CreateCell(j).SetCellValue(data[i][j]);
                }
            }
            
            // Автоматически изменить размер столбцов
            for (int i = 0; i < data[0].Length; i++)
            {
                sheet.AutoSizeColumn(i);
            }
            
            // Сохранить файл
            using (var fileStream = new FileStream("C:\\Temp\\output.xlsx", FileMode.Create, FileAccess.Write))
            {
                workbook.Write(fileStream);
            }
        }
    }
}

Базовый пример (XLS формат):

csharp
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System;
using System.IO;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        // Создать список данных
        List<string[]> data = new List<string[]>
        {
            new[] { "Имя", "Возраст", "Город" },
            new[] { "Иван Иванов", "25", "Москва" },
            new[] { "Мария Петрова", "30", "Лондон" },
            new[] { "Алексей Сидоров", "35", "Париж" }
        };
        
        // Создать Excel файл (формат XLS)
        using (var workbook = new HSSFWorkbook())
        {
            var sheet = workbook.CreateSheet("Sheet1");
            
            // Записать данные в рабочий лист
            for (int i = 0; i < data.Count; i++)
            {
                var row = sheet.CreateRow(i);
                for (int j = 0; j < data[i].Length; j++)
                {
                    row.CreateCell(j).SetCellValue(data[i][j]);
                }
            }
            
            // Автоматически изменить размер столбцов
            for (int i = 0; i < data[0].Length; i++)
            {
                sheet.AutoSizeColumn(i);
            }
            
            // Сохранить файл
            using (var fileStream = new FileStream("C:\\Temp\\output.xls", FileMode.Create, FileAccess.Write))
            {
                workbook.Write(fileStream);
            }
        }
    }
}

Учебное пособие по ClosedXML

ClosedXML - это пользовательский интерфейс-обертка над OpenXML SDK, который предоставляет интуитивный API для работы с файлами Excel.

Основные возможности:

  • Поддерживает форматы .XLSX и .XLSM (Excel 2007+)
  • Интуитивный и простой в использовании API
  • Открытый исходный код, бесплатен для коммерческого использования
  • Хорошая производительность

Базовый пример:

csharp
using ClosedXML.Excel;
using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        // Создать список данных
        var data = new List<string[]>
        {
            new[] { "Имя", "Возраст", "Город" },
            new[] { "Иван Иванов", "25", "Москва" },
            new[] { "Мария Петрова", "30", "Лондон" },
            new[] { "Алексей Сидоров", "35", "Париж" }
        };
        
        // Создать Excel файл
        using (var workbook = new XLWorkbook())
        {
            var worksheet = workbook.Worksheets.Add("Sheet1");
            
            // Записать данные в рабочий лист
            for (int i = 0; i < data.Count; i++)
            {
                for (int j = 0; j < data[i].Length; j++)
                {
                    worksheet.Cell(i + 1, j + 1).Value = data[i][j];
                }
            }
            
            // Добавить некоторые стили
            var headerRange = worksheet.Range("1:1");
            headerRange.Style.Font.Bold = true;
            headerRange.Style.Fill.BackgroundColor = XLColor.LightGray;
            
            // Автоматически подогнать ширину столбцов
            worksheet.Columns().AdjustToContents();
            
            // Сохранить файл
            workbook.SaveAs("C:\\Temp\\output.xlsx");
        }
    }
}

Расширенные возможности:

  • Богатые возможности стилизации
  • Диаграммы и условное форматирование
  • Сводные таблицы
  • Формулы и вычисления
  • Проверка данных

Сравнение библиотек и выбор

Таблица сравнения возможностей

Библиотека Поддержка .XLS Поддержка .XLSX Лицензия Зависимости Простота использования
EPPlus Бесплатна (v5+ требует коммерческую лицензию) Нет Средняя
NPOI Открытый исходный код (Apache 2.0) Нет Средняя
ClosedXML Открытый исходный код (LGPL) OpenXML SDK Высокая
GemBox.Spreadsheet Бесплатная/Коммерческая Нет Высокая
IronXL Бесплатная/Коммерческая Нет Высокая

Когда выбирать каждую библиотеку

Выбирайте EPPlus, когда:

  • Вам нужен только формат .XLSX
  • Вы хотите минимизировать зависимости
  • Вам нужна хорошая производительность для больших наборов данных
  • Вы согласны с требованиями лицензирования для коммерческого использования

Выбирайте NPOI, когда:

  • Вам нужна поддержка форматов .XLS и .XLSX
  • Вы предпочитаете открытый исходный код с перmissive лицензированием
  • Вам нужна совместимость с существующими системами на основе Java POI

Выбирайте ClosedXML, когда:

  • Вам нужен только формат .XLSX
  • Вы хотите интуитивный, удобный для разработчика API
  • Вы предпочитаете современный синтаксис C# и операции в стиле LINQ
  • Вам нужна хорошая производительность без сложных зависимостей

Выбирайте GemBox.Spreadsheet или IronXL, когда:

  • Вам нужна полная поддержка .XLS
  • Вы хотите самый простой API
  • Вы готовы рассмотреть коммерческое лицензирование для расширенных функций
  • Вам нужна корпоративная поддержка

Расширенные функции и соображения

Соображения производительности

Для больших наборов данных производительность может различаться между библиотеками:

  • EPPlus обычно хорошо работает с большими наборами данных и имеет хорошее управление памятью
  • NPOI эффективен, но может требовать больше ручной оптимизации для очень больших файлов
  • ClosedXML удобен в использовании, но может быть медленнее с чрезвычайно большими наборами данных

Оптимизация размера файла

Все библиотеки по-разному обрабатывают сжатие:

csharp
// EPPlus - можно контролировать сжатие
excelPackage.CompressionLevel = CompressionLevel.BestCompression;

// ClosedXML - автоматическое сжатие
workbook.SaveAs("output.xlsx");

Обработка ошибок

Всегда реализовывайте правильную обработку ошибок при работе с файловыми операциями:

csharp
try
{
    // Код создания Excel файла
}
catch (Exception ex)
{
    // Обрабатывать ошибки доступа к файлу, форматирования и т.д.
    Console.WriteLine($"Ошибка создания Excel файла: {ex.Message}");
}

Вопросы безопасности

При создании файлов Excel на веб-серверах:

  • Проверяйте входные данные для предотвращения атак внедрения Excel
  • Используйте правильные разрешения для файлов
  • Очищайте имена файлов для предотвращения обхода каталогов
  • Рассмотрите использование временных файлов с правильной очисткой

Заключение

Создание файлов Excel в C# без Microsoft Office является простым с помощью специализированных библиотек, которые работают напрямую со спецификациями форматов файлов. Ключевые выводы:

  1. Для нужд только .XLSX, EPPlus и ClosedXML являются отличными выборами с хорошей производительностью и простотой использования
  2. Для поддержки устаревшего .XLS, NPOI является лучшим открытым исходным кодом, который обрабатывает оба формата
  3. Для самого простого API, рассмотрите коммерческие библиотеки, такие как GemBox.Spreadsheet или IronXL
  4. Все библиотеки доступны через NuGet и не требуют установки Office на целевой машине
  5. Производительность и лицензирование должны быть вашими основными соображениями при выборе библиотеки

Выберите библиотеку, которая лучше всего соответствует вашим конкретным требованиям к поддержке форматов файлов, бюджету и срокам разработки. Для большинства современных приложений ClosedXML обеспечивает лучший баланс простоты использования и производительности, в то время как NPOI остается решением выбора, когда требуется поддержка устаревшего формата .XLS.


Источники

  1. Создание файлов Excel в C# без установки Microsoft Office
  2. Как создать файл Excel (.XLS и .XLSX) в C# без установки Microsoft Office? - Stack Overflow
  3. Создание файлов Excel из C# без Office - Stack Overflow
  4. Создание файлов Excel в C# без установки Microsoft Office | End Your If
  5. Создание файла Excel с использованием C# без использования Office или Interop (пример MVC (EPPlus) и Console (NPOI)) - QA With Experts
  6. 5 библиотек Excel, которые каждый .NET разработчик чаще всего использует - DEV Community
  7. GitHub - ClosedXML/ClosedXML
  8. Какая библиотека для генерации Excel в C#? OpenXmlSdk или ClosedXml? | Medium
  9. Создание Excel файлов в C# без MS Office | Openize.OpenXML-SDK
  10. Запись больших наборов данных в файлы Excel с использованием EPPlus в C# - DZone
  11. Библиотека для работы с электронными таблицами Excel для .NET Framework/Core - EPPlus Software
  12. Создание Excels с C# и EPPlus: учебное пособие
  13. В чем различия между библиотеками EPPlus и ClosedXML для работы с OpenXML? - Stack Overflow
  14. Чтение файла Excel с использованием C# с примерами кода
  15. Сравнение с другими компонентами - IronXL