Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Query trägt in Excel Daten in erster Zeile ein WISO? (https://www.delphipraxis.net/5644-query-traegt-excel-daten-erster-zeile-ein-wiso.html)

Albi 14. Jun 2003 11:23


Query trägt in Excel Daten in erster Zeile ein WISO?
 
Ich übertrage die Daten aus einem Query in ein Excel Table, das Funktioniert auch, nur trägt er sie immer nur in die erste Excelzeile ein. Was muß ich Delphi sagen, das wenn im Query eine Zeile gelesen wurde und diese zu Ende ist, das in Excel eine neue Zeile angefangen werden soll.

Code:
while not Form1.Query1.EOF do
begin
  {Die Werte aus dem Stringgrid (oder aus einer Datei oder sonstwo her), schrei-
  ben wir jetzt in das Excel.Worksheet.}
 for zeile := 0 to Form1.Query1.FieldCount-1 do
    for spalte := 0 to Form1.Query1.FieldCount-1 do
       Excel.Cells[Spalte+1].value := Form1.Query1.Fields[Spalte].AsString;
Ich habe es schon mit einer Abfrage versucht, da das ja funktioniert, wenn man die Daten in eine Textdatei schreibt aber bei Excel funzt das nicht.

r_kerber 14. Jun 2003 11:27

Die Zeilennummer wird von Dir nie verwendet. Muß man denn nicht irgendwo sagen, in welche Zeile die Werte geschriben werden sollen. Was verbirgt sich eigentlich hinter Excel (welche Komponente)?

Albi 14. Jun 2003 13:02

Excel ist in diesem Fall ein Variante. Ja genau, man muß Excel die Zeilennummer sagen, darum geht es mir ja. Ich sage Excel in diesem Fall nur, das Excel mit dem Eintrag in A:1 beginnen soll. Dann überschreibt er jedesmal dieses Zeile, bis man am letzten angekommen ist.

r_kerber 14. Jun 2003 13:08

Zitat:

Zitat von Albi
Excel ist in diesem Fall ein Variante.

Welche Komponente verbirgt sich dahinter? Immerhin hat diese ja Member-Variablen (Cells). Muß man vielleicht in Cells Zeile und Spalte angeben (Cells[iZeile, iSpalte])?

Albi 14. Jun 2003 13:29

Code:
for zeile := 0 to Form1.Query1.FieldCount-1 do
    for spalte := 0 to Form1.Query1.FieldCount-1 do
       Excel.Cells[Zeile+1].value := Form1.Query1.Fields[Zeile].AsString;
Also ich verwende ein OLEExcelObjekt und eine ExcelApplication, sicherlich muß ich die Zeile angeben, habe ich ja uch getan mit (Zeile+1), da sie in Excel mit 1 beginnt und nicht wie ne Paradox mit 0. Nun weiß ich aber nicht wie ich ihm das sagen soll, das er dann mal ne Zeile nach unten gehen soll, wenn im Query auch ne neue Zeile beginnt.

Alfons_G 14. Jun 2003 13:59

Erstens verwendest Du für BEIDE Schleifen FieldCount, also die Anzahl der ErgebnisSPALTEN. Du müsstest für die äußere Schleife RowCount nehmen.

Zweitens ist Cells ein ZWEIDIMENSIONALES Array. Eine Zelle sprichst Du über Cells[Zeile, Spalte] an (in VBA wäre es Cells(Zeile, Spalte)). Wenn Du Cells als eindimensionales Array verwendest, schreibt Excel immer alles in die erste Zeile.

Drittens fragst Du immer nur die Erste Zeile der Datenmenge ab. Du musst innerhalb der ERSTEN Schleife jeweils mit Query1.Next weiterblättern.
Es wäre auch zweckmäßig, statt der äusseren for-Schleife mit
Delphi-Quellcode:
while not (Query1.Eof) ...
durch die Datenmenge zu blättern und eine Variable für die Zeile jeweils um 1 zu erhöhen. Dann bist Du vom Typ der Datenmenge unabhängig.

:coder:

Albi 14. Jun 2003 14:21

So sieht mein Code mein Code im ganzen aus.

Code:
var
   zeile, spalte: Integer;
  Excel                  : variant;
begin
  try
     Excel := CreateOleObject('Excel.Application');
  except
     ShowMessage('Excel kann nicht gestartet werden');
    exit;
  end;
  Excel.Visible := true;
  Excel.Workbooks.add;
while not Form1.Query1.EOF do
begin
  {Die Werte aus dem Stringgrid (oder aus einer Datei oder sonstwo her), schrei-
  ben wir jetzt in das Excel.Worksheet.}
 //for zeile := 0 to Form1.Query1.RecordCount-1 do
    for spalte := 0 to Form1.Query1.FieldCount-1 do
       Excel.Cells[Zeile+1,Spalte+1].value := Form1.Query1.Fields[Spalte].AsString;
     Form1.Query1.Next;
  end;
end;
Ich habe jetzt zwar verstanden was Du meinst aber mir fehlen sämtliche Kenntnisse um dieses jetzt auch noch sinnvoll anzuwenden. Ich beschäftige mich noch nicht solang damit.

Ich nehme mir jetzt also eine Variable X: Integer und soll diese dann nach jedem Schleifendurchlauf um 1 erhöhen und diesen Wert dann Cells zuweisen. Stimmt doch, oder?

Albi 14. Jun 2003 14:44

:spin: Es geht, manchmal braucht man nur einen Denkanstoß oder auch etwas mehr. Ich habe wie Du gesagt hast, einfach noch ne Variable angelegt, die dann bei jedem Durchlauf eins Hochzählt.

Danke.

Jens Schumann 14. Jun 2003 15:15

Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
dort Daten nach Excel übertragen zeige ich wie man Daten aus Excel ausliest. Daten nach Excel übertragen funktioniert analog dazu.

Außerdem kann man Daten noch über ein variantes Array nach Excel übertragen. Das eignet sich besonders gut für große Datenmengen, da es ziemlich schnell geht.

Das anliegende Beispiel zeigt den Weg über ein variantes Array.
Das Programm lädt aus einer Access2000 Datebank eine Tabelle und schiebt
den Inhalt dann über das Array nach Excel. Außerdem zeigt das Beispiel die Verwendung der nativen ADO Objekte Connection und RecordSet (interessant für alle Delphi Personal Besitzer)

Albi 14. Jun 2003 16:16

Vielen Dank, ich werde es morgen mal ausprobieren. Sieht auf jeden Fall besser aus als meine Variante.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:53 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz