Работа с Excel в C++: обзор библиотек и примеры кода
Несмотря на то, что C++ не имеет встроенной поддержки формата Excel, существует несколько зрелых библиотек, которые позволяют читать, создавать и редактировать файлы .xlsx и .xls. В этой статье мы рассмотрим три наиболее популярных инструмента: libxlsxwriter, xlsxio и OpenXLSX. Вы узнаете, как установить каждую из них, и получите рабочие примеры для типовых задач — от генерации отчётов до импорта данных.
1. libxlsxwriter — создание XLSX с нуля
libxlsxwriter — это лёгкая C-библиотека для записи файлов Excel 2007+ (XLSX). Она не требует COM-объектов или установленного Office. Поддерживает форматирование, формулы, диаграммы, объединение ячеек и условное форматирование.
Установка (Linux / macOS):
git clone https://github.com/jmcnamara/libxlsxwriter.git
cd libxlsxwriter
make
sudo make install
Пример: создание простого отчёта
#include <xlsxwriter.h>
int main() {
lxw_workbook *workbook = workbook_new("report.xlsx");
lxw_worksheet *worksheet = workbook_add_worksheet(workbook, "Sales");
// Заголовки
worksheet_write_string(worksheet, 0, 0, "Товар", NULL);
worksheet_write_string(worksheet, 0, 1, "Количество", NULL);
worksheet_write_string(worksheet, 0, 2, "Цена", NULL);
// Данные
worksheet_write_string(worksheet, 1, 0, "Ноутбук", NULL);
worksheet_write_number(worksheet, 1, 1, 10, NULL);
worksheet_write_number(worksheet, 1, 2, 75000, NULL);
// Формула суммы
worksheet_write_formula(worksheet, 2, 2, "=C2*B2", NULL);
workbook_close(workbook);
return 0;
}
Компиляция: g++ -o create_excel create_excel.cpp -lxlsxwriter
Плюсы: высокая производительность, малый размер, активная поддержка.
Минусы: только запись (не умеет читать существующие файлы).
2. xlsxio — чтение и запись XLSX
xlsxio — библиотека на C с привязками для C++, которая поддерживает как чтение, так и запись XLSX-файлов. Основана на minizip и expat. Отлично подходит для потоковой обработки больших файлов.
Установка:
git clone https://github.com/brechtsanders/xlsxio.git
cd xlsxio
cmake .
make
sudo make install
Пример: чтение данных из Excel
#include <xlsxio_read.h>
int main() {
xlsxioreader reader = xlsxioread_open("data.xlsx");
if (reader) {
xlsxioreadersheet sheet = xlsxioread_sheet_open(reader, NULL, XLSXIOREAD_SKIP_EMPTY_ROWS);
while (xlsxioread_sheet_next_row(sheet)) {
const char* value;
while ((value = xlsxioread_sheet_next_cell(sheet)) != NULL) {
printf("%s\t", value);
}
printf("\n");
}
xlsxioread_sheet_close(sheet);
xlsxioread_close(reader);
}
return 0;
}
Компиляция: g++ -o read_excel read_excel.cpp -lxlsxio_read
Плюсы: двунаправленная работа, поддержка больших файлов.
Минусы: ограниченное форматирование (только строки и числа).
3. OpenXLSX — современный C++17 интерфейс
OpenXLSX — это header-only библиотека для C++17, которая предоставляет объектно-ориентированный API для чтения и записи XLSX. Не требует внешних зависимостей, кроме стандартной библиотеки.
Установка:
git clone https://github.com/troldal/OpenXLSX.git
cd OpenXLSX
mkdir build && cd build
cmake ..
make
sudo make install
Пример: создание файла с форматированием
#include <OpenXLSX/OpenXLSX.hpp>
using namespace OpenXLSX;
int main() {
XLDocument doc;
doc.create("styled_report.xlsx");
auto wks = doc.workbook().worksheet("Sheet1");
// Запись с форматированием
XLCell cell = wks.cell("A1");
cell