خفض وقت حساب طريقة Cell.Calculate باستخدام C++

سيناريوهات الاستخدام المحتملة

عادةً، نوصي المستخدمين باستدعاء طريقة Workbook.CalculateFormula() مرة واحدة ثم الحصول على القيم المحسوبة للخلايا الفردية. لكن أحيانًا، لا يرغب المستخدمون في حساب كامل دفتر العمل. إنهم فقط يرغبون في حساب خلية واحدة. يوفر Aspose.Cells الخاصية CalculationOptions.GetRecursive() التي يمكنك ضبطها إلى false، مما يقلل بشكل كبير من وقت حساب الخلايا الفردية. لأنه عندما تكون الخاصية التكرارية مضبوطة على true، يتم إعادة حساب جميع التوابع في كل استدعاء. ولكن عندما تكون الخاصية التكرارية false، يُحسب التوابع المعتمدة مرة واحدة فقط ولا يُعاد حسابها في الاستدعاءات التالية.

تخفيض وقت حساب الخلية لوسيلة (.Calculate())

توضح الشفرة النموذجية التالية استخدام خاصية CalculationOptions.GetRecursive(). يرجى تنفيذ هذه الشفرة مع ملف إكسل النموذجي والتحقق من إخراج وحدة التحكم الخاص بها. ستجد أن ضبط الخاصية التكرارية على false قد قلل بشكل كبير من وقت الحساب. يرجى أيضًا قراءة التعليقات لفهم أفضل لهذه الخاصية.

#include <iostream>
#include <chrono>
#include "Aspose.Cells.h"

using namespace Aspose::Cells;

void TestCalcTimeRecursive(bool isRecursive) {
    Workbook* workbook = new Workbook();
    CalculationOptions options;
    options.SetRecursive(isRecursive);

    auto start = std::chrono::high_resolution_clock::now();
    workbook->CalculateFormula(&options);
    auto end = std::chrono::high_resolution_clock::now();

    auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
    std::cout << "Time (recursive=" << isRecursive << "): " << duration << " ms" << std::endl;

    delete workbook;
}

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

    TestCalcTimeRecursive(true);
    TestCalcTimeRecursive(false);

    Aspose::Cells::Cleanup();
    return 0;
}
#include <iostream>
#include <chrono>
#include "Aspose.Cells.h"

using namespace Aspose::Cells;
using namespace std::chrono;

void TestCalcTimeRecursive(bool rec) {
    U16String srcDir(u"..\\Data\\01_SourceDirectory\\");
    Workbook wb(srcDir + u"sample.xlsx");
    Worksheet ws = wb.GetWorksheets().Get(0);
    CalculationOptions opts;
    opts.SetRecursive(rec);

    auto start = high_resolution_clock::now();
    for (int i = 0; i < 1000000; i++) {
        ws.GetCells().Get(u"A1").Calculate(opts);
    }
    auto stop = high_resolution_clock::now();

    auto duration = duration_cast<milliseconds>(stop - start);
    long estimatedTime = duration.count() / 1000;
    std::cout << "Recursive " << rec << ": " << estimatedTime << " seconds" << std::endl;
}

int main() {
    Aspose::Cells::Startup();
    TestCalcTimeRecursive(true);
    TestCalcTimeRecursive(false);
    Aspose::Cells::Cleanup();
    return 0;

}

مخرجات الوحدة

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

Recursive True: 96 seconds

Recursive False: 42 seconds