Hogyan exportálhatjuk a dbgrid tartalmát excel-be

Van egy forrás a témában?

Olyan forrásra van szüksége, amely exportálja a tartalmat a DBgrid-ből az Excel-be


> evgen # xA0; (17/05/04 14:03) # xA0;

Itt nem túl lusta neked írtam egy mintakódot:

típus
TMyDBGrid = osztály (TDBGrid);
.
eljárás ToExcel;
var
# xA0; a, b: Integer;
# xA0; ExApp, WB, WS: Variant;
kezdődik
# xA0; ExApp: = CreateOleObject ("Excel.Application");
# xA0; WB: = ExApp.WorkBooks.Add;
# xA0; WS: = ExApp.Workbooks [1] .WorkSheets [1];
# xA0; a TMyDBGrid (DBGrid1) .DataLink segítségével
# xA0; kezdődik
# xA0; # xA0; a: = 0 - (RecordCount-1) esetén
# xA0; # xA0; kezdődik
# xA0; # xA0; # xA0; b: = 0 - (FieldCount-1) esetén
# xA0; # xA0; # xA0; kezdődik
# xA0; # xA0; # xA0; # xA0; WS.Cells [a + 1, b + 1] .Value: = mezők [b] .AsString;
# xA0; # xA0; # xA0; vége;
# xA0; # xA0; vége;
# xA0; # xA0; ExApp.Visible: = igaz;
# xA0; vége;
végén;

Itt a DBGrid tartalma Excel-lapra kerül
De tényleg szüksége van erre?

Köszönöm. Most nézz!

Hiba adódik, úgy tűnik, valami hiányzik az űrlapon:
[Hiba] Unit1.pas (32): Nem bejelentett azonosító: "CreateOleObject"
a sorban:
ExApp: = CreateOleObject ("Excel.Application");


> evgen # xA0; (17.05.04 14:53) [8]

Sajnálom, testvér, teljesen elfelejtettem (jaj nekem)
a ComObj-ot használja
:-)

És ez az?
A sorban:
a TMyDBGrid (DBGrid1) .DataLink segítségével
hiba:
[Hiba] Unit1.pas (36): Nem bejelentett azonosító: "TMyDBGrid"


> evgen # xA0; (17.05.04 15:10) [10]
És mi ez?

És ez azt jelenti, hogy a típusszekcióban nem jelentette be a típust
TMyDBGrid = osztály (TDBGrid);
Olvassa el alaposan a [5] bejegyzést

# xA0; # xA0; TMyDBGrid = osztály (TDBGrid);

típus
# xA0; TMyDBGrid = osztály (TDBGrid);
# xA0; TForm1 = osztály (TForm)
# xA0; 1. táblázat: TTable;
# xA0; DataSource1: TDataSource;
# xA0; DBGrid1: TDBGrid;
# xA0; eljárás ToExcel;
magán
# xA0;
nyilvános
# xA0;
végén;

Igen, mint én!
egység Unit1;

felhasználások
# xA0, Windows, Üzenetek, SysUtils, Variants, Classes, Graphics, Controls, Forms,
# xA0; Dialógusok, rácsok, DBGrids, DB, DBTables, ComObj;

típus
# xA0; TMyDBGrid = osztály (TDBGrid);
# xA0; TForm1 = osztály (TForm)
# xA0; 1. táblázat: TTable;
# xA0; Adatforrás1: TDataSource;
# xA0; DBGrid1: TDBGrid;
# xA0; eljárás ToExcel;
# xA0; privát
# xA0; # xA0;
# xA0; nyilvános
# xA0; # xA0;
# xA0; vége;

var
# xA0; Form1: TForm1;

eljárás ToExcel;
var
a, b: Integer;
ExApp, WB, WS: Variant;
kezdődik
ExApp: = CreateOleObject ("Excel.Application");
WB: = ExApp.WorkBooks.Add;
WS: = ExApp.Workbooks [1] .WorkSheets [1];
a TMyDBGrid (DBGrid1) .DataLink segítségével
kezdődik
# xA0; a következőhöz: = 0 - (RecordCount-1) do
# xA0; kezdődik
# xA0; # xA0; b: = 0 - (FieldCount-1) esetén
# xA0; # xA0; kezdődik
# xA0; # xA0; # xA0; WS.Cells [a + 1, b + 1] .Value: = mezők [b] .AsString;
# xA0; # xA0; végén;
# xA0; végén;
# xA0; ExApp.Visible: = true;
végén;
végén;

Vlad
Miközben Cheto nem működött. Később folytatjuk! Köszönöm!

Ugyanaz a probléma, mint az evgen, exportálni kell a Grida Excel adatait.
Megpróbáltam a javasolt kódot, de csak egy rekordot (amelyen a kurzort találtam) a Grid-ból, annyiszor, amennyit a Gridben látható sorok láthatók.
Talán valaki nem lusta - segíts nekem kitalálni.

a DbGrid1.DataSource.DataSet segítségével
kezdődik
# xA0; Utolsó;
# xA0; Első;
végén;

> a: = 0 - (RecordCount-1) esetén
> # xA0; kezdődik
> # xA0; # xA0; b: = 0 - (FieldCount-1) esetén
> # xA0; # xA0; kezdődik
> # xA0; # xA0; # xA0; WS.Cells [a + 1, b + 1]. Érték: = mezők [b] .AsString;
> # xA0; # xA0; végén;
# xA0; # xA0; # xA0; DbGrid1.DataSource.DataSet.Next; # xA0;
> # xA0; végén;
> # xA0;
az aláhúzott vonal a helyes út a fékekhez, mivel a fenti linket kell látnia.

> Kipróbáltam a javasolt kódot, de csak egy rekordot (be
> amely a kurzor) a Rácsból olyan sokszor, mint amilyen látható
> sorok a Gridben
nézze meg a kóddal kapcsolatos kiegészítéseimet.

Tehát hogyan lehet letölteni a Grid Excel-be nyom nélkül?


> iVovs # xA0; (22.05.04 14:10) [17]

bocsásson meg nekem, a hiba beindult,
.
a TMyDBGrid (DBGrid1) .DataLink segítségével
kezdődik
# xA0; a: = 0 - (RecordCount-1) esetén
# xA0; kezdődik
# xA0; # xA0; ActiveRecord: = a; Elfelejtettem hozzá ezt a sort
# xA0; # xA0; b: = 0 - (FieldCount-1) esetén
# xA0; # xA0; kezdődik
.


> Exportálni kell a DBGrid-től, és nem a DataSet-től, a nyilatkozat szerint
> kérdés, hogy a válasz helytelen-e elvileg
uh .. Nos, akkor a termelés helytelen lehet a DbGrid "a tartalomhoz, kivéve hogy az oszlopok neve, az összes többi adat a DataSet-hez tartozik".

Ezért sajnálom, de mi a kérdés - ez a válasz.

Igen, ne beszélj így.
Mindkét példa órában működik, csak akkor, ha a DataSet írja az Excel-be - láthatja a folyamatot a DB Gride-ban.


> iVovs # xA0; (22.05.04 15:17) [24]


> van egy bejegyzés Excel-ben - megfigyelheted a folyamatot a DB-ben
> Grid.

DataSet.DisableControls
DataSet.EnableControls

A francba, egy másik problémába ütköztem:

A DBGridek különböző oldalakon vannak (PageControl), és külön is - az "Excel" exportálás lehetőségére. Tehát ez a funkció vagy csoda gomb jól működik az adott táblázattal (vagyis exportálja az összes rekordot), amelynek oldala aktív volt, mielőtt az oldalra lépne ezzel a gombbal. Ha másik DBGrid-ból exportál, csak 1 sor jelenik meg. Hogy legyenek?

A Vlad változatot használják.

Igen, egyébként, és hogyan kell exportálni mindent, ami a DBGrid-e-ben kell lennie, és így így annyi sorozatot fogadhat, amennyit a képernyőn lát.
Vagy talán van egy lehetőség a közvetlenül a ClientDataSet-ből, hogy exportálhasson mindent Excel-ben. Segíts, ha nem lustaság.


> iVovs # xA0; (22.05.04 15:33) [26]

Először is, határozzuk meg a kérdést.
Az adatokat csak a DBGrid-ből kell feltölteni? (vagyis csak azokat, amelyeket látunk)
(ebben az esetben a verzióm működni fog).
vagy le kell töltenie a teljes adatkészletet?
(ebben az esetben a jack128 verziója működni fog).

Az én esetemben teljesen ki kell töltened.

Alapvetően elvárható, hogy adatokat exportáljon az adatkészletben, de mivel a DBGrid megjeleníti ezeket az adatokat, lehetséges.


> iVovs # xA0; (22.05.04 15:56) [29]

Akkor ne keverj össze a kérdés szövegével - ez két különböző dolog.
Módosíthatja ezt a kódot a fiktív örökös (TMyDBGrid) eltávolításával, és ennek megfelelően távolítsa el a munkát a DBGrid összes védett tulajdonságával. Ezután a DataLink helyett a DataSource.DataSet

Minden, uv. Mesterek, kitaláltam ezt a kérdést, és megkaptam a kívánt eredményt.
Az alábbi kód az adott témában kapott információk általánossága - különösen azok számára, akik nem kívánják megkérdőjelezni a kérdésre adott válaszok jelentését :). Ez a kód exportálja az adatokat a Grid-a-tól Excel-be (az összes adat Grid biztosítja DataSet-jét)

TMAinForm.ToExcel eljárás (DBgrid: TDBGrid);
var
a, b: Integer;
ExApp, WB, WS: Variant;
kezdődik
ExApp: = CreateOleObject ("Excel.Application");
WB: = ExApp.WorkBooks.Add;
WS: = ExApp.Workbooks [1] .WorkSheets [1];
a DbGrid.DataSource.DataSet segítségével
kezdődik
Utolsó;
első;
végén;
a TMyDBGrid (DBGrid) .DataLink segítségével
kezdődik
# xA0; a: = 0;
# xA0; míg a DbGrid.DataSource.DataSet.eof nem

# xA0; kezdődik
# xA0; # xA0; b: = 0 - (FieldCount-1) esetén
# xA0; # xA0; kezdődik
# xA0; # xA0; # xA0; WS.Cells [a + 1, b + 1] .Value: = mezők [b] .AsString;
# xA0; # xA0; végén;
# xA0; # xA0; # xA0; DbGrid.DataSource.DataSet.Next;
# xA0; a: = a + 1;
# xA0; végén;
# xA0; ExApp.Visible: = true;
# xA0; megpróbál
# xA0; ExApp.save; // azonnal javasolja a megtakarítást
# xA0; kivéve // ​​hogy ne esküszöm, ha megtagadjuk a megmentést
# xA0; végén;
végén;
végén;

Hívás (csak a DBGrid nevét kell átadni):

Hatalmas köszönet Vlad és jack128-nak.

Heh, nem hallgattál intelligens tanácsokat, és nem olvastad az első linkről szóló cikket, hogyan nézek ki? Még egyszer azt tanácsolom, hogy figyeljen a változatos tömbökre. Többé-kevésbé normális mennyiségben a gyorsulás tíz-százszor.


> iVovs # xA0; (22.05.04 16:54) [31]

NFÜ. Túl rosszul vagy valamiért :-)
Újra megmondom. Ha ki kell töltened a DataSet-ből. majd távolítsa el az összes adatkapcsolatot ", és közvetlenül a DataSet" ohmmal működjön együtt.
Az Eof, Firs, Next módszerek segítenek Önnek.

Nem, csak szükségem van rá, az a tény, hogy csak néhány Excel-et szeretnék betölteni az Excel-be. a DBGrid által megjelenített mezők, de a DataSet-ben lévő minden rekordhoz, ami a kódom.

A DataSet-ből történő kirakodás mellett végrehajtottam is, de nem kell minden mezőt kiüríteni a rácsból.

-------------------------
Egy könyvet olvashatunk, hogy nincsenek benne olyan asszisztensek, mint itt :)

Elolvastam, de őszintén szólva nem értettem, hogy konkrét példámban hogyan lehet betölteni a DBgrid adatait a változatos tömbbe.

ami érthetetlen

a DbGrid1.DataSource.DataSet segítségével
kezdődik
# xA0; Utolsó; // összes rekord levétele
# xA0; Első;
# xA0; ArrayData: = VarArrayCreate ([1, RecordCount, 1, Fields.Count], varVariant);
# xA0; // Töltse ki a tömböt
# xA0; az I: = 1-hez a RecordCount nem
# xA0; kezdődik
# xA0; # xA0; a J: = 1-nek a Fields.Count számára
# xA0; # xA0; # xA0; ArrayData [I, J]: = Fileds [j-1] .AsVariáns;
# xA0; # xA0; Következő;
# xA0; vége;
végén;


> iVovs # xA0; (22.05.04 17:19) [34]
> Nem, csak szükségem van rá, az a tény, hogy Excel-be szeretnék betölteni
> csak bizonyos. a DBGrid által megjelenített mezők

Eh. átkozott, újra a kód írni

eljárás ToExcel;
var
a, b: Integer;
ExApp, WB, WS, Arr: Variant;
kezdődik
a: = 0;
ExApp: = CreateOleObject ("Excel.Application");
WB: = ExApp.WorkBooks.Add;
WS: = ExApp.Workbooks [1] .WorkSheets [1];
a DBGrid1 segítségével
kezdődik
# xA0; DataSource.DataSet.DisableControls;
# xA0; míg a DataSource.DataSet.Eof nem
# xA0; kezdődik
# xA0; # xA0; a b: = 0 - (Columns.Count-1) esetén
# xA0; # xA0; kezdődik
# xA0; # xA0; # xA0; WS.Cells [a + 1, b + 1] .Value: = oszlopok [b] .Field.AsString;
# xA0; # xA0; vége;
# xA0; # xA0; DataSource.DataSet.Next;
# xA0; # xA0; Inc (a);
# xA0; vége;
# xA0; DataSource.DataSet.DisableControls;
# xA0; ExApp.Visible: = igaz;
végén;
végén;

Nem kezdtem átalakítani a fájlt, nem akartam.
De pontosan megmutatja azokat a mezőket, amelyeket a hálózat megjelenít.

Szia, a kód úgy tűnik, hogy működik, de ha rákattintasz az Excel-be gombra (Például), ne # xA0, ami nem történik meg! Mi a következő lépés?

Szia, a kód úgy tűnik, hogy működik, de ha rákattintasz az Excel-be gombra (Például), ne # xA0, ami nem történik meg! Mi a következő lépés?