Autor |
Beitrag |
delphi_rookie
Hält's aus hier
Beiträge: 8
WIN 2000
D3 Pro, D6 Enterprise
|
Verfasst: So 12.06.05 17:35
Hallo Delphi-Forum,
ich bin neu hier und möchte erstmal zu allen Hallo sagen!
Ich habe mich schon ein wenig umgeschaut, um eine Lösung für mein Problem zu finden. Leider ohne durchschlagenden Erfolg  ... Also, ich möchte eine Excel-2000-Datei (mit 255 Spalten, ca. 20000 Zeilen) in Delphi 6 Enterprise einlesen und dann einzelne Spalten in ein anderes Excel-File auslesen. Die Datei MUSS im xls-Format verbleiben.
Sicher werdet ihr denken, ich soll doch mal die Suchfunktion nutzen... war ein bisschen "zu hoch" für mich, was ich da gefunden habe...
Gibt es irgendwo Tutorials, die sich mit diesem Thema beschäftigen? Oder hat jemand von euch einen Beispiel-Code?
Ich bin für Hilfe aller Art dankbar!!!
Viele Grüße
Euer Rookie
Zuletzt bearbeitet von delphi_rookie am So 12.06.05 18:35, insgesamt 1-mal bearbeitet
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: So 12.06.05 18:12
Es gibt unter Windows einen ODBC-Treiber. Über ADO kannst Du IMHO am Einfachsten auf ODBC zugreifen. Dazu doppelklickst Du auf die ConnectionString Eigenschaft einer ADOTable (ADOQuery, ADODataset geht auch). Dann solltest Du in der Lage sein, Excel-Dateien zu lesen. Excel muss nicht installiert sein.
Alternativ kannst Du auch eine der diversen BIFF-Libraries saugen. Ich kenne nur Flexcel und XLSReadWriteII. Googel mal nach denen.
|
|
delphi_rookie 
Hält's aus hier
Beiträge: 8
WIN 2000
D3 Pro, D6 Enterprise
|
Verfasst: So 12.06.05 18:57
Hi alzaimar,
vielen Dank für Deine schnelle Antwort!
Die von Dir vorgeschlagenen BIFF-Libraries habe ich mir angeschaut, ist leider kostenpflichtig.
Zu Deinem Vorschlag mit ADO: ich habe das so gemacht, wie vorgeschlagen. Beim Anfangskatalognamen habe ich den Pfad+Dateinamen angegeben (da stellt sich mir die Frage, wie es möglich ist, während der Laufzeit durch den Nutzer eine x-beliebige Excel-Datei aufzurufen?). Der Verbindungstest war erfolgreich.
Hmm...dann habe ich noch ein paar Fragen...sorry, bin eben noch Anfänger (hoffentlich ändert sich das bald...). Wie kann ich denn nun am gescheitesten einzelne Spalten auswählen? Indem ich die Excel-Tabelle darstelle und dann die entsprechenden Spalten markiere (gibt es diese Funktion in Delphi? Falls ja, könnte das allerdings wegen der großen Spaltenanzahl ein bisschen unübersichtlich werden) oder durch auslesen der Kopfspalte, anschließendes Anzeigen und verfügbar machen für eine Auswahl durch den Nutzer?
Ich hoffe, Du (ihr) könnt mir weiterhelfen!
Viele Grüße
Euer Rookie
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: So 12.06.05 19:11
Wenn Du Dir den 'Connectionstring' anschaust, steht da bestimmt irgendwo die EXCEL-Datei drin. Die kannst du austauschen bzw. Folgendes machen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| Const szXLSADOConnectionString = 'fooo.bar;XLSFile=%s;morestuff;blubbal=boofar';
Begin ... myADOTable.ConnectionString := Format (szXLSADOConnectionString , [myEXCELFileName]); ... |
Spaltenauswahl:
Delphi-Quelltext 1: 2:
| For i:=0 to myADOTable.Fields.Count-1 do listbox1.items.add (myADOTable.Field[i].Name); |
Schau mal in der Delphi Hilfe und benutze die 'Code completion'.
|
|
delphi_rookie 
Hält's aus hier
Beiträge: 8
WIN 2000
D3 Pro, D6 Enterprise
|
Verfasst: So 12.06.05 20:10
Hallo alzaimar,
ich habe gar nicht gewusst, dass der connectionstring im Quelltext der pas-Datei steht bzw. da rein geschrieben werden kann. So ganz hab ich das noch nicht verstanden, was Du meinst. Muss ich jetzt den connection string in der ADOTable-Komponente löschen (den ich über den Objektinspektor erstellt habe) und dann
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| Const szXLSADOConnectionString = 'fooo.bar;XLSFile=%s;morestuff;blubbal=boofar';
Begin ... myADOTable.ConnectionString := Format (szXLSADOConnectionString , [myEXCELFileName]); ... |
in den Quelltext des Buttons einfügen?
Bitte erkläre mir das nochmal! Vielen Dank schon mal und ausserdem Danke für den Tip mit der Spaltenauswahl!
Viele Grüsse
Rookie
Moderiert von raziel: Delphi-Tags hinzugefügt.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: So 12.06.05 20:23
1. Probieren.
2. Der ConnectionString zeigt ADO, wie er auf die Datenquelle zugreifen muss. Da steht der Treiber (Provider), Datenbankname, Username etc. drin, je nach Provider und Datenbank.
Spiel mal damit rum. Du kannst eigentlich alles, was du zur Designzeit im Objektinspektor einstellst, auch zur Laufzeit machen. Ich bin mir nicht ganz sicher, aber du solltest die ADOTable.Active auf False setzen, bevor Du den ConnectionString änderst.
Und wenn Du mehrere Tabellen hast, dann nimmst Du eine TADOConnection, stellst deren ConnectionString ein und verbindest Deine TADOTables über die 'Connection' Eigenschaft.
Aber: Learning by Doing ist das A und O bei Delphi. Schau Dir alle Demos an. Saug Dir Sourcecodes und Komponenten von www.torry.net. Zieh Dir die Programmiertips von www.swissdelphicenter.ch ein.
|
|
delphi_rookie 
Hält's aus hier
Beiträge: 8
WIN 2000
D3 Pro, D6 Enterprise
|
Verfasst: Mo 13.06.05 09:41
Hallo,
Danke für Deine Tips! Werde mich bei torry.net umschauen und auch die Demos durchgehen.
Du hast natürlich recht, Learning by Doing ist eine Grundvoraussetzung bei Delphi. Leider ist das manchmal arg frustrierend, wenn man nach ein paar Stunden keinen Millimeter vorangekommen ist...
Falls wieder Fragen auftauchen, hoffe ich, auch weiterhin ein paar Tips von Dir (euch) zu erhalten.
Ich wünsch einen schönen Tag!
Rookie
|
|
delphi_rookie 
Hält's aus hier
Beiträge: 8
WIN 2000
D3 Pro, D6 Enterprise
|
Verfasst: Mo 13.06.05 09:56
Noch eine grundsätzliche Frage:
ich habe dieses Problem auch in ein anderes Forum reingestellt. Dort wurde mir vorgeschlagen, auf Excel via ComObj zuzugreifen (var ExcelApp: OLEVariant).
Was ist nun besser? ADO oder ComObj? Oder ist dass das gleiche? Ist das Abhängig von der Grösse der Tabelle?
Vielen Dank schon mal!
Grüsse
Rookie
|
|
nelle
      
Beiträge: 22
|
Verfasst: Mo 13.06.05 10:21
delphi_rookie hat folgendes geschrieben: | ...auf Excel via ComObj zuzugreifen (var ExcelApp: OLEVariant).
Was ist nun besser? ADO oder ComObj? |
Meine persönliche Meinung dazu ist: Das kann man nicht entscheiden. Das hängt davon ab, was Du von der Excel-Datei wissen willst...
Möchtest Du nur Inhalte verwenden, reicht es i.A., wenn Du via ADO zugreifst (ist dann auch schneller, glaube ich). Willst Du allerdings "komplexe" Operationen durchführen, wie Zellen formatieren (Hintergrundfarbe setzen, Schriftfarbe setzen, Schriftart setzen,...), dann ist der Zugriff via COM sicherlich der Bessere.
Fazit: Du hältst mit ADO und COM zwei unterschiedliche Werkzeuge in der Hand. Je nach Lage ist die Verwendung des einen oder anderen Werkzeugs geschickter.
Beispiel: Eine Kreuzschlitzschraube lässt sich besser mit einem Kreutzschlitzschraubendreher lösen als mit einem "normalen" Schraubendreher. (Obwohl man den normalen Schraubendreher auch nehmen könnte.) ABER mit einem Kreutzschlitzschraubendreher kannst Du keine "normalen" Schlitzschrauben lösen. Denk Dir jetzt einfach: Kreutzschlitzschraubendreher=ADO und Schlitzschraubendreher=COM
Nelle
|
|
delphi_rookie 
Hält's aus hier
Beiträge: 8
WIN 2000
D3 Pro, D6 Enterprise
|
Verfasst: Mo 13.06.05 11:01
Danke für Deine Beschreibung!
Ich will nur die Inhalte verwenden, auf eine besondere Formatierung kommt es nicht an. Gibt es eigentlich Maximalwerte in Bezug auf Spaltenzahl/Zeilenzahl beim einlesen via ADO? Ich stelle mir die Frage, da ich bis vor kurzem noch in Pascal rumgeeiert habe und da alles an arrays und den damit verbundenen Einschränkungen gehangen hat.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mo 13.06.05 12:43
EXCEL via COM zu steuern ist sehr sehr langsam. Eine komplexe Datei mit 200 Feldern zu füllen dauert Minuten!!!
Mit den BIFF-Bibliotheken kann man alle Werte schreiben, Formatierungen durchführen, Charts erstellen, Bitmaps einbinden etc. Einfach ALLES. Das dauert dann nur ca. 100ms. Ich habe hier ein Tool, welches 1000de Datenbätter aus einer DB als XLS-Sheets zur Verfügung stellen muss. Das würde mit der COMObj-Variante ca. 2 Tage dauern(!), Mit XLSReadWriteII geht das in ca. 5 Minuten.
Nochwas zu ADO: Der ODBC-Treiber startet EXCEL eben nicht! Deshalb geht es auch schnell. Aber: Es klappt nur mit XSL-Sheets, bei denen Die Daten tabellenförmig ohne Schnickschnack aufbereitet sind...
|
|
delphi_rookie 
Hält's aus hier
Beiträge: 8
WIN 2000
D3 Pro, D6 Enterprise
|
Verfasst: Mo 13.06.05 13:51
Hallo!
Vielen Dank für diese konkrete Aussage!!! Das hilft mir sehr weiter! Es ist immer besser nur eine (ADO)-Baustelle zu haben, als zwei (COM und ADO)...
Eine Frage noch: Du schreibst, dass das nur mit XLS-Sheets funktioniert, die ohne Schnickschnack aufbereitet worden sind. Sprichst Du jetzt von Formatierungen, die nicht übernommen werden (z.B. wissenschaftliche Zahlendarstellung), oder eher von Farben, Schriftarten?
Danke nochmals für Deinen Tip!!
Grüsse
Rookie
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mo 13.06.05 16:56
|
|
delphi_rookie 
Hält's aus hier
Beiträge: 8
WIN 2000
D3 Pro, D6 Enterprise
|
Verfasst: Di 14.06.05 22:38
Hallo,
nach langem Probieren und dank eurer Hilfe hab ich nun endlich Zugriff auf eine Excel-Datei via ADO erhalten.
Nun bin in allerdings bei einer Sache am verzweifeln: wenn ich die xls-Datei unter einem anderen Namen im xls-Format speichern möchte, erhalte ich nur Dateien, die nicht im xls-Format sind. Der Code sieht so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TfrmMain.Dateispeichern1Click(Sender: TObject); begin If Self.SaveDialog1.Execute Then begin dm.ADODSExcel.SaveToFile(self.SaveDialog1.FileName); end; end; |
Könnte mir bitte jemand einen Hinweis geben, wie ich die Datei dann wieder im Excel-Format speichern kann?
Vielen Dank schon mal!
Rookie
Moderiert von raziel: Code- durch Delphi-Tags ersetzt.
|
|