مستوى المقال: مبتدئ
في آخر المقال هيبقى عندك مسار (endpoint) واحد بيحوّل جدول في قاعدة بياناتك لملف Excel ينزّله المستخدم على جهازه في ثانية. وكمان هتعرف الحيلة اللي تمنع السيرفر يقع لما البيانات تكبر.
تصدير بيانات قاعدتك إلى ملف Excel في Node.js
المشكلة باختصار
زر "تصدير Excel" مطلوب في أي لوحة تحكم تقريبًا. المستخدم عايز يفتح البيانات في Excel، يفلتر، ويبعتها للمدير. الطريقة الغلط الشائعة إنك ترجّع البيانات JSON وتسيب الفرونت إند يبنيها، فتطلع ملف مكسور أو بترميز عربي غلط.
خلّينا نبسّطها بمثال قبل الكود. تخيّل أمين مخزن عنده دفتر ضخم فيه كل الأصناف (دي قاعدة البيانات). المدير طلب منه كشف بأسماء وأسعار بس. أمين المخزن بينسخ الأعمدة المطلوبة في ورقة منسّقة ويسلّمها. تصدير Excel بالظبط كده: تقرا صفوف من قاعدة البيانات، تكتبها بصيغة ملف xlsx، وتبعتها للمستخدم كتنزيل.
وبشكل أدق: ملف xlsx مش نص عادي، ده ملف مضغوط بصيغة OpenXML فيها XML منظّم للورقة والخلايا. عشان كده متكتبوش بإيدك، بتستخدم مكتبة جاهزة زي exceljs تبني الصيغة الصح.
الخطوات: من جدول لملف xlsx
- ثبّت المكتبة:
npm i exceljs. - اقرأ الصفوف اللي عايز تصدّرها من قاعدة البيانات.
- ابنِ ورقة، عرّف الأعمدة (العنوان + المفتاح + العرض).
- ضيف الصفوف، ثم اكتب الملف أو ابعته في الاستجابة.
أبسط نسخة تكتب الملف على القرص عشان تجرّب:
// npm i exceljs
const ExcelJS = require('exceljs');
async function buildReport(rows) {
const wb = new ExcelJS.Workbook();
const sheet = wb.addWorksheet('المستخدمون');
sheet.views = [{ rightToLeft: true }]; // ورقة عربية من اليمين لليسار
sheet.columns = [
{ header: 'الاسم', key: 'name', width: 28 },
{ header: 'الإيميل', key: 'email', width: 32 },
{ header: 'تاريخ التسجيل', key: 'created_at', width: 20 },
];
sheet.getRow(1).font = { bold: true }; // صف العناوين bold
rows.forEach(r => sheet.addRow(r));
await wb.xlsx.writeFile('report.xlsx');
}
ملاحظة مهمة للمبتدئ: key في تعريف العمود لازم يطابق اسم الحقل في كائن الصف. لو الحقل اسمه email والمفتاح mail، الخلية هتطلع فاضية.
خلّيه endpoint حقيقي ينزّل الملف
عشان المتصفح ينزّل الملف بدل ما يعرضه نص، محتاج تظبط هيدرين: نوع المحتوى، واسم الملف للتنزيل.