Implementare un motore di calcolo personalizzato per estendere il motore di calcolo predefinito di Aspose.Cells
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
// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-.NET | |
// Create a new class derived from AbstractCalculationEngine | |
class CustomEngine : AbstractCalculationEngine | |
{ | |
// Override the Calculate method with custom logic | |
public override void Calculate(CalculationData data) | |
{ | |
// Check the forumla name and change the implementation | |
if (data.FunctionName.ToUpper() == "TODAY") | |
{ | |
// Assign the CalculationData.CalculatedValue: add one day offset for the date | |
data.CalculatedValue = CellsHelper.GetDoubleFromDateTime(DateTime.Today, false) + 1.0; | |
} | |
} | |
public override bool ProcessBuiltInFunctions { get { return true; } } | |
} | |
class ImplementCustomCalculationEngine | |
{ | |
public static void Run() | |
{ | |
// Create an instance of Workbook | |
Workbook workbook = new Workbook(); | |
// Access first Worksheet from the collection | |
Worksheet sheet = workbook.Worksheets[0]; | |
// Access Cell A1 and put a formula to sum values of B1 to B2 | |
Cell a1 = sheet.Cells["A1"]; | |
Style style = a1.GetStyle(); | |
style.Number = 14; | |
a1.SetStyle(style); | |
a1.Formula = "=TODAY()"; | |
// Calculate all formulas in the Workbook | |
workbook.CalculateFormula(); | |
// The result of A1 should be 20 as per default calculation engine | |
Console.WriteLine("The value of A1 with default calculation engine: " + a1.StringValue); | |
// Create an instance of CustomEngine | |
CustomEngine engine = new CustomEngine(); | |
// Create an instance of CalculationOptions | |
CalculationOptions opts = new CalculationOptions(); | |
// Assign the CalculationOptions.CustomEngine property to the instance of CustomEngine | |
opts.CustomEngine = engine; | |
// Recalculate all formulas in Workbook using the custom calculation engine | |
workbook.CalculateFormula(opts); | |
// The result of A1 will be 50 as per custom calculation engine | |
Console.WriteLine("The value of A1 with custom calculation engine: " + a1.StringValue); | |
Console.WriteLine("Press any key to continue..."); | |
Console.ReadKey(); | |
} | |
} |
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.