تقسيم ملفات Excel إلى ملفات متعددة

المقدمة

توجد العديد من السيناريوهات الواقعية التي يحتاج فيها المطور إلى تقسيم ملف Excel واحد إلى عدة ملفات أصغر. على سبيل المثال، قد يحتوي المصنف على ورقة عمل واحدة لكل قسم، ويحتاج كل رئيس قسم إلى تلقي ورقته فقط. في حالات أخرى، قد ترغب في استخراج جدول أو كتلة بيانات معينة من ورقة عمل وإرسالها كملف مستقل عبر البريد الإلكتروني، دون الكشف عن بقية المصنف. قد تحتاج المصنفات الكبيرة المدمجة أيضًا إلى تقسيمها إلى أجزاء أصغر لتسهيل التعامل، أو التحميل الأسرع، أو المعالجة اللاحقة بواسطة أنظمة أخرى.

يوفر Aspose.Cells طريقتين مرنتين لهذه المهمة. تتكرر الطريقة الأولى عبر كل ورقة عمل في المصنف المصدر وتنسخ محتواها إلى نسخة Workbook جديدة تمامًا، وتحفظ كل منها كملف منفصل. تركز الطريقة الثانية على نطاق خلايا محدد داخل ورقة عمل وتنسخ هذا النطاق فقط إلى مصنف جديد. في كلتا الحالتين، يكون التدفق العام هو نفسه: تحميل المصنف المصدر باستخدام الفئة Workbook، والوصول إلى البيانات ذات الصلة من خلال كائنات Worksheet وCells، ونقل المحتوى إلى Workbook الوجهة، ثم حفظ الوجهة على القرص.

تقسيم ملف Excel عن طريق نسخ كل ورقة عمل إلى مصنف جديد

نظرة عامة على الطريقة

في هذه الطريقة، يتم فتح المصنف المصدر مرة واحدة، ثم لكل Worksheet في مجموعة Worksheets الخاصة به، يتم إنشاء Workbook وجهة جديدة. ثم يتم نسخ محتوى ورقة العمل المصدر إلى ورقة العمل الأولى في المصنف الوجهة، ويتم حفظ المصنف الوجهة كملف مشتق اسمه من اسم ورقة العمل المصدر. النتيجة هي ملف إخراج واحد لكل ورقة عمل، حيث يحتوي كل ملف إخراج على بيانات ورقة مصدر واحدة.

هذه الطريقة هي الخيار الصحيح عندما تمثل كل ورقة عمل في المصنف المصدر وحدة معلومات مستقلة منطقيًا (مثل قسم، أو منطقة، أو شهر، أو خط منتجات) وتريد تسليم أو معالجة كل وحدة بشكل مستقل.

الخطوات

تصف الخطوات التالية كيفية تقسيم ملف Excel عن طريق نسخ كل ورقة عمل إلى مصنف جديد:

  1. افتح ملف Excel المصدر عن طريق إنشاء كائن Workbook وتمرير مسار الملف إلى منشئه.
  2. تتكرر عبر مجموعة Workbook.Worksheets باستخدام حلقة for أو foreach بحيث تتم معالجة كل Worksheet في الملف المصدر.
  3. داخل الحلقة، أنشئ نسخة Workbook وجهة جديدة (مصنف فارغ) لورقة العمل الحالية.
  4. أضف Worksheet جديدة إلى المصنف الوجهة (أو استخدم ورقة العمل الأولى الافتراضية) وعين لها اسمًا ذا معنى، ويفضل أن يكون نفس خاصية Name لورقة العمل المصدر.
  5. انسخ محتوى ورقة العمل المصدر إلى ورقة العمل الوجهة. يمكن القيام بذلك عن طريق التكرار عبر خلايا مجموعة Cells لورقة العمل المصدر وكتابة قيمها في الخلايا المقابلة لورقة العمل الوجهة، أو باستخدام الطريقة Cells.Copy لنقل نطاق كامل دفعة واحدة.
  6. أنشئ مسار ملف إخراج يتضمن اسم ورقة العمل المصدر (على سبيل المثال، dataDir + worksheet.Name + ".xls") بحيث يكون لكل ملف منشأ اسم فريد.
  7. استدعِ الطريقة Workbook.Save للمصنف الوجهة لكتابة الملف على القرص.
  8. كرر الخطوات من 3 إلى 7 لورقة العمل التالية حتى تتم معالجة جميع أوراق العمل.

مثال على الكود

using namespace Aspose::Cells;

int main() {
    Aspose::Cells::Startup();

    std::string dataDir = "data/";
    Workbook wb(U16String((dataDir + "book1.xls").c_str()));

    int sheetCount = wb.GetWorksheets().GetCount();
    for (int i = 0; i < sheetCount; ++i) {
        Worksheet sourceSheet = wb.GetWorksheets().Get(i);
        U16String sheetName = sourceSheet.GetName();

        Workbook destWorkbook;
        int destIndex = destWorkbook.GetWorksheets().Add();
        Worksheet destSheet = destWorkbook.GetWorksheets().Get(destIndex);
        destSheet.SetName(sheetName);

        destSheet.Copy(sourceSheet);

        std::string destFile = dataDir + sheetName.ToUtf8() + ".xls";
        destWorkbook.Save(U16String(destFile.c_str()), SaveFormat::Excel97To2003);
    }

    Aspose::Cells::Cleanup();
    return 0;
}

الناتج المتوقع هو مجموعة من الملفات الجديدة في دليل البيانات، ملف واحد لكل ورقة عمل من المصنف المصدر. كل ملف مسمى باسم ورقة المصدر المقابلة، ويحتوي الملف على البيانات (وبشكل اختياري التنسيق) لتلك الورقة الفردية.

تقسيم ملف Excel عن طريق نسخ نطاق إلى مصنف جديد

نظرة عامة على الطريقة

في بعض الأحيان، لا تتوافق البيانات التي تحتاج إلى تقسيمها مع ورقة عمل كاملة، بل مع منطقة مستطيلة محددة من ورقة عمل، مثل A1:D10 أو نطاق مسمى يمثل جدولًا معينًا. في هذه الحالات، يعد نسخ أوراق العمل بأكملها مضيعة، ويلزم اتباع طريقة أكثر دقة: تحديد النطاق المصدر، ونسخ هذا النطاق فقط إلى مصنف جديد، وحفظ الملف الجديد.

هذه الطريقة مثالية عندما تريد استخراج جدول واحد، أو كتلة تقرير، أو منطقة بيانات من ورقة عمل أكبر مع تجاهل جميع المحتويات غير ذات الصلة. وهي مفيدة أيضًا لتصدير المناطق التي يحددها المستخدم من ورقة كملفات مستقلة.

الخطوات

تصف الخطوات التالية كيفية تقسيم ملف Excel عن طريق نسخ نطاق محدد إلى مصنف جديد:

  1. افتح ملف Excel المصدر عن طريق إنشاء كائن Workbook مع مسار الملف.
  2. استرجع Worksheet الهدف الذي يحتوي على النطاق الذي تريد نسخه، إما عن طريق الفهرس (على سبيل المثال، الورقة الأولى) أو بالاسم من مجموعة Worksheets.
  3. حدد النطاق المراد نسخه. يمكن أن يكون هذا نطاق خلايا مشفرًا مثل A1:C10، أو نطاقًا مسمى تم الحصول عليه من خلال مجموعة Worksheet.Cells، أو نطاقًا تم إنشاؤه عبر Worksheet.Cells.CreateRange.
  4. أنشئ نسخة Workbook وجهة جديدة.
  5. الوصول إلى أول Worksheet في المصنف الوجهة (الورقة الافتراضية).
  6. انسخ النطاق المصدر إلى ورقة العمل الوجهة، عادةً بدءًا من الخلية A1. يمكن استخدام الطريقة Cells.Copy على مجموعة Cells الوجهة لنسخ نطاق كامل، أو يمكنك التكرار عبر خلايا النطاق المصدر وكتابة قيمها في خلايا الوجهة باستخدام PutValue. يمكن توفير CopyOptions اختيارية للتحكم فيما يتم نقله (القيم فقط، القيم والأنماط، الصيغ، وما إلى ذلك).
  7. احفظ المصنف الوجهة إلى مسار ملف جديد على القرص باستخدام الطريقة Workbook.Save.

مثال على الكود

using namespace Aspose::Cells;

int main() {
    Aspose::Cells::Startup();

    // تحديد مجلد البيانات ومسارات الملفات
    std::string dataDir = "data/";
    std::string sourcePath = dataDir + "book1.xls";
    std::string outputPath = dataDir + "outputrange.xls";

    // فتح ملف Excel المصدر
    Workbook sourceWorkbook(U16String(sourcePath.c_str()));

    // الحصول على ورقة العمل الأولى من المصنف المصدر
    Worksheet sourceWorksheet = sourceWorkbook.GetWorksheets().Get(0);

    // تحديد نطاق الخلايا المصدر A1:C10 (10 صفوف، 3 أعمدة بدءًا من الصف 0، العمود 0)
    Range sourceRange = sourceWorksheet.GetCells().CreateRange(0, 0, 10, 3);

    // إنشاء مصنف وجهة جديد
    Workbook destWorkbook;

    // الوصول إلى ورقة العمل الأولى في مصنف الوجهة
    Worksheet destWorksheet = destWorkbook.GetWorksheets().Get(0);

    // إنشاء نطاق الوجهة عند A1 بنفس أبعاد النطاق المصدر
    Range destRange = destWorksheet.GetCells().CreateRange(0, 0, 10, 3);

    // نسخ النطاق المصدر إلى نطاق الوجهة
    destRange.Copy(sourceRange);

    // حفظ مصنف الوجهة في ملف .xls جديد
    destWorkbook.Save(U16String(outputPath.c_str()), SaveFormat::Excel97To2003);

    Aspose::Cells::Cleanup();
    return 0;
}

الناتج المتوقع هو ملف جديد واحد في دليل البيانات يحتوي فقط على القيم (وبشكل اختياري التنسيق) للنطاق المحدد المستخرج من المصنف المصدر. لا توجد علاقة للملف الوجهة بأي بيانات أخرى في الملف المصدر؛ فهو يحتوي فقط على النطاق المستخرج، بدءًا من الخلية A1 في ورقة العمل الأولى الخاصة به.

مقالات ذات صلة