Autor Beitrag
delphi_rookie
Hält's aus hier
Beiträge: 8

WIN 2000
D3 Pro, D6 Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8

WIN 2000
D3 Pro, D6 Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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:
ausblenden 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:
ausblenden Delphi-Quelltext
1:
2:
For i:=0 to myADOTable.Fields.Count-1 do // oder so ähnlich -> Delphi hilfe
  listbox1.items.add (myADOTable.Field[i].Name); // oder so ähnlich -->

Schau mal in der Delphi Hilfe und benutze die 'Code completion'.
delphi_rookie Threadstarter
Hält's aus hier
Beiträge: 8

WIN 2000
D3 Pro, D6 Enterprise
BeitragVerfasst: 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

ausblenden 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 user profile iconraziel: Delphi-Tags hinzugefügt.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8

WIN 2000
D3 Pro, D6 Enterprise
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8

WIN 2000
D3 Pro, D6 Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Mo 13.06.05 10:21 
user profile icondelphi_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 Threadstarter
Hält's aus hier
Beiträge: 8

WIN 2000
D3 Pro, D6 Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8

WIN 2000
D3 Pro, D6 Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 13.06.05 16:56 
Probieren...
delphi_rookie Threadstarter
Hält's aus hier
Beiträge: 8

WIN 2000
D3 Pro, D6 Enterprise
BeitragVerfasst: 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:

ausblenden 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 user profile iconraziel: Code- durch Delphi-Tags ersetzt.