AbstractCalculationEngine Özelliği Kullanımı
Giriş
Bu makale, özel fonksiyonları uygulamak için AbstractCalculationEngine özelliğini nasıl kullanacağınızı anlamınızı sağlar.
AbstractCalculationEngine arayüzü, belirli gereksinimleri karşılamak için Aspose.Cells çekirdek hesaplama motorunu genişletmek amacıyla özel formül hesaplama fonksiyonları eklemenize olanak tanır. Bu özellik, belirli gereksinimleri karşılamak için özel (kullanıcı tanımlı) fonksiyonları tanımlamak ve Aspose.Cells API’lerini kullanarak Aspose.Cells çekirdek hesaplama motoru içinde herhangi diğer varsayılan Microsoft Excel fonksiyonu gibi uygulamak ve değerlendirmek için kullanışlıdır.
SoyutHesapMakinesi Özelliği Kullanımı - 1
Aşağıdaki örnek kod, AbstractCalculationEngine arayüzünü uygular ve A1 ve A2 hücrelerinde yer alan MySampleFunc() ve YourSampleFunc() adlı iki özel fonksiyonun değerlerini değerlendirir ve döndürür. Daha sonra, Workbook.CalculateFormula(const CalculationOptions& options) yöntemini çağırarak AbstractCalculationEngine .Calculate(CalculationData& data) yöntemi uygulanır. Ardından, A1 ve A2’nin değerlerini konsola yazdırır. Daha fazla yardım için lütfen aşağıdaki örnek kodun Konsol Çıkışına bakın.
Örnek Kod
Aspose::Cells::Startup(); | |
//Implement AbstractCalculationEngine interface | |
class CustomFunction1 : public AbstractCalculationEngine | |
{ | |
public: | |
void Calculate(CalculationData& data) | |
{ | |
Object funcName = data.GetParamValue(0); | |
U16String cellName = data.GetCell().GetName(); | |
Object cellValue = data.GetParamValue(1); | |
if (data.GetFunctionName() == u"MySampleFunc") | |
{ | |
std::cout << funcName.ToString().ToUtf8() << " called successfully." << std::endl; | |
data.GetCell().PutValue(cellValue); | |
} | |
if (data.GetFunctionName() == u"YourSampleFunc") | |
{ | |
std::cout << funcName.ToString().ToUtf8() << " called successfully." << std::endl; | |
data.GetCell().PutValue(cellValue); | |
} | |
} | |
}; | |
//Create workbook | |
Workbook wb; | |
//Access first worksheet in the workbook | |
Worksheet ws = wb.GetWorksheets().Get(0); | |
//Adding custom formulas to Cell A1 and A2 | |
ws.GetCells().Get(u"A1").SetFormula(u"=MySampleFunc(\"MySampleFunc-Test\",1)"); | |
ws.GetCells().Get(u"A2").SetFormula(u"=YourSampleFunc(\"YourSampleFunc-Test\",2)"); | |
// Calcualting Formulas | |
CustomFunction1 custFunc; | |
CalculationOptions options; | |
options.SetCustomEngine(&custFunc); | |
wb.CalculateFormula(options); | |
//Print the value of cell A1 and A2 after the calculation of custom function implemented by us. | |
U16String valA1 = ws.GetCells().Get(u"A1").GetStringValue(); | |
U16String valA2 = ws.GetCells().Get(u"A2").GetStringValue(); | |
std::cout << "Value of A1 is : " << valA1.ToUtf8() << std::endl; | |
std::cout << "Value of A2 is : " << valA2.ToUtf8() << std::endl; | |
Aspose::Cells::Cleanup(); |
Konsol Çıktısı
MySampleFunc-Test called successfully.
YourSampleFunc-Test called successfully.
Value of A1 is : 1
Value of A2 is : 2
SoyutHesapMakinesi Özelliği Kullanımı - 2
Aşağıdaki örnek kod, özel bir fonksiyonun örnek bir dosyadan okunması ve Workbook.CalculateFormula(const CalculationOptions& options) metodunun çağrılarak SoyutHesapMakinesi .Calculate(CalculationData& data) metodunun çağrılmasını gösterir.
Örnek dosya:sample-file.xlsx
Örnek Kod
Aspose::Cells::Startup(); | |
//Implement AbstractCalculationEngine interface | |
class CustomFunction2 : public AbstractCalculationEngine | |
{ | |
public: | |
int stage = 0; | |
public: | |
void Calculate(CalculationData& data) | |
{ | |
if (stage == 0) | |
{ | |
data.SetCalculatedValue(0); | |
return; | |
} | |
U16String s = data.GetFunctionName(); | |
if (u"crow" == s) | |
{ | |
data.SetCalculatedValue(data.GetParamValue(0)); | |
} | |
else if (u"crow2" == s) | |
{ | |
data.SetCalculatedValue(data.GetCellRow() + 1); | |
} | |
} | |
}; | |
//Create workbook | |
Workbook wb(u"sample-file.xlsx"); | |
Cells cells = wb.GetWorksheets().Get(0).GetCells(); | |
Cells cells2 = wb.GetWorksheets().Get(1).GetCells(); | |
U16String expectedValue = u"2"; | |
if (expectedValue != cells.Get(u"B2").GetStringValue()) | |
{ | |
std::cout << "Start test: The value of cell B2 is not 2." << std::endl; | |
} | |
cells.Get(u"A2").PutValue(2); | |
cells.Get(u"A3").PutValue(3); | |
// Calcualting Formulas | |
CustomFunction2* resolver1 = new CustomFunction2(); | |
resolver1->stage = 0; | |
CalculationOptions opt1; | |
opt1.SetCustomEngine(resolver1); | |
wb.CalculateFormula(opt1); | |
cells2.InsertRows(1, 9, true); | |
Range range = cells2.CreateRange(1, 0, 9, cells2.GetMaxColumn() + 1); | |
Range source = cells2.CreateRange(0, 0, 1, cells2.GetMaxColumn() + 1); | |
PasteOptions options; | |
options.SetPasteType(PasteType::All); | |
range.Copy(source, options); | |
// Calcualting Formulas | |
CustomFunction2* resolver2 = new CustomFunction2(); | |
resolver2->stage = 1; | |
CalculationOptions opt2; | |
opt2.SetCustomEngine(resolver2); | |
wb.CalculateFormula(opt2); | |
if (expectedValue == cells.Get(u"B2").GetStringValue()) | |
{ | |
std::cout << "End test: The value of cell B2 is 2." << std::endl; | |
} | |
delete resolver1; | |
delete resolver2; | |
Aspose::Cells::Cleanup(); |