Verringerung der Berechnungszeit der Cell.Calculate Methode mit C++

Mögliche Verwendungsszenarien

Normalerweise empfehlen wir den Benutzern, die Methode Workbook.CalculateFormula() einmal aufzurufen und dann die berechneten Werte der einzelnen Zellen zu erhalten. Manchmal möchten die Benutzer jedoch nicht die gesamte Arbeitsmappe berechnen. Sie möchten nur eine einzelne Zelle berechnen. Aspose.Cells bietet die Eigenschaft CalculationOptions.GetRecursive(), die Sie auf false setzen können, was die Berechnungszeit der einzelnen Zellen erheblich verringert. Wenn die rekursive Eigenschaft auf true gesetzt ist, werden alle Abhängigkeiten der Zellen bei jedem Aufruf neu berechnet. Wenn die rekursive Eigenschaft jedoch false ist, werden abhängige Zellen nur einmal berechnet und nicht erneut bei nachfolgenden Aufrufen.

Verringerung der Berechnungszeit der Cell.Calculate() Methode

Der folgende Beispielcode zeigt die Verwendung der Eigenschaft CalculationOptions.GetRecursive(). Führen Sie diesen Code mit der bereitgestellten Beispiel-Excel-Datei aus und prüfen Sie die Konsolenausgabe. Sie werden feststellen, dass das Setzen der rekursiven Eigenschaft auf false die Berechnungszeit erheblich verkürzt hat. Lesen Sie auch die Kommentare für ein besseres Verständnis dieser Eigenschaft.

#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;

}

Konsolenausgabe

Dies ist die Konsolenausgabe des oben genannten Beispielcodes, wenn er mit der bereitgestellten Beispiel-Excel-Datei auf unserer Maschine ausgeführt wird. Beachten Sie, dass Ihre Ausgabe unterschiedlich sein kann, aber die nach der Einstellung der rekursiven Eigenschaft auf false verstrichene Zeit immer kürzer ist als bei true.

Recursive True: 96 seconds

Recursive False: 42 seconds