Delphi - Alapvető műveletek az Excel-ben

Office 8. rész

forráskód letöltése
A cikksorozat eddigi részeiben a Word programozásával ismerkedhettünk meg. Most rátérünk az Excel alkalmazás programozására, amely során a legalapvetőbb műveletek elvégzése lesz a célunk, természetesen Delphi-s szemszögből nézve. Ilyen művelet az új dokumentum létrehozása, meglévő megnyitása, mentése és természetesen az adatok írása az Excel táblába Delphi-ből. Ahhoz, hogy az Excel alkalmazáshoz csatlakozni tudjunk, készíteni kell egy Type Library unit-ot, ugyanúgy, mint ahogyan azt a Word-nél is tettük. Ha ez megvan, akkor már hozzá is kezdhetünk az Excel idomításához!

Első feladatunk lesz, hogy csatlakozzunk az Excel-hez. Ez hasonlóan történik, mint a Word esetében, tehát a kód a következő:
var
  ExcelApp:OleVariant;

procedure TForm1.Connect;
begin
  ExcelApp:=CreateOleObject('Excel.Application');
  ExcelApp.Visible:=True;
end;
Ebben semmi újdonság nincs, ezért részletesebben nem is foglalkozunk vele. A kapcsolat megszakítása szintén ugyanúgy történik, mint a Word esetében, itt is zárjuk az aktív dokumentumot mentés nélkül, majd zárjuk az Excel-t is.
procedure TForm1.Disconnect;
begin
  ExcelApp.ActiveWoorkBook.Close(false);
  ExcelApp.Quit;
end;
Ha sikerült az Excel-hez kapcsolódni, akkor hozzunk létre egy új dokumentumot. Mint az alábbi kódban is látható, létrehoztunk egy MyWorkbook nevű változót annak érdekében, hogy a saját dokumentumunkat könnyedén el tudjuk érni:
var
  MyWorkbook:OleVariant;
…
MyWorkbook:=ExcelApp.Workbooks.Add;
A dokumentum (vagy más néven munkafüzet) létrehozáshoz a Workbooks osztály Add függvényét használtuk. Ennek egyetlen paramétere lehet:
Template: XlWBATemplate típusú paraméter, melynek a következő értékei lehetnek: xlWBATChart, xlWBATExcel4IntlMacroSheet, xlWBATExcel4MacroSheet, és xlWBATWorksheet. Ha EmptyParam-ot adunk meg, akkor kapunk egy üres munkafüzetet, 3 lappal.


Ha nem üres munkafüzetet akarunk létrehozni, hanem egy már meglévőt megnyitni, akkor a Workbooks osztály Open függvényét alkalmazhatjuk erre a célra. Ez a függvény az Excel-ben sem hazudtolja meg önmagát, itt is rengeteg paraméterrel rendelkezik!
MyWorkbook:=ExcelApp.Workbooks.Open(FileName, UpdateLinks, ReadOnly, Format, Password,
    WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMRU);
  • FileName: a megnyitandó fájl neve.
  • UpdateLinks: 0 érték esetén nem, 1 esetén csak a külső, de nem távoli, 2 esetén csak a távoli és 3 esetén az összes hivatkozást frissíti.
  • ReadOnly: csak olvasható módban nyitja meg a fájlt.
  • Format: ha szövegfájlt adunk meg, akkor ez a paraméter határozza meg az egyes mezők közötti elválasztó jelet: 1=tabulátor karakter, 2=vessző, 3=szóköz, 4=pontosvessző, 5=semmi és 6=a delimiter paraméterben megadott karakter.
  • Password: a megnyitáshoz szükséges jelszó
  • WriteResPassword: írásvédelemhez használt jelszó.
  • IgnoreReadOnlyRecommended: True esetén figyelmezteti a felhasználót, hogy csak olvasható módban nyissa meg a dokumentumot.
  • Origin: ha szövegfájlt nyitunk meg, akkor szükséges ezt a paramétert megadni. A paraméter azt határozza meg, hogy a szövegfájl melyik platformról származik, mivel a sorvége karakterek különbözhetnek egymástól. Lehetséges értékei: xlMacintosh, xlWindows, és xlMSDOS.
  • Delimiter: a mezőket elválasztó karakter.
  • Editable: ha a megnyitandó fájl egy add-in modul, akkor annak megjelenési formáját határozza meg. Csak Excel 5.0-nál régebbi verziójú Excel-eknél használatos.
  • Notify: ha a fájlt nem sikerült olvasás/írás módban megnyitni, akkor True esetén megpróbálja megnyitni csak olvasható módban.
  • Converter: az elsődleges használandó fájl konverter indexe.
  • AddToMRU: True esetén hozzáadja a fájl nevét az utoljára megnyitott fájlok listájához a Fájl menüben.
Miután dolgoztunk a munkafüzettel azt rendszerint el is szeretnénk menteni. Ehhez a WorkBooks osztály Save vagy SaveAs függvényét használhatjuk.
MyWorkbook.Save;

MyWorkbook.SaveAs(Filename, FileFormat, Password, WriteResPassword, ReadOnlyRecommended,
    CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodePage, TextVisualLayout);
  • FileName: fájlnév.
  • FileFormat: XlFileFormat típusú konstans érték, amely a fájl formátumát határozza meg. Ha nem adjuk meg, akkor az alapértelmezett formátumban, ill. megnyitott állomány esetén az eredeti formátumban menti el az Excel. xlAddIn, xlCSV, xlCSVMac, xlCSVMSDOS, xlCSVWindows, xlCurrentPlatformText, xlDBF2, xlDBF3, xlDBF4, xlDIF, xlExcel2, xlExcel2FarEast, xlExcel3, xlExcel4, xlExcel4Workbook, xlExcel5, xlExcel7, xlExcel9795, xlHTML, xlIntlAddIn, xlIntlMacro,xlSYLK, xlTemplate, xlTextMac, xlTextMSDOS, xlTextPrinter, xlTextWindows, xlUnicodeText, xlWJ2WD1, xlWK1, xlWK1ALL, xlWK1FMT, xlWK3, xlWK4, xlWK3FM3, xlWKS, xlWorkbookNormal, xlWorks2FarEast, xlWQ1, xlWJ3, xlWJ3FJ3.
  • Password: a fájl megnyitásához szükséges jelszó.
  • WriteResPassword: az írásvédelem feloldásához szükséges jelszó
  • ReadOnlyRecommended: True esetén megnyitáskor figyelmezteti a felhasználót, hogy csak olvasható módban nyissa meg a fájlt.
  • CreateBackup: biztonsági másolat készül az utoljára mentett változatról.
  • AccessMode: a hozzáférés módját határozza meg. XlSaveAsAccessMode típusú konstans érték: xlShared (megosztott), xlExclusive (kizárólagos), vagy xlNoChange (nem változtatjuk meg az eredeti beállítást).
  • ConflictResolution:
  • AddToMru: True esetén hozzáadja a fájl nevét az utoljára megnyitott fájlok listájához a Fájl menüben.
  • TextCodePage: nem használt.
  • TextVisualLayout: nem használt.
Az elkészült táblázatot és grafikont általában ki is szoktuk nyomtatni, ezt szintén megtehetjük programból is. Ha közvetlenül a nyomtatóra akarjuk küldeni a dokumentumot, akkor a Workbooks osztály PrintOut metódusát, ha csak egy nyomtatási képet szeretnénk megjeleníteni, és a többit a felhasználóra bízzuk, akkor a PrintPreview metódust alkalmazzuk.
MyWorkbook.PrintOut(From, To, Copies, Preview, ActivePrinter, PrintToFile, Collate, PrToFileName)
  • From: a kezdő oldal sorszáma.
  • To: az utolsó oldal sorszáma.
  • Copies: a másolatok száma.
  • Preview: true esetén a nyomtatás előtt megjeleníti a nyomtatási képet.
  • ActivePrinter: a nyomtató nevének megadására szolgál.
  • PrintToFile: true esetén fájlba nyomtat.
  • Collate: True esetén leválogatja a másolatokat (ha a Copies>1 !).
  • PrToFileName: fájlba nyomtatás esetén a fájl neve.

A nyomtatási kép megjelenítése ennél lényegesen egyszerűbb:
MyWorkbook.PrintPreview(EnableChanges);
EnableChanges: true esetén engedélyezzük a változtatásokat a nyomtatási képen.


Most nézzük, hogy hogyan írhatunk szöveget a cellákba. Ehhez vegyünk egy konkrét példát, amit a mellékelt példaprogramban is alkalmaztunk. A kód egy 10x10-es szorzótáblát készít:
procedure TForm1.SpeedButton6Click(Sender: TObject);
var x, y:integer;
    row, col:string;
begin
A biztonság kedvéért aktivizáljuk a munkafüzetünket:
  MyWorkbook.Activate;
Indítunk egy ciklust X=1-től 10-ig:
  for x:=1 to 10 do begin
A col változóban az aktuális oszlop azonosítóját tároljuk, ami az Excel-ben egy vagy két betű. Jelen esetben csak egy, mivel a táblázat legelején vagyunk.
    col:=chr(65+x);
A táblázat első sorának és oszlopának megfelelő celláiba beírjuk X változó aktuális értékét.
    ExcelApp.Range[col+'1', col+'1'].Value:=x;
    ExcelApp.Range['A'+inttostr(x+1), 'A'+inttostr(x+1)].Value:=x;
Indítunk egy belső ciklust, ami Y=X-től 10-ig tart. Azzal, hogy kezdőértéknek az X-et adtuk meg azt érjük el, hogy minden szám-pár csak egyszer szerepel a táblázatban. Ez így elmondva bonyolultan hangzik, de nézzük meg a példaprogramot!
    for y:=x to 10 do begin
A row változóban az aktuális sor azonosítóját tároljuk, ami egy szám sztringgé konvertálva.
      row:=inttostr(y+1);
Most jön az a rész, amikor a szám-párokat összeszorozzuk (X*Y), és az eredményt beírjuk a megfelelő cellába.
      ExcelApp.Range[col+row,col+row].Value:=x*y;
    end;
  end;
end;
Ez egy egyszerű szorzótábla, cellaformázás nélkül. Nyilván az Excel-ben manuálisan ezt nem így oldottuk volna meg, hanem az eredmény cellákba a számítási formulát adtuk volna meg. Ami viszont jól látszik a példából, az a Range osztály használata. Ezzel később is sokszor találkozunk!

Mai utolsó feladatunkként nézzük meg, hogy hogyan tudunk a táblázatban mozogni. Ehhez is a Range osztályt használjuk, mint a későbbiekben oly sok más, hasznos dologra. A Range osztály nagyon sok osztályban megtalálható, mi most közvetlenül az ExcelApp objektumban használjuk:
ExcelApp.Range['A1','F10'].Select;
Ezzel a sorral azt érjük el, hogy az A1-F10 mezők közötti területet ki lesz jelölve. Az aktív cellát (ami általában a kijelölt cellák közül a bal-felső) az ActiveCell property-vel kaphatjuk meg.
ExcelApp.ActiveCell.Font.Name:='Arial';

Office cikksorozat