Avatar ·

Как создать Excel файл (.xls/.xlsx) в C# без установленного Microsoft Office?

Привет всем! Я начинающий C# разработчик и столкнулся с проблемой: мне нужно программно создавать Excel файлы (как старый формат .xls, так и новый .xlsx) в моем приложении. Проблема в том, что на сервере, где будет запускаться программа, не установлен Microsoft Office, а устанавливать его туда нельзя. Изначально я попытался использовать библиотеку Microsoft.Office.Interop.Excel, но код выдает ошибку, так как COM-объект не может быть создан без установленного Office. Вот мой старый код, который я пытался использовать: ```csharp using Microsoft.Office.Interop.Excel; Application excelApp = new Application(); Workbook workbook = excelApp.Workbooks.Add(); Worksheet worksheet = workbook.Worksheets[1]; worksheet.Cells[1, 1] = "Привет, мир!"; workbook.SaveAs("test.xlsx"); workbook.Close(); excelApp.Quit(); ``` Я понимаю, что это плохой подход, но не знаю, как правильно решить задачу. Мне нужно создавать таблицы с данными, форматировать ячейки (цвета, границы), добавлять несколько листов в книгу. Какие есть альтернативные библиотеки для работы с Excel в C#, которые не требуют установки Office? Желательно с примерами кода и без лишних зависимостей. Буду благодарен за подробное объяснение! <<>>

Лучшее решение: библиотека EPPlus (для .xlsx)

Рекомендую использовать EPPlus — это мощная и бесплатная библиотека для создания и чтения Excel файлов нового формата (.xlsx) без установки Microsoft Office. Она работает через Open XML и не требует COM-объектов.

Установка

Установите через NuGet Package Manager:

Install-Package EPPlus

Или через .NET CLI:

dotnet add package EPPlus

Пример создания простого Excel файла

Вот как переписать ваш пример с использованием EPPlus:

using OfficeOpenXml;
using System.IO;

class Program
{
    static void Main()
    {
        // Устанавливаем лицензию (бесплатная для некоммерческого использования)
        ExcelPackage.LicenseContext = LicenseContext.NonCommercial;

        using (var package = new ExcelPackage())
        {
            // Добавляем лист
            var worksheet = package.Workbook.Worksheets.Add("Лист1");
            
            // Записываем данные
            worksheet.Cells[1, 1].Value = "Привет, мир!";
            
            // Сохраняем файл
            FileInfo file = new FileInfo(@"C:\test.xlsx");
            package.SaveAs(file);
        }
    }
}

Расширенный пример: форматирование и несколько листов

Покажу, как добавить форматирование, цвета, границы и несколько листов:

using OfficeOpenXml;
using OfficeOpenXml.Style;
using System.Drawing;

class Program
{
    static void Main()
    {
        ExcelPackage.LicenseContext = LicenseContext.NonCommercial;

        using (var package = new ExcelPackage())
        {
            // Лист 1: данные с форматированием
            var sheet1 = package.Workbook.Worksheets.Add("Отчет");
            
            // Заголовок
            sheet1.Cells[1, 1].Value = "Имя";
            sheet1.Cells[1, 2].Value = "Возраст";
            sheet1.Cells[1, 3].Value = "Город";
            
            // Стилизация заголовка
            using (var range = sheet1.Cells[1, 1, 1, 3])
            {
                range.Style.Font.Bold = true;
                range.Style.Fill.PatternType = ExcelFillStyle.Solid;
                range.Style.Fill.BackgroundColor.SetColor(Color.LightBlue);
                range.Style.Border.BorderAround(ExcelBorderStyle.Thin);
            }
            
            // Данные
            sheet1.Cells[2, 1].Value = "Анна";
            sheet1.Cells[2, 2].Value = 25;
            sheet1.Cells[2, 3].Value = "Москва";
            
            sheet1.Cells[3, 1].Value = "Иван";
            sheet1.Cells[3, 2].Value = 30;
            sheet1.Cells[3, 3].Value = "СПб";
            
            // Автоматическая ширина колонок
            sheet1.Cells[1, 1, 3, 3].AutoFitColumns();
            
            // Лист 2: второй отчет
            var sheet2 = package.Workbook.Worksheets.Add("Аналитика");
            sheet2.Cells[1, 1].Value = "Дата";
            sheet2.Cells[1, 2].Value = "Продажи";
            sheet2.Cells[2, 1].Value = DateTime.Now.ToShortDateString();
            sheet2.Cells[2, 2].Value = 15000;
            sheet2.Cells[2, 2].Style.Numberformat.Format = "#,##0.00";
            
            // Сохраняем
            package.SaveAs(new FileInfo(@"C:\report.xlsx"));
        }
    }
}

Особенности и преимущества EPPlus

  • Не требует Office — работает на чистом .NET
  • Поддерживает .xlsx (формат Office Open XML)
  • Форматирование: цвета, шрифты, границы, объединение ячеек
  • Диаграммы, сводные таблицы, формулы
  • Потоковая запись для больших файлов
  • Лицензия: бесплатно для некоммерческого использования (с версии 5+ требуется указание лицензии)

Для старого формата .xls

Если вам нужен .xls, используйте библиотеку NPOI (она поддерживает оба формата). Установка:

Install-Package NPOI

Пример для .xls:

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;

var workbook = new HSSFWorkbook();
var sheet = workbook.CreateSheet("Лист1");
var row = sheet.CreateRow(0);
row.CreateCell(0).SetCellValue("Привет");
using (var fs = new FileStream("test.xls", FileMode.Create))
    workbook.Write(fs);

Заключение

Для современных проектов рекомендую EPPlus — это наиболее полная и удобная библиотека. Если нужна поддержка .xls или вы хотите избежать лицензионных ограничений EPPlus, используйте NPOI (лицензия Apache 2.0, полностью бесплатно).

<<>>

Альтернативный подход: библиотека ClosedXML

Если вам нужна максимальная простота и вы работаете только с .xlsx форматом, обратите внимание на ClosedXML. Она построена над Open XML SDK, но предоставляет гораздо более удобный API, похожий на работу с Excel через интерфейс.

Установка

Install-Package ClosedXML

Пример кода

using ClosedXML.Excel;

var workbook = new XLWorkbook();
var ws = workbook.Worksheets.Add("Лист1");
ws.Cell(1, 1).Value = "Привет, мир!";
ws.Cell(1, 1).Style.Font.Bold = true;
ws.Cell(1, 1).Style.Fill.BackgroundColor = XLColor.LightBlue;

// Добавляем данные
ws.Cell(2, 1).Value = "Анна";
ws.Cell(2, 2).Value = 25;

// Сохраняем
workbook.SaveAs("test.xlsx");

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

  • Очень простой и интуитивный API
  • Поддержка стилей, формул, объединения ячеек
  • Работает без Office
  • Полностью бесплатный (лицензия MIT)

Недостатки

  • Только .xlsx (не поддерживает .xls)
  • Может быть медленнее EPPlus при работе с очень большими файлами (более 100 000 строк)

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