Implementar motor de cálculo personalizado para extender el motor de cálculo predeterminado de Aspose.Cells con C++
Implementar Motor de Cálculo Personalizado
Aspose.Cells tiene un potente motor de cálculo que puede calcular casi todas las fórmulas de Microsoft Excel. A pesar de esto, también te permite extender el motor de cálculo predeterminado, lo que te brinda mayor potencia y flexibilidad.
Se utilizan las siguientes propiedades y clases para implementar esta funcionalidad.
El siguiente código implementa el Motor de Cálculo Personalizado. Implementa la interfaz AbstractCalculationEngine que tiene un método Calculate(CalculationData data). Este método se llama para todas tus fórmulas. Dentro de este método, capturamos la función TODAY y añadimos un día a la fecha del sistema. Así que si la fecha actual es 27/07/2023, entonces el motor personalizado calculará TODAY() como 28/07/2023.
Ejemplo de Programación
#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;
}
Resultado
Por favor revisa la salida de consola del código de muestra anterior, el valor (fecha y hora) de A1 con el motor personalizado debería ser un día después del resultado sin el motor personalizado.