| |||
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 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:
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;


