Adatbázis tábla exportja Microsoft Excel munkafüzetbe

A következőkben használjuk fel az Access táblában lévő rekordokat úgy, hogy létrehozunk egy Excel táblát, átmásoljuk bele a rekordokat (az egyszerűség kedvéért mezőnként), majd beállítjuk a munkafüzet celláinak néhány tulajdonságát, és elmentjük a munkafüzetet egy file-ba.

Az Excel-hez való csatlakozáshoz szükségünk lesz a létrehozott Excel Type Library-ra. Adjuk tehát hozzá a programunk uses listájához: "Excel_tlb". Valamint az OLE kapcsolathoz szükséges "ComObj" unit-ot is.

A következő változókra lesz szükségünk a kívánt export megvalósításához:

Név

Típus

Feladata

FExcel

OleVariant;

Ez lesz az Excel program létrehozott példányának változója.

FWorkbook

OleVariant;

A munkafüzet változója

FWorksheet

OleVariant;

A munkafüzetben lévő munkalap változója

I, J

Integer;

Ciklusváltozók

Első lépésként létrehozunk egy futó példányt az Excel programból, meghatározzunk, hogy látszódjon-e, és figyelünk az esetleges létrehozáskor felmerülő hibákra:

Screen.Cursor:=crHourGlass; try FExcel:=CreateOleObject('excel.application'); FExcel.Visible:=False; except on EOleSysError do begin   screen.cursor:=crDefault;   showmessage('Nincs Excel feltelepítve, vagy hiba a kapcsolódáskor!');   Exit; end; end;

Következő lépés, hogy létrehozunk egy új munkafüzetet, valamint egy munkalapot:

FWorkBook:=FExcel.WorkBooks.Add; FWorkSheet:=FWorkBook.WorkSheets.Add;

Mielőtt hozzákezdenénk az adatok exportálásához a munkalapra, érdemes pár dolgot átismételni:

  • Az Excel-ben a cellák oszlop és sorazonosítókkal rendelkeznek.
  • Az oszlopokat betűk ("A"-val kezdődően, a sorokat számok jelölik (1-el kezdődően).
  • Az Excel használata (és majd, mint azt később látjuk a Word használata során is) nagyjából ugyanazokkal a konstansokkal és metódusokkal találkozhatunk, mint amit az Excelben felhasználható VBA programok írásánál is elérhetünk.

    A munkalapunk legelső sorába illesszük be a DBGrid1 oszlopainak nevét, valamint állítsuk kicsit szélesebbre az oszlopokat:

    for i:=0 to form1.ADOTable1.FieldCount-1 do begin fworksheet.range[chr(i+65)+'1'].value:=form1.DBGrid1.Columns.Items[i].FieldName; fworksheet.range[chr(i+65)+'1'].ColumnWidth:=20; end;

    Itt a cellák azonosításánál azért szükséges a chr(i+65) használata, mivel az ASCII kódtáblában az "A" betűhöz a 65-ös érték tartozik.

    Ezek után minden egyes rekord minden mezőjét adjunk át a munkalap megfelelő sorába. Az első rekord a második sorba fog kerülni. Az Excel cellái között a Range osztály segítségével navigálhatunk:

    i:=0; form1.ADOTable1.First; while not form1.ADOTable1.Eof do begin for j:=0 to form1.ADOTable1.FieldCount-1 do fworksheet.range[chr(j+65)+inttostr(i+2)].value:=form1.ADOTable1.Fields[j].Value; inc(i); form1.ADOTable1.Next; end;

    Itt az I változót használjuk a rekord sorszámának azonosítására (mivel a cella sorának meghatározásához szükséges tudnunk, hanyadik rekordot másoljuk be éppen, valamint a J változóval mozgunk az aktuális rekord mezői között.

    Jogosan merülhet fel a kérdés az Olvasóban, hogy nem lassú-e túlságosan a rekordok mezőnkénti átmásolása, nem lehetséges-e ennek gyorsítása? Dehogynem. Egy lehetséges megoldás lehet az, amikor az Excel-hez nem mint létrehozott OLE objektumhoz, hanem mint ADO adatforrásként csatlakozunk, akkor ugyanúgy kezelhetjük az adott file munkalapjait, mint egy ADO-val elért adatbázis tábláit. Ezáltal nagyságrendekkel gyorsabb adatmozgatást érhetünk el. Fontos azonban megemlíteni, hogy amennyiben ADO segítségével létesítünk kapcsolatot egy Excel file-al, úgy elveszítjük a cellák formázásának lehetőségét, hiszen az ADO technika nem nyújt lehetőséget OLE metódusok alkalmazására, valamint az objektum konstansainak elérésére. Ezért tehát célszerű a következőképpen eljárni:

  • Amennyiben csak kis mennyiségű adat mozgatásáról van szó maradjunk az itt is alkalmazott OLE mellett.
  • Ha viszont nagyobb mennyiségű adatot kell Excel-be másolni, célszerű először létrehozni a file-t, majd egy TADOConnection és egy TADOTable komponens segítségével kapcsolódni hozzá, feltölteni az ADOTable-t (s ezáltal az Excel file munkalapját), elmenteni a file-t, megszüntetni az ADO kapcsolatot, végül OLE-val megnyitni, és a szükséges formázásokat elvégezni. Így sok adat mozgatásánál jelentős sebességnövekedést érhetünk el.
  • A példánk további részében áttekintünk néhány alapvető formázási lehetőséget az Excel-ben. Az első sort vastag betűvel írjuk, kiszínezzük, valamint középre igazítjuk. (A színezésnél, valamint a középre igazításnál jön jól igazán a Type Library, hiszen a unit-ban megtaláljuk az összes használható konstanst. Természetesen a VBA help-jét is felhasználhatjuk erre a célra.)

    fworksheet.range['A1:'+chr(form1.ADOTable1.FieldCount-1+65)+'1'].font.bold:=true; fworksheet.Range['A1:'+chr(form1.ADOTable1.FieldCount-1+65)+'1'].Interior.color:=clMaroon; fworksheet.Range['A1:'+chr(form1.ADOTable1.FieldCount-1+65)+'1'].font.color:=clwhite; fworksheet.Range['A1:'+chr(form1.ADOTable1.FieldCount-1+65)+'1'].HorizontalAlignment:=xlCenter;

    A formázások részeként keretezzük be a munkalap azon terültét, ahol a rekordjaink vannak. Keretezésnél használhatjuk az XlBorderWeight(xlHairline, xlMedium, xlThick, xlThin) konstansokat a keret vonalvastagságának megadására, valamint az XlLineStyle(xlContinuous, xlDash, xlDashDot, xlDashDotDot, xlDot, xlDouble, xlSlantDashDot, xlLineStyleNone) konstansokat a keret típusának megadásához. A keretezéshez a Range osztály BorderAround metódusát fogjuk használni, amely paraméterezése:

    function BorderAround(LineStyle: OleOleVariant; Weight: XlBorderWeight; ColorIndex: XlColorIndex; Color: OleOleVariant);

    Maga a keretezés pedig a következő képpen néz ki:

    fworksheet.Range['a1:'+chr(form1.ADOTable1.FieldCount-1+65)+inttostr(form1.ADOTable1.RecordCount+1)].BorderAround(xlContinuous,xlMedium,1,1);

    Egy Excel táblában azonban nem csak értékeket, de képleteket is elhelyezhetünk, ekkor azonban nem a Value property-t használjuk, hanem a FormulaArray-t. A FormulaArray értékének ugyanazt a képletet kell megadnunk, mint amit Excel-ben is írnánk a cellába:

    fworksheet.Range[chr(Form1.ADOTable1.FieldCount-1+65)+inttostr(Form1.ADOTable1.RecordCount+2)].FormulaArray:='=SZUM('+chr(Form1.ADOTable1.FieldCount-1+65)+'1:'+chr(Form1.ADOTable1.FieldCount-1+65)+inttostr(Form1.ADOTable1.RecordCount+1)+')';

    Ezek után már csak ki el kell menteni a file-t, valamint ki kell lépni az Excelből.

    FWorkbook.SaveAs(PChar(ExtractFilePath(ParamStr(0)))+datetostr(now)+'.xls'); FExcel.Quit; FExcel:=unassigned; screen.cursor:=crDefault;
    HTML levél létrehozása az adatokból Microsoft Outlook-ban

    Ebben a fejezetben létrehozunk egy HTML levelet a Microsoft Outlook-ban, amiben egy formázott táblázatban feltűntetjük az ADOTable1 rekordjait, és mellékletként csatoljuk az előbb elkészített Excel táblázatot.

    Első lépésként a létrehozott Outlook Type Library-nkat kell hozzáadni a uses listához: "Outlook_tlb".

    Az Outlook használatához a következő változókra lesz szükségünk:

    Név

    Típus

    Feladata

    FOutlook

    OleVariant;

    Ez lesz az Outlook program létrehozott példányának változója.

    Mail

    OleVariant;

    A létrehozandó levél változója.

    Sorok

    TMemo

    A html levél sorait fogja tartalmazni.

    Az Outlook kapcsolatot az Excel-nél ismertetettek alapján hozzuk létre:

    screen.Cursor:=crhourglass; try foutlook:=createoleobject('outlook.application'); except on EOleSysError do begin   screen.cursor:=crDefault;   showmessage('Hiba: Nincs Microsoft Outlook feltelepítve, vagy egyéb hiba a kapcsolódás során!');   Exit; end; end;

    Létrehozzuk a levelünket, és megadjuk a tárgyát:

    mail:=foutlook.CreateItem(0); mail.subject:='Példa levél az Outlook programozására Delphi-ből.';

    Létrehozzuk a Sorok TMemo-t, amiben a levél sorait fogjuk megadni, és feltöltjük. Itt, mivel HTML típusú levelet szeretnénk létrehozni, használhatjuk a szokásos HTML formázó TAG-eket, példánkban CSS formázással fogjuk megadni a stílusokat:

    sorok:=tmemo.Create(form1); sorok.Parent:=form1; sorok.Visible:=false; sorok.lines.Add('<html>'); sorok.lines.Add('<head>'); sorok.lines.Add('<meta http-equiv="content-type" content="text/html; charset=windows-1250">'); sorok.lines.Add('<meta name="generator" content="Jónás Gergő">'); sorok.lines.Add('<Style type="text/css">'); sorok.lines.Add('  BODY { background:#FFFFFF; color: #000000;'); sorok.lines.Add('  }'); sorok.lines.Add('  .ThRows { background-color: #CEC6B5; color: #000000;'); sorok.lines.Add('            font-weight:bold; text-align:center;'); sorok.lines.Add('            font-family:Tahoma; font-size: 12'); sorok.lines.Add('  }'); sorok.lines.Add('  .TrRows { background-color: #DEE7DE; color: #000000;'); sorok.lines.Add('            font-family:Tahoma; font-size: 12'); sorok.lines.Add('  }'); sorok.lines.Add('  .TrOdd  { background-color: #FFFBF0; color: #000000;'); sorok.lines.Add('            font-family:Tahoma; font-size: 12'); sorok.lines.Add('  }'); sorok.lines.Add('</Style>'); sorok.lines.Add('</head>'); sorok.lines.Add('<body>');

    A levelünkben táblázat formájában szeretnénk megjeleníteni az adatainkat, ehhez először megadjuk a táblázat fejlécét:

    sorok.lines.Add('<P><center class="ThRows">Az Access tábla tartalma</center><P>'); sorok.lines.Add('<TABLE cellSpacing=1 cellPadding=1 border=0 style='+CHR(27)+'border-collapse: collapse'+CHR(27)+'>'); sorok.lines.Add('<tr><td align=center class=" ThRows"><b>AlkalmazottID</b></ td>'+                 '<td align=center class="ThRows"><b >Vezetéknév</b></td>'+                 '<td align=center class="ThRows"><b>Keresztnév</b></td>'+                 '<td align=center class="ThRows"><b>Beosztás</b></td>'+                 '<td align=center class="ThRows"><b>Email</b></td>'+                 '<td align=center class="ThRows"><b>Mellék</b></td>'+                 '<td align=center class="ThRows"><b>SzületésiDátum</b></ td>'+                 '<td align=center class="ThRows"><b>BelépésDátuma</b></ td>'+                 '<td align=center class="ThRows"><b>Fizetés</b></td></tr>');

    Majd végiglépkedünk az ADOTable1 rekordjain, és a mezőit a táblázat megfelelő oszlopába illesztjük. Díszítés képen a táblázat páros és páratlan sorai változó színűek:

    form1.ADOTable1.First; while not form1.ADOTable1.Eof do begin if form1.ADOTable1.RecNo mod 2 <> 0 then   sorok.lines.Add('<tr><td align=left class="TrOdd">'+form1.ADOTable1AlkalmazottID.AsString+                   '</td><td align=left class="TrOdd">'+form1.ADOTable1Vezetknv.Value+                   '</td><td align=left class="TrOdd">'+form1.ADOTable1Keresztnv.Value+                   '</td><td align=left class="TrOdd">'+form1.ADOTable1Beoszts.Value+                   '</td><td align=left class="TrOdd">'+form1.ADOTable1Email.Value+                   '</td><td align=left class="TrOdd">'+form1.ADOTable1Mellk.Value+                   '</td><td align=left class="TrOdd">'+form1.ADOTable1SzletsiDtum.AsString+                   '</td><td align=left class="TrOdd">'+form1.ADOTable1BelpsDtuma.AsString+                   '</td><td align=left class="TrOdd">'+form1.ADOTable1Fizets.AsString+'</td></tr>') else   sorok.lines.Add('<tr><td align=left class="TrRows">'+form1.ADOTable1AlkalmazottID.AsString+                   '</td><td align=left class="TrRows">'+form1.ADOTable1Vezetknv.Value+                   '</td><td align=left class="TrRows">'+form1.ADOTable1Keresztnv.Value+                   '</td><td align=left class="TrRows">'+form1.ADOTable1Beoszts.Value+                   '</td><td align=left class="TrRows">'+form1.ADOTable1Email.Value+                   '</td><td align=left class="TrRows">'+form1.ADOTable1Mellk.Value+                   '</td><td align=left class="TrRows">'+form1.ADOTable1SzletsiDtum.AsString+                   '</td><td align=left class="TrRows">'+form1.ADOTable1BelpsDtuma.AsString+                   '</td><td align=left class="TrRows">'+form1.ADOTable1Fizets.AsString+'</td></tr>');   form1.ADOTable1.Next; end;

    Ennél a lépésnél figyelnünk kell arra, hogy az egyes mezőket a megfelelő típuskonverzióval (AsString) lássuk el!

    Lezárjuk a táblázatunkat és a HTML file-t is, és a levél szövegének megadjuk az így létrehozott szöveget:

    sorok.lines.Add('</table>'); sorok.lines.Add('<hr>'); sorok.lines.Add('<P><font face="Tahoma" size=2><B>Tételek száma: </b>'+inttostr(form1.ADOTable1.RecordCount)+'<P>'); sorok.lines.Add('<hr>'); sorok.lines.Add('</body>'); sorok.lines.Add('</html>'); mail.htmlbody:=sorok.Text;

    Felszabadítjuk a Sorok által lefoglalt memóriaterületet, és a levél többi tulajdonságát is beállítjuk (címzett, másolat címzettje, titkos másolat címzettje, és végül, hogy a levél olvasásáról visszaigazolást kérünk):

    sorok.Free; mail.attachments.add(PChar(ExtractFilePath(ParamStr(0)))+datetostr(now)+'.xls'); mail.to:='cimzett@mail-cime.hu'; mail.bcc:='titkos-másolatot@kap.hu'; mail.cc:='másolatot@kap.hu'; mail.ReadReceiptRequested:=true; mail.display; screen.cursor:=crDefault;

    Itt a mail.display helyett használhatjuk a mail.send-et is, azonban érdemes pár dologra odafigyelni:

  • Előfordulhat, hogy a levél bizonyos tulajdonságainak beállításához érdemes megjelentetni a levelet küldés előtt (mail.display), mivel pl. előfordulhat, hogy a levél címzettjét szeretné a felhasználó kiegészíteni, módosítani.
  • Másrészt etikailag is "megkérdőjelezhető" a felhasználó nevében automatikusan, beavatkozás nélkül küldött levél.
  • Célszerű tehát a levelet elküldése (mail.send) helyett a legtöbb esetben csak megjeleníteni, s a felhasználóra bízni a levél tényleges elküldését.

    A megjelenő levél az Outlook-banA megjelenő levél az Outlook-ban
    Dokumentum létrehozása Microsoft Word-ben

    A következőkben megnézzük, hogy lehet csatlakozni a Microsoft Word alkalmazáshoz, valamint néhány alapvető szövegformázási lehetőséget. (A Word mélyebb elemzése már kitenne pár könyvet, így arra itt kísérletet sem teszek.)

    A Word használatához a következő változókra lesz szükségünk:

    Név

    Típus

    Feladata

    FWord

    OleVariant;

    Ez lesz a Word program létrehozott példányának változója.

    Pages

    OleVariant;

    A létrehozandó dokumentum oldalbeállításait érjük majd el segítségével.

    Szekcio

    OleVariant;

    A létrehozandó dokumentum szakaszait érhetem el általa.

    Tablazat

    OleVariant;

    A létrehozandó táblázat változója.

    I

    Integer;

    Ciklusváltozó.

    A már megszokott módon hozzuk létre a Word egy futó példányát, majd hozzáadunk egy új dokumentumot:

    Screen.Cursor:=crHourGlass; try Fword:=CreateOleObject('word.application'); Fword.Visible:=False; except on EOleSysError do begin   screen.cursor:=crDefault;   showmessage('Nincs Word feltelepítve, vagy hiba a kapcsolódáskor!');   Exit; end; end; fword.documents.add;

    A létrehozott dokumentum papírméretét állítsuk be A4-es méretűre, valamint a tájolását fekvőre. A tájolást a Pages osztály Orientation property-én keresztül érhetjük el WdOrientation(wdOrientPortrait, wdOrientLandscape):

    pages:=fword.activedocument.pagesetup; pages.PaperSize:=wdPaperA4; pages.orientation:=wdOrientLandscape; Fword.ActiveDocument.PageSetup:=pages;

    Amennyiben hosszabb dokumentumot hozunk létre szükséges lehet az oldalszámozás elhelyezése is, a dokumentumban való könnyebb eligazodás miatt. Ehhez azonban meg kell határoznunk, hogy melyik szakaszhoz kívánunk oldalszámozást létrehozni. Az egyes szakaszokat a Sections osztályon keresztül érhetjük el, vagy megadva a kitűntetett szakaszok nevét (First, Last), vagy pedig a sorszámát (Item(2)). Az oldalszámot lehetséges a fejlécben is, és a láblécben is elhelyezni Section.Headers, és Section.Footers:

    szekcio:=fword.activedocument.sections.first; szekcio.footers.item(wdHeaderFooterPrimary).PageNumbers.Add(wdAlignPageNumberRight,True);

    Az oldalszám megadásánál az első paraméter adja meg az elhelyezendő oldalszám igazítását PageNumberAlignment(wdAlignPageNumberLeft, wdAlignPageNumberCenter, wdAlignPageNumberRight, wdAlignPageNumberInside, wdAlignPageNumberOutside), míg a második paraméter logikai típusú és a szakasz első oldalán megjelenő oldalszámozást lehet vele szabályozni.

    A szöveg beírását és a megfelelő formázását a Selection osztályon keresztül végezhetjük el, míg a bekezdés tulajdonságait a Paragraph osztályon keresztül állíthatjuk be. Szöveg beírásához pedig használjuk a Selection osztály TypeText tagfüggvényét:

    fword.selection.font.name:='Tahoma'; fword.selection.font.size:=18; fword.selection.paragraphs.alignment:=wdAlignParagraphCenter; fword.selection.typetext('Példa a Word felhasználására Delphi programból');

    A wdAlignParagraphCenter konstanst a Type Library unit-ban deklaráltuk, s mint minden konstanst megtalálhatjuk a megfelelő Type Library-ban. Ezért érdemes átböngészni a unit-okat, mivel sok érdekes dologra lelhetünk benne. A bekezdés igazítását pl. a következő konstansok felhasználásával szabályozhatjuk: WdParagraphAlignment(wdAlignParagraphLeft, wdAlignParagraphCenter, wdAlignParagraphRight, wdAlignParagraphJustify, wdAlignParagraphDistribute, wdAlignParagraphJustifyMed, wdAlignParagraphJustifyHi, wdAlignParagraphJustifyLow, wdAlignParagraphThaiJustify).

    Új bekezdés létrehozásához a selection osztály typeparagraph metódusát használhatjuk.

    fword.selection.font.size:=12; fword.selection.paragraphs.alignment:=wdAlignParagraphJustify; fword.selection.typetext('A cikknek ebben a részében létrehozunk egy Word dokumentumot, és pár alapvető formázási paramétert ismertetünk.'); fword.selection.typeparagraph; fword.selection.typetext('Például helyezzük el ebben a dokumentumban a program Memo1 objektumában folyamatosan írt szöveget.'); fword.selection.typeparagraph; fword.selection.typeparagraph;

    A program futása során a Memo1-be írt sorokat átmásoljuk a létrehozott Word dokumentumunkba, piros színnel, és kétszeres sorközzel. A bekezdést sorközének beállításához felhasználhatjuk a Paragraph osztály Space1, Space15 és Space2 metódusát, valamint beállítjuk a bekezdés előtti és utáni térköz nagyságát:

    fword.selection.font.color:=clred; fword.selection.paragraphs.alignment:=wdAlignParagraphLeft; fword.selection.paragraphs.space2; fword.selection.paragraphs.spacebefore:=12; fword.selection.paragraphs.spaceafter:=12; for i:=0 to form1.Memo1.Lines.Count-1 do begin fword.selection.typetext(form1.Memo1.Lines.Strings[i]); fword.selection.typeparagraph; end;

    Nézzünk meg a továbbiakban pár gyakran előforduló karakterformázási lehetőséget. A Font osztályon keresztül szabályozhatjuk a megjelenő szöveg betűtípusának számos tulajdonságát:

    fword.selection.font.color:=clblack; fword.selection.typetext('A következőkben példákat láthatunk alapvető font beállításokra. '); fword.selection.font.bold:=true; fword.selection.typetext('Vastagított szöveg. '); fword.selection.font.bold:=false; fword.selection.font.italic:=true; fword.selection.typetext('Dőlt szöveg. '); fword.selection.font.italic:=false; fword.selection.font.underline:=true; fword.selection.typetext('Aláhúzott szöveg. '); fword.selection.font.underline:=false; fword.selection.font.superscript:=true; fword.selection.typetext('Felső index. '); fword.selection.font.superscript:=false; fword.selection.font.subscript:=true; fword.selection.typetext('Alsó index. '); fword.selection.font.subscript:=false;

    A következő lépésben az Access táblázatunk adatait helyezzük el a Word-ben egy táblázatban. Ehhez az ActiveDocument.Tables.Add() függvényt kell meghívnunk. Első paraméterként egy Range objektumot kell átadnunk, majd a sor és oszlopszámot. Itt értelemszerűen a sorok száma egyel több, mint a táblában lévő rekordok száma, míg az oszlopok száma megegyezik a tábla mezőinek számával. Ezek után a táblázat első sorába átmásoljuk a tábla mezőinek nevét, majd vastagítjuk, és végül középre igazítjuk. (Lehetséges paraméterek: wdHorizontalLineAlignLeft,wdHorizontalLineAlignCenter, wdHorizontalLineAlignRight):

    tablazat:=fword.ActiveDocument.Tables.Add(fword.selection.Range,form1.ADOTable1.RecordCount+1,form1.ADOTable1.FieldCount-1); for i:=0 to form1.ADOTable1.FieldCount-1 do begin tablazat.cell(1,i).range.text:=form1.ADOTable1.Fields[i].FieldName; tablazat.cell(1,i).range.font.bold:=true; tablazat.cell(1,i).range.Paragraphs.Alignment:=wdHorizontalLineAlignCenter; end;

    Miután a táblázat első sorát a megfelelőképpen kialakítottuk, itt az ideje a tábla adatainak átmásolására. Ehhez a táblázat Cell osztályát hívjuk segítségül:

    form1.ADOTable1.First; while not form1.ADOTable1.Eof do begin for i:=0 to form1.ADOTable1.FieldCount-1 do   tablazat.cell(form1.ADOTable1.RecNo+1,i).range.text:=form1.ADOTable1.Fields[i].AsString; form1.ADOTable1.Next; end;

    Végezetül elmentjük a Word dokumentumot, kinyomtatjuk az alapértelmezett nyomtatóra, és kilépünk a Word-ből:

    fword.activedocument.saveas(PChar(ExtractFilePath(ParamStr(0)))+datetostr(now)+'.doc'); fword.activedocument.printout; fword.quit;
    Összefoglalás

    Két részes sorozatunkból megismerhettünk egy adatelérési technikát (ADO), egy a különböző programok eléréséhez alkalmazható megoldást (Type Library-n keresztül OLE Automatizmussal), valamint néhány alapvető Excel, Outlook, és Word műveletet. Remélem, hogy sikerült az Olvasó érdeklődését felkelteni az Office programcsalád programozása iránt, és azok is eredményesen tudják alkalmazni az itt leírtakat, akiket összetettségük miatt eddig elriasztott az Office programok felhasználásának gondolata. Minden kedves Olvasónak ajánlom a létrehozott Type Libray-k böngészését, sok érdekes dolgot lehet rajtuk keresztül felfedezni a programokban, segítségükkel jobban megismerhetjük a programok működését, felépítését, és felhasználásának lehetőségeit Borland Delphi-ből.

    A sorozatban közölt technikák hasznosítását a gyakorlatban is bemutató példa-program forráskódját innen, míg lefordított változatát innen tölthetik le az érdeklődők.