Az Excel, az Outlook és a Word használata

Keresés
Hírlevél
 
ASPC#C++CSSDelphiFlashJavaJavaScriptPascalPerlPHPPythonuniPaaSVisual BasicVisual C++  »    
A sorozat további cikkei:
szerző: cett, idő: 2004.08.23., értékelés: 5 (20 szavazat)
  Kapcsolódó fórum Felvétel kedvencekhez Küldés emailben
A Microsoft Office programozását bemutató sorozatunk első részében az alapelvekkel és az Access elérésével ismerkedtünk meg. A mostani részben azt nézzük meg: miként tudjuk az Excel, az Outlook és a Word szolgáltatásait felhasználni Delphi-ben írt alkalmazásainkból.
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;