العمل مع 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