Работа с Excel в C++: библиотеки и примеры кода

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с Excel в C++: обзор библиотек и практические примеры

При разработке приложений на C++ часто возникает необходимость взаимодействовать с файлами Microsoft Excel (форматы .xls и .xlsx). Это может быть экспорт отчётов, импорт данных, автоматизация таблиц или анализ больших объёмов информации. В отличие от языков с богатой стандартной библиотекой (Python, C#), C++ не имеет встроенных средств для работы с Excel, но существует несколько мощных сторонних библиотек, которые решают эту задачу. В этой статье мы рассмотрим три популярных решения: xlnt, libxl и OpenXLSX, а также приведём примеры кода для каждой из них.

1. Библиотека xlnt (бесплатная, с открытым исходным кодом)

xlnt — современная C++ библиотека для чтения, записи и модификации файлов формата .xlsx. Она не зависит от COM-объектов или установленного Excel, что делает её идеальной для кроссплатформенных проектов (Windows, Linux, macOS). Библиотека использует стандарт C++14/17 и активно поддерживается сообществом.

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

  • Чтение и запись ячеек, строк, столбцов.
  • Поддержка стилей (шрифты, цвета, границы, выравнивание).
  • Работа с формулами, диапазонами, объединёнными ячейками.
  • Управление несколькими листами.
  • Работа с изображениями и диаграммами (ограниченно).

Установка (через vcpkg или сборка из исходников):

vcpkg install xlnt

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

#include <xlnt/xlnt.hpp>

int main() {
    xlnt::workbook wb;
    xlnt::worksheet ws = wb.active_sheet();
    ws.title("Отчёт");

    // Запись данных
    ws.cell("A1").value("Название");
    ws.cell("B1").value("Количество");
    ws.cell("C1").value("Цена");

    ws.cell("A2").value("Товар 1");
    ws.cell("B2").value(10);
    ws.cell("C2").value(250.5);

    // Стиль для заголовков
    xlnt::header_footer hf;
    xlnt::font bold_font(true);
    ws.cell("A1").font(bold_font);

    wb.save("example.xlsx");
    return 0;
}

Пример: чтение данных из существующего файла

#include <xlnt/xlnt.hpp>
#include <iostream>

int main() {
    xlnt::workbook wb;
    wb.load("example.xlsx");
    xlnt::worksheet ws = wb.active_sheet();

    for (auto row : ws.rows(false)) {
        for (auto cell : row) {
            std::cout << cell.to_string() << "\t";
        }
        std::cout << std::endl;
    }
    return 0;
}

2. Библиотека libxl (коммерческая, есть бесплатная версия)

libxl — это быстрая и лёгкая библиотека для работы с .xls и .xlsx. Она поддерживает как старый бинарный формат Excel 97-2003, так и современный OOXML. Библиотека распространяется под коммерческой лицензией, но для некоммерческого использования доступна бесплатная версия с ограничением (водяной знак на листе).

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

  • Поддержка обоих форматов: XLS и XLSX.
  • Форматирование ячеек: шрифты, цвета, границы, заливка.
  • Работа с формулами, объединёнными ячейками, автофильтрами.
  • Управление листами, диаграммами (ограниченно).
  • Высокая производительность при работе с большими файлами.

Установка: Скачайте SDK с официального сайта (libxl.com) и подключите заголовочные файлы и библиотеку к вашему проекту.

Пример: запись данных в XLSX

#include "libxl.h"

int main() {
    libxl::Book* book = xlCreateXMLBook(); // или xlCreateBook() для XLS
    if (book) {
        libxl::Sheet* sheet = book->addSheet("Лист1");
        if (sheet) {
            sheet->writeStr(0, 0, "Имя");
            sheet->writeNum(1, 0, 123.45);
            sheet->writeStr(2, 1, "Текст");
        }
        book->save                    

Рекомендаций