Работа с 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