A megoldás ismét igen egyszerű, sőt szinte teljesen kézenfekvő: sztringként megadott képletek kiértékelésére használja fel alkalmazásunk a háttérben futtatva az Excel-t. Így a felhasználó észre sem veszi, hogy nem csak a mi programunk fut és az Excel-nek elég bonyolult szövegesen megadott képleteket átadhatunk, hogy értékelje ki azokat. Ennek leprogramozásával így nincs dolgunk. Megoldanunk csak azt kell, hogy elérjük az Excel-t és megkérjük a feladatunk elvégzésére.
Az egészhez készítsünk egy komponenst, így a jövőben igen egyszerűen felhasználhatóvá válik egy ilyen kiértékelés. A komponensünkben egyetlen függvényt hozunk létre, melynek paraméterként kell megadnunk a képletet, melynek meg kell tudni az eredményét. A függvény visszatérési értéke egy double típusú szám lesz, mely képlet eredménye.
Az Excel eléréséhez ne felejtsünk el egy referenciát hozzáadni a projektünkhöz az Excel-ről.
A függvényben létrehozunk egy kapcsolatot az Excel-el és mivel nem állítjuk a Visible property-jét igazra, így a felhasználó ebből semmit sem vesz észre.
public double Execute(string s)
{
Excel.Application ea = new Excel.Application();
Ezt követően létrehozunk egy új munkafüzetet és ennek egy celláját kitesszük egy Range objektumba, hogy a továbbiakban könnyebben elérhessük.
Excel.Workbook ew = ea.Workbooks.Add(m);
Excel.Range er = (Excel.Range)ea.Cells[1, 1];
Most ebbe a cellába írjuk a képletet, mely elé egy egyenlőségjelet illesztünk, hiszen az Excel csak ez esetben hajlandó azt képletként értelmezni és az eredményét kiszámolni.
Miután beírtuk a képletet máris kiolvashatjuk annak az eredményét.
double result = Convert.ToDouble(er.Value2);
Végül nem maradt más dolgunk, mint zárni a megnyitott munkafüzetet mentés nélkül, majd bezárni az Excel-t és visszaadni a kapott értéket.
ew.Close(false, m, m);
ea.Quit();
return result;
}
A komponens használatával már csak az Execute függvény hívása marad hátra ahhoz, hogy egy tetszőleges, de csak az Excel által elfogadott képletet megadjunk és kiszámoltassuk az eredményét.
private void button1_Click(object sender, System.EventArgs e)
{
label1.Text = functionComponent1.Execute(textBox1.Text).ToString();
}