Implementa il motore di calcolo personalizzato per estendere il motore di calcolo predefinito di Aspose.Cells con C++
Implementare un Motore di Calcolo Personalizzato
Aspose.Cells ha un potente motore di calcolo che può calcolare quasi tutte le formule di Microsoft Excel. Nonostante ciò, ti permette anche di estendere il motore di calcolo predefinito che ti offre maggiore potenza e flessibilità.
Le seguenti proprietà e classi vengono utilizzate nell’implementazione di questa funzionalità.
Il seguente codice implementa il Motore di Calcolo Personalizzato. Implementa l’interfaccia AbstractCalculationEngine che ha un metodo Calculate(CalculationData data). Questo metodo viene chiamato per tutte le formule. All’interno di questo metodo, catturiamo la funzione TODAY e aggiungiamo un giorno alla data di sistema. Quindi, se la data corrente è il 27/07/2023, il motore personalizzato calcolerà TODAY() come 28/07/2023.
Esempio di programmazione
#include <iostream>
#include <cwctype>
#include "Aspose.Cells.h"
#include <chrono>
using namespace Aspose::Cells;
class CustomEngine : public AbstractCalculationEngine
{
public:
void Calculate(CalculationData& data) override
{
U16String funcName = data.GetFunctionName();
std::u16string upperName;
for (int i = 0; i < funcName.GetLength(); ++i)
{
upperName.push_back(std::towupper(funcName[i]));
}
if (upperName == u"TODAY")
{
auto now = std::chrono::system_clock::now();
std::time_t now_time = std::chrono::system_clock::to_time_t(now);
std::tm local_tm;
#ifdef _WIN32
localtime_s(&local_tm, &now_time);
#else
localtime_r(&now_time, &local_tm);
#endif
Date today{ local_tm.tm_year + 1900, local_tm.tm_mon + 1, local_tm.tm_mday };
data.SetCalculatedValue(Date{ today.year, today.month, today.day + 1 });
}
}
bool GetProcessBuiltInFunctions() override { return true; }
};
class ImplementCustomCalculationEngine
{
public:
static void Run()
{
Workbook workbook;
Worksheet sheet = workbook.GetWorksheets().Get(0);
Cell a1 = sheet.GetCells().Get(u"A1");
Style style = a1.GetStyle();
style.SetNumber(14);
a1.SetStyle(style);
a1.SetFormula(u"=TODAY()");
workbook.CalculateFormula();
std::cout << "The value of A1 with default calculation engine: " << a1.GetStringValue().ToUtf8() << std::endl;
CustomEngine engine;
CalculationOptions opts;
opts.SetCustomEngine(&engine);
workbook.CalculateFormula(opts);
std::cout << "The value of A1 with custom calculation engine: " << a1.GetStringValue().ToUtf8() << std::endl;
std::cout << "Press any key to continue..." << std::endl;
std::cin.get();
}
};
int main()
{
Aspose::Cells::Startup();
ImplementCustomCalculationEngine::Run();
Aspose::Cells::Cleanup();
return 0;
}
Risultato
Si prega di controllare l’output della console del codice di esempio sopra, il valore (data ora) di A1 con il motore personalizzato dovrebbe essere un giorno dopo rispetto al risultato senza il motore personalizzato.