![]() |
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:
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.
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; |
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)?
|
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.
|
Zitat:
|
Code:
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.
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; |
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:
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.
while not (Query1.Eof) ...
:coder: |
So sieht mein Code mein Code im ganzen aus.
Code:
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.
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 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? |
: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. |
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
dort ![]() 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) |
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. |
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