Gyors feldolgozás excel Delphi
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émát meg lehet oldani több módon. Több lehetőség kínálkozik, és melyik lehetőség lenne a leggyorsabb. Nos, mi az opció lenne kényelmesebb - ez mindenki maga dönti el.
Olvasás adatokat Excel
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. Vizsgálati eljárás az olvasási lehetőség a következőképpen nézhet ki:
eljárás TForm16.SlowVariant;
var sorok, oszlopok, i, j: integer;
Munkalap: OLEVariant;
d: TDateTime;
kezdődik
// nyitott könyv
ExcelApp.Workbooks.Open (edFile.Text);
// kap az aktív munkalap
Munkalap: = ExcelApp.ActiveWorkbook.ActiveSheet;
// meghatározza a sorok és oszlopok a táblázat
Sorok: = WorkSheet.UsedRange.Rows.Count;
Cols: = WorkSheet.UsedRange.Columns.Count;
StringGrid1.RowCount: = sorok;
StringGrid1.ColCount: = Cols;
// pontosan kezdete olvasás
d: = Most;
// megjeleníti az adatokat egy táblázatban
az I: = 0 a sorok-1 do
j: = 0 Cols-1 do
StringGrid1.Cells [J, I]: = WorkSheet.UsedRange.Cells [I + 1, j + 1] Eddig;
Label2.Caption: = 'egész levél olvasási idő:' + FormatDateTime ( 'hh: mm: ss: ZZZ',
Most () - d);
végén;
A számláló végül tartalmazza az olvasási idő és kimeneti adatok StringGrid. Lehetséges lenne, hogy a számláló csak olvasni az adatokat a lemez, de úgy döntöttem, hogy ne terhelje túl a forrás redundáns változók. Ha van egy vágy - átírható egy kis forráskód és szerezzen egy „tiszta” olvasási idő.
Excel táblázat keletkezett a vizsgálat ennek a kiviteli alaknak, amelynek 143 sorból és 142 oszlopok adatokat, azaz, 20306 adatok sejtekben. Az alábbi ábra mutatja a számláló értékét, amikor az adatok olvasását:
12 másodperc olvasni. és ha 1000 sorok és oszlopok 1000? Tehát nem lehet várni a végét a műveletet.
Ha jobban megnézzük a bemutatott eljárás a fenti, láthatjuk, hogy minden alkalommal, amikor ciklus elején minden egyes iteráció megkapjuk a tartomány által elfoglalt az adatokat, akkor ez a tartomány kap egy bizonyos cellát, majd olvassuk le a sejtben. Tény, hogy sok felesleges műveletek olvasni az adatokat a lemez nem szükséges. Különösen, ha az adatok vannak elrendezve folyamatos tömb. További előnyös, ebben az esetben az egyik lesz olvasni olvasni az adatokat közvetlenül a teljes tartományban a tömb.
Tény, hogy ez a fajta munka még könnyebb lesz, mint a fentebb bemutatott. Lásd magad. Itt van egy lehetőség, hogy olvassa el az adatok egy sor:
eljárás TForm16.RangeRead;
var sorok, oszlopok, i, j: integer;
Munkalap: OLEVariant;
FData: OLEVariant;
d: TDateTime;
kezdődik
// nyitott könyv
ExcelApp.Workbooks.Open (edFile.Text);
// kap az aktív munkalap
Munkalap: = ExcelApp.ActiveWorkbook.ActiveSheet;
// meghatározza a sorok és oszlopok a táblázat
Sorok: = WorkSheet.UsedRange.Rows.Count;
Cols: = WorkSheet.UsedRange.Columns.Count;
// olvassa el a teljes körű adatok
FData: = WorkSheet.UsedRange.Value;
// pontosan kezdete olvasás
d: = Most;
// megjeleníti az adatokat egy táblázatban
az I: = 0 a sorok-1 do
j: = 0 Cols-1 do
StringGrid1.Cells [J, I]: = FData [I + 1, j + 1];
Label2.Caption: = 'egész levél olvasási idő:' + FormatDateTime ( 'hh: mm: ss: ZZZ',
Most () - d);
végén;
Bízunk abban az időben a művelet:
Mint látható, a növekedés sebességét óriási volt, még akkor is figyelembe véve azt a tényt, hogy a mérőt kapott frissítési idő StringGrid'a.
Itt célszerű lenne megmutatni a fordított eljárás dolgozó Excel, azaz az adatok írása Excel mérleg egyik változata tömb.
Írásban adatok Excel
Ha meg kell írni a nagy mennyiségű adatot egy Excel, meg kell végezni a fordított műveletet, azaz először hozzon létre egy variáns tömb, majd írjuk az adatokat a tömböt, majd írni az egész tömböt egy műveletben az Excel. Például, írtam egy rutin, hogy beolvassa a nagy mennyiségű adat StringGrid és kiírja az adatokat a második lapot az Excel nyitott könyv:
eljárás TForm16.WriteData;
var i, j: integer;
FData: Variant;
Sheet, Range: Variant;
kezdődik
// Létrehozunk egy variáns tömb
FData: = VarArrayCreate ([1, StringGrid1.RowCount, 1, StringGrid1.ColCount], varVariant);
// töltse ki a tömb adatokat StringGrid
i: = 1 VarArrayHighBound (FData, 1) do
j: = 1 VarArrayHighBound (FData, 2) do
FData [i, j]: = StringGrid1.Cells [J-1, I-1];
// nyitott könyv
ExcelApp.Workbooks.Open (edFile.Text);
// aktiválja
Sheet: = ExcelApp.ActiveWorkBook.Sheets [2];
Sheet.Activate;
// válassza ki a tartományban beszúrni adatok
Tartomány: = Sheet.Range [Sheet.Cells [1,1], Sheet.Cells [VarArrayHighBound (FData, 1), VarArrayHighBound (FData, 2])];
// helyezze be az adatokat
Range.Value: = FData;
// azt mutatják, az Excel ablak
ExcelApp.Visible: = true;
végén;
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. Jegyezzük meg, hogy nem használ semmilyen hurkok Excel rögzítésekor - felvétel zajlik 2 egyszerű lépésben:
válassza ki a tartományban, egy sor határok első és az utolsó cella
hozzárendelése egy értéktartományt egy tömb.
A teljesség, az alábbi ábra mutatja a számláló értéke, amelyet az óramutató idejétől kezdve kezdetektől a tömb Excel, hogy aktiválja a kérelem tartalmazza:
Természetesen az adatok a növekedés tovább fog növekedni, és hajtsa végre a műveletet. Például, a lap, amely 1000 sort és 256 töltött oszlopok adatok körülbelül 7 másodperc. Ha van ilyen időben elfogadhatatlan, akkor a fenti eljárás lehet valamivel gyorsítani egy pár VarArrayLock () és VarArrayUnlock (), de meg kell jegyezni, hogy FData mátrix kell ültetni.
Mi mást kell mondani arról az olvasó / író adatok Excel. Talán azt, hogy a javasolt módszereket fenti munkák nélkül nem igényel Excel telepítve a számítógépen, ahol a program futtatásával. Ezzel kapcsolatban, akkor szükség lehet egy sokoldalú munkamódszer az Excel. 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űsített példa Delphi 7
var
IntlXls: TXLSReadWriteII2;
I, J: egész;
kezdődik
// Létrehozunk egy objektumot
IntlXls: = TXLSReadWriteII2.Create (nulla);
// A könyv címe
IntlXls.Sheets [0] .name: = "A cím az én jelentés";
// add meg a szükséges számú sorok és oszlopok
IntlXls.Sheets [0] .Rows.AddIfNone (0, 10000);
IntlXls.Sheets [0] .Columns.AddIfNone (0, 100);
// hozzá és a csúszás cella szélessége (képpont érték)
I: = 0-99 csinálni
IntlXls.Sheets [0] .Columns [I] .PixelWidth: = 150;
// csúszás magasság sorok (érték nincs pixel, így be kell állítania)
I: = 0-9999 csinálni
IntlXls.Sheets [0] .Rows [I] .Height: = 20 * 14;
// létre
a J: = 0-9999 do
I: = 0-99 csinálni
kezdődik
// tolja számérték
// ha azt szeretné, hogy adja meg egy ilyen vonalat, majd AsString
IntlXls.Sheets [0] .AsFloat [i, j]: = J + I / 100;
// vízszintes igazítás (hozzáférhető chaLeft, chaCenter, chaRight)
IntlXls.Sheets [0] .Cell [i, j] .HorizAlignment: = chaLeft;
// függőleges igazítás (hozzáférhető cvaTop, cvaCenter, cvaBottom)
IntlXls.Sheets [0] .Cell [i, j] .VertAlignment: = cvaTop;
// font
IntlXls.Sheets [0] .Cell [i, j] .FontName: = "Arial";
IntlXls.Sheets [0] .Cell [i, j] .FontSize: = 12;
IntlXls.Sheets [0] .Cell [i, j] .FontStyle: = [];
IntlXls.Sheets [0] .Cell [i, j] .FontColor: = TColorToClosestXColor (clBlue);
IntlXls.Sheets [0] .Cell [i, j] .Rotation: = 0;
// félkövér
A IntlXls.Sheets [0] .Cell [i, j] do
FontStyle: = FontStyle + [xfsBold];
// ferde jel
A IntlXls.Sheets [0] .Cell [i, j] do
FontStyle: = FontStyle + [xfsItalic];
// háttérszíne
IntlXls.Sheets [0] .Cell [i, j] .FillPatternForeColor: =
TColorToClosestXColor (clYellow);
// a járdára, a bal oldalon (ugyanaz, mint a többi határon)
IntlXls.Sheets [0] .Cell [i, j] .BorderLeftColor: =
TColorToClosestXColor (clBlack);
IntlXls.Sheets [0] .Cell [i, j] .BorderLeftStyle: = cbsThin;
// cellákat egyesíteni (kombinálni itt két vízszintes cella)
ha i = 49, akkor
IntlXls.Sheets [0] .MergedCells.Add (I, J, i + 1, j);
végén;
IntlXls.SaveToFile ( "c: \ demo.xls");
IntlXls.Free;
végén;
Teljes például a könyvtár
// vízszintes igazítás
esetében HorizAlign a
haLeft:
// balra igazított
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .HorizAlignment
: = ChaLeft;
haCenter:
// központú
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .HorizAlignment: =
chaCenter;
haRight:
// jobbra igazított
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .HorizAlignment
: = ChaRight;
végén; // ügy
// függőleges igazítás
esetében VertAlign a
vaTop:
// igazítás top
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .VertAlignment
: = CvaTop;
vaCenter:
// összehangolás a központban
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .VertAlignment: =
cvaCenter;
vaBottom:
// igazítás alján
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .VertAlignment: =
cvaBottom;
végén; // ügy
// font
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .FontName: = Font.Name;
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .FontSize: = Font.Size;
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .FontCharset: =
Font.Charset;
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .FontStyle: = [];
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .FontColor: =
TColorToClosestXColor (Font.Color);
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .Rotation: = Font.Angle;
// vastagon arcot?
ha Font.IsBold majd
// nincs
A IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] do
FontStyle: = FontStyle + [xfsBold];
// van egy ferde jel?
ha Font.IsItalic majd
// nincs
A IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] do
FontStyle: = FontStyle + [xfsItalic];
// háttérszíne
ha Color <> clWindow majd
// A szín beállításához
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .FillPatternForeColor: =
TColorToClosestXColor (színes);
end // ha
más
// egyszerűen aktiválja a sejt (az alábbiakban másként nem lehet hozzáadni határok)
IntlXls.Sheets [0] .AsString [IntlCol, IntlRow]: = „;
// a járdára, a bal oldalon van?
A Borders.Left do
ha LineHeight> 0, akkor
// létre
kezdődik
// szín
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .BorderLeftColor: =
TColorToClosestXColor (színes);
// a vastagsága
ha LineHeight = 1, akkor
// vékony
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .BorderLeftStyle
: = CbsThin
egyébként, ha az LineHeight az [1, 2], majd
// átlagos vastagsága
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .BorderLeftStyle: =
cbsMedium
más
// vastag
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .BorderLeftStyle
: = CbsHair;
végén; // ha a
// megfékezze a tetején ott?
A Borders.Top do
ha LineHeight> 0, akkor
// létre
kezdődik
// szín
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .BorderTopColor: =
TColorToClosestXColor (színes);
// a vastagsága
ha LineHeight = 1, akkor
// vékony
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .BorderTopStyle
: = CbsThin
egyébként, ha az LineHeight az [1, 2], majd
// átlagos vastagsága
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .BorderTopStyle: =
cbsMedium
más
// vastag
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .BorderTopStyle
: = CbsHair;
végén; // ha a
// megfékezze ott?
A Borders.Right do
ha LineHeight> 0, akkor
// létre
kezdődik
// szín
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .BorderRightColor: =
TColorToClosestXColor (színes);
// a vastagsága
ha LineHeight = 1, akkor
// vékony
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .BorderRightStyle
: = CbsThin
egyébként, ha az LineHeight az [1, 2], majd
// átlagos vastagsága
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .BorderRightStyle: =
cbsMedium
más
// vastag
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .BorderRightStyle
: = CbsHair;
végén; // ha a
// alsó határ?
A Borders.Bottom do
ha LineHeight> 0, akkor
// létre
kezdődik
// szín
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .BorderBottomColor: =
TColorToClosestXColor (színes);
// a vastagsága
ha LineHeight = 1, akkor
// vékony
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .BorderBottomStyle
: = CbsThin
egyébként, ha az LineHeight az [1, 2], majd
// átlagos vastagsága
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .BorderBottomStyle: =
cbsMedium
más
// vastag
IntlXls.Sheets [0] .Cell [IntlCol, IntlRow] .BorderBottomStyle
: = CbsHair;
végén; // ha a
// egyesület szüksége?
if ((Range.Width> 1) vagy (Range.Height> 1)) és
((IntlMainCol = IntlCol) és (IntlMainRow = IntlRow)), majd
// kombinálni
IntlXls.Sheets [0] .MergedCells.Add (IntlCol, IntlRow,
IntlCol + Range.Width - 1, IntlRow + Range.Height - 1);
// felhasználó megnyomja az export interrupt?
ha btnCancel.Tag = 2, akkor
// igen, hagyjuk
break;
végén; // a
végén; // az
// az állapot frissítéséhez
prgrbrStatus.Position: = prgrbrStatus.Position + 1;
Application.ProcessMessages;
// felhasználó megnyomja az export interrupt?
ha btnCancel.Tag = 2, akkor
// igen, hagyjuk
break;
végén; // az
// felhasználó megnyomja az export interrupt?
ha btnCancel.Tag <> 2, akkor
// nincs
kezdődik
// A bal felső sarokban
IntlXls.Sheet [0] .TopRow: = 0;
IntlXls.Sheet [0] .LeftCol: = 0;
IntlXls.Sheet [0] .Selection.ActiveRow: = 0;
IntlXls.Sheet [0] .Selection.ActiveCol: = 0;
// státusz
prgrbrStatus.Position: = prgrbrStatus.Max;
Application.ProcessMessages;
// write file
IntlXls.FileName: = AFileName;
IntlXls.Write;
// minden sikeres
Eredmény: = UNIRPT_OK;
end // ha
más
// igen
Eredmény: = UNIRPT_GENERATE_ABORT;
végül
// felszabadítja a memóriát
IntlXls.Free;
végén; // try..finally
végén; // függvény ExportToExcelXls