用C++实现扩展Aspose.Cells默认计算引擎的自定义计算引擎
Contents
[
Hide
]
实现自定义计算引擎
Aspose.Cells具有强大的计算引擎,可以计算几乎所有的Microsoft Excel公式。尽管如此,它还允许您扩展默认的计算引擎,从而为您提供更大的动力和灵活性。
在实现此功能中使用了以下属性和类。
以下代码实现了自定义计算引擎。它实现了 AbstractCalculationEngine 接口,该接口具有一个 Calculate(CalculationData data) 方法。该方法会针对所有公式进行调用。在这个方法中,我们捕获了 TODAY 函数,并向系统日期添加了一天。因此,如果当前日期是2023年7月27日,那么自定义引擎将计算TODAY()为2023年7月28日。
编程示例
#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;
}
结果
请检查上述示例代码的控制台输出,具有自定义引擎的 A1 的值(日期时间)应该比没有自定义引擎的结果晚一天。