Delphi - Excel munkafüzet képleteinek kilistázása

forráskód letöltése
Készítünk egy komponenst, mely segítségével egy megadott Microsoft Excel munkafüzetben található képletekről listát készíthetünk. A komponens lehetőséget biztosít arra is, hogy a listába a képlet mellé az őt tartalmazó munkalap és cella koordinátái is bekerüljenek.
A mellékelt példaprogram megnyitása előtt a ListExcelFormulas.pas-ban levő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component – Install Component menüpontot.
A komponens WorkBook property-jében kell megadnunk a megnyitandó Excel munkafüzet elérési útját és nevét.
Ha a WorkSheet property-ben megadjuk egy munkalap nevét, akkor a keresés csak azon történik. Ha ennek a property-nek az értékét üresen hagyjuk, akkor a komponens a keresés során az összes munkalapot végignézi.
A keresést a GetFormulas függvény meghívásával hajthatjuk végre.
function GetFormulas(GetCoordinates: Boolean): TStringList;
Ha a GetCoordinates paraméter igaz, akkor a találati listába a munkalapok nevei, valamint a képleteket tartalmazó cellák koordinátái is bekerülnek. Hamis érték esetén csak a képlet jelenik meg a következő formában:
=A1+B2
A függvény TStringList típussal tér vissza. Az eredmény-objektum felszabadításáról nekünk kell gondoskodnunk.
A komponens elkészítése
A komponenst a TComponent osztályból származtatjuk.
Az Excel program, valamint objektumainak használatához szükségünk van a ComObj unit használatára.
A komponens működésének kulcsa a GetFormulas metódus.
function GetFormulas(GetCoordinates: Boolean): TStringList;
Az Excel programot a háttérben nyitjuk meg.
ExcelApp:=CreateOleObject('Excel.Application');
A WorkBooks kollekció Open metódusával nyithatunk meg egy már létező állományt.
ExcelApp.WorkBooks.Open(FileName:=FWorkBook,ReadOnly:=True);
A WorkSheet property értékének megfelelően kétféle feldolgozó algoritmusra van szükségünk. Ha a property értéke ’’, azaz üres String, akkor az összes munkalapot végig kell néznünk, ellenkező esetben pedig csak azt, amelyiket a property tartalmazza.
Az alábbiakban az első esetet ismertetjük.
Egy for ciklus segítségével végig kell mennünk a munkalapokon.
for k:=1 to ExcelApp.ActiveWorkBook.Sheets.Count do begin
  Range:=ExcelApp.ActiveWorkBook.Sheets.Item[k].UsedRange;
...
A UsedRange property-n keresztül egy olyan Range objektumot kapunk, amely az adott munkafüzetből csak a hasznos tartományt tartalmazza.
Két újabb, egymásba ágyazott for ciklusra van szükségünk, hogy a cellatartomány összes celláját meg tudjuk vizsgálni. A Range objektum Rows és Columns property-jeiből megtudhatjuk a sorok és oszlopok számát.
Azt, hogy az adott cella tartalmaz-e képletet, a HasFormula property értékéből tudhatjuk meg.
if Range.Columns.Cells[i,j].HasFormula then begin
Magát a képletet a FormulaLocal proeprty-ből olvashatjuk ki.
s:=Range.Columns.Cells[i,j].FormulaLocal;
A FormulaLocal property-n keresztül az Excel program nyelvének megfelelő függvényelnevezésekkel olvashatjuk ki. Amennyiben a függvények angol nyelvű megfelelőjére van szükségünk, a Formula property-t kell használnunk.
Ha a koordinátákat is el kell helyeznünk az eredménylistában, a következő utasításra van szükségünk.
Result.Add(ExcelApp.ActiveWorkBook.Sheets.Item[k].Name+' ['+
                      GetCoord(Range.Columns.Cells[i,j].Column,Range.Columns.Cells[i,j].Row)+'] : '+s)
A koordinátákat számok formájában kapjuk. Az oszlopok sokkal szebben mutatnak, ha azokat betűk formájában jelenítjük meg. Ehhez elkészítettük a GetCoord függvényt.
function GetCoord(Column, Row: Integer): String;
A függvény egy megadott oszlop és sor sorszámaiból a megszokott „A1” formátumú cellakoordinátát adja vissza.
Az Excel programot a Quit metódus meghívásával zárhatjuk be.
ExcelApp.Quit;