Az excel adatok gyors feldolgozása delphi-ban
Tizennyolc hónappal felajánlották egy csomó lehetőséget, hogyan felgyorsítani leolvassuk az adatokat egy Excel munkalap - használata MSXML könyvtárak és más kész magát eljárások és függvények. Nos, minden probléma többféleképpen megoldható. Tekintsünk néhány lehetőséget, és állapítsuk meg, hogy melyik opció közül melyik lesz a leggyorsabb. Nos, melyik lehetőség lesz kényelmesebb - máris mindenki magára dönt.
Az adatok olvasása Excel-ből
Először is, úgy azt a lehetőséget, olvasás adatokat, hogy a bűn, akik csak most kezdik ezek ismerete Excel Delphi - olvasási adatokat az egyes sejtek egyedi. Ez a leolvasási lehetőség a következőképpen néz ki:
A számláló végül tartalmazza a StringGrid adatainak olvasási és kimeneti idejét. Lehetséges, hogy a számláló kizárólag az adatlapok adatainak olvasására szolgáljon, de úgy döntöttem, hogy a forráskódot nem felesleges változókkal túlterheljük. Ha van vágy - átírhatsz egy kicsit a forráskódot és kaphatsz egy "tiszta" leolvasási időt.
Ennek a lehetőségnek a teszteléséhez egy Excel-lapot hoztak létre, amely 143 sorral és 142 oszlopot tartalmaz adattal, azaz. 20306 sejtek adatai. Az alábbi ábra mutatja a számláló értékét az adatok elolvasása után:
12 másodpercig olvasható. de ha 1000 sor és 1000 oszlop van? Tehát nem várhat a művelet befejezésére.
Ha alaposan megnézzük a fent bemutatott eljárást, láthatjuk, hogy a hurokban minden egyes iteráció során minden alkalommal először megkapjuk az adatok által elfoglalt tartományt, majd ebben a tartományban kapunk egy bizonyos cellát, és csak akkor olvassuk el a cellában lévő értéket. Tény, hogy sok szükségtelen műveletre van szükség adatlap olvasásához. Különösen, ha az adatok egy folyamatos tömbben találhatók. Egy előnyösebb leolvasási lehetőség ebben az esetben a teljes tartományból közvetlenül töltött adatokat olvas.
A gyakorlatban a munka ezen verziójának végrehajtása még könnyebb lesz, mint a fentiek. Nézd meg magad. Íme egy lehetőség az adatok teljes tartományban történő olvasására:
A művelet idejét vizsgáljuk:
Amint látja, a sebességnövekedés hatalmasnak bizonyult, még akkor is, ha figyelembe vettük a StringGrid frissítésének idejét.
Itt helyénvaló lenne megmutatni az Excel módszerrel végzett munkát, azaz írjon adatokat Excel-munkalapra egy variáns tömb felhasználásával.
Adatok írása Excel-be
Abban az esetben, ha nagy mennyiségű adatot kell Excel-lapra írni, fordított műveletet kell végrehajtanunk, azaz először hozzon létre egy variáns tömböt, majd írja le az adatokat erre a tömbre, majd írja le az egész tömböt egy művelettel az Excel-ben. Például írtam egy eljárást, amely nagy mennyiségű adatot olvas fel egy StringGrid-ből, és ezeket az adatokat egy nyitott Excel munkafüzet második lapjára írja:
Itt most először hozzon létre egy kétdimenziós tömb a variáns VarArrayCreate módszert, majd töltse ki az adatokat tömb, és adja át a tömböt Excel. Ne feledje, hogy Excel-be írása esetén nincs ciklus - a felvétel két egyszerű lépésben történik:
- válassza ki a tartományt az első és az utolsó cellák használatával
- hozzárendel egy értéket a tömb tartományából.
Az alábbi kép elkészítéséhez az ábra mutatja a számláló értékét, amely a tömb elkészítésének pillanatától számított időpontot tartalmazza az Excel alkalmazás befogadására:
Természetesen az adatok mennyiségének növekedésével a művelet ideje is növekedni fog. Például, a lap, amely 1000 sort és 256 töltött oszlopok adatok körülbelül 7 másodperc. Ha ez az idő elfogadhatatlan, akkor a fenti eljárás kissé felgyorsítható a VarArrayLock () és a VarArrayUnLock () metóduspár használatával, de figyelembe kell vennie, hogy az FData mátrix átültetésre kerül.
Mit kell még mondanom az adatok olvasásáról / írásáról Excel-ben? Valószínűleg az a tény, hogy a fenti munkamódszerek szükségképpen megkövetelik a telepített Excel-t azon a számítógépen, ahol a program fut. E körülmény kapcsán szükség lehet egy általánosabb munkamódszerre az Excel használatával kapcsolatban. Itt is, lehet, hogy több változata a munkát, de meg fogom mutatni, hanem pont csak az egyiket - a XLSReadWrite könyvtárban.
Egy egyszerű példa a Delphi 7-re
Egy teljes példa a könyvtárral való együttműködésre: