مقدمة: لماذا "بدون Office" وماذا في الداخل؟
\n\nإذا كنت قد بحثت يومًا عن كيفية إنشاء ملف Excel بلغة C#، فمن المحتمل أنك صادفت السؤال الشهير على Stack Overflow الذي حظي بعشرات الآلاف من المشاهدات. والألم الرئيسي هناك هو العبارة "بدون تثبيت Microsoft Office". لماذا؟ لأن سحب كائنات COM معك، والاعتماد على إصدار Excel على الخادم، ومواجهة أخطاء مثل "فشل استرداد مصنف فئة COM للمكون..." هو طريق الجحيم للمطور.
\n\nولكن كيف يمكن إنشاء ملفات .XLSX و .XLS؟ الإجابة تكمن في كيفية تنظيم التنسيق نفسه. Excel الحديث (بدءًا من عام 2007) هو مجرد أرشيف ZIP عادي يحتوي على ملفات XML بداخله. نعم، لم تسمع خطأ: خذ أي ملف .xlsx، وأعد تسميته إلى .zip، وافتحه - وسترى مجلدات xl و _rels و docProps والكثير من مستندات XML. كل ورقة، كل خلية، كل نمط - هو XML منظم بدقة. أما التنسيق القديم .XLS فهو تنسيق ثنائي (BIFF)، ولكن توجد له أيضًا حلول مفتوحة المصدر.
في هذه المقالة، سنلقي نظرة تحت غطاء هذه العملية: سنستعرض المكتبات الشائعة، ونكتب كودًا حيًا، ونفهم ما يحدث حقًا عندما نستدعي Save(). هيا بنا!
1. الأعمدة الثلاثة لـ C# للعمل مع Excel بدون Office
\n\nحتى يومنا هذا، هناك ثلاثة متنافسين رئيسيين يحلون المشكلة "مباشرة من الصندوق". كل منهم يعمل مع التنسيق مباشرة، متجاوزًا Office المثبت.
\n\n1.1. EPPlus (ترخيص LGPL / مملوك)
\nالمكتبة الأكثر شيوعًا لـ .NET. كانت مجانية في البداية، لكنها انتقلت منذ الإصدار 5.0 إلى ترخيص مدفوع للاستخدام التجاري. ومع ذلك، لا يزال من الممكن استخدامها للأغراض التعليمية والمشاريع الصغيرة (الإصدار 4.5.3.3 هو آخر إصدار مجاني). يعمل EPPlus فقط مع .XLSX.
\n\nكيف يعمل تحت الغطاء: يستخدم EPPlus System.IO.Packaging (أرشيف ZIP نفسه) ويقوم بإنشاء ملفات XML وفقًا لمواصفات Office Open XML (OOXML). يمكنه إنشاء أنماط وصيغ ورسوم بيانية - كل ما تراه في Excel.
1.2. ClosedXML
\nمجاني، مفتوح المصدر (ترخيص MIT). يعمل أيضًا فقط مع .XLSX. يتميز بواجهة برمجة تطبيقات سهلة الاستخدام تذكرنا بالعمل مع Excel نفسه: أنت تعمل مع Workbook و Worksheet و Cell. تحت الغطاء - نفس Open XML، لكن ClosedXML يتولى كل الأعمال الروتينية لإنشاء هيكل XML.
1.3. NPOI
\nنسخة من مكتبة Apache POI الشهيرة بلغة Java. الميزة الرئيسية هي أنه يمكنه العمل مع كل من .XLSX (عبر XSSFWorkbook) و .XLS القديم (عبر HSSFWorkbook). مجاني، مفتوح المصدر (Apache 2.0). مثالي إذا كنت بحاجة إلى دعم التنسيقات القديمة.
\n\nتحت الغطاء لـ .XLS: يكتب NPOI البيانات الثنائية مباشرة بتنسيق BIFF8. هذا أكثر تعقيدًا من XML، لكنه لا يتطلب ضغطًا.
\n\n2. نكتب الكود: إنشاء ملف Excel بثلاث طرق
\n\nلنقم بإنشاء تقرير بسيط مع عناوين وبيانات. فيما يلي أمثلة لكل مكتبة.
\n\n2.1. مثال مع ClosedXML (الأسهل)
\n\nusing ClosedXML.Excel;\n\n// إنشاء كتاب\nusing (var workbook = new XLWorkbook())\n{\n // إضافة ورقة\n var worksheet = workbook.Worksheets.Add("تقرير");\n\n // العناوين\n worksheet.Cell(1, 1).Value = "الاسم";\n worksheet.Cell(1, 2).Value = "العمر";\n worksheet.Cell(1, 3).Value = "المدينة";\n\n // البيانات\n worksheet.Cell(2, 1).Value = "آنا";\n worksheet.Cell(2, 2).Value = 28;\n worksheet.Cell(2, 3).Value = "موسكو";\n\n worksheet.Cell(3, 1).Value = "إيفان";\n worksheet.Cell(3, 2).Value = 35;\n worksheet.Cell(3, 3).Value = "سانت بطرسبرغ";\n\n // نمط للعناوين\n var headerRange = worksheet.Range("A1:C1");\n headerRange.Style.Font.Bold = true;\n headerRange.Style.Fill.BackgroundColor = XLColor.LightGray;\n\n // عرض تلقائي للأعمدة\n worksheet.Columns().AdjustToC