Entwickler-Ecke
Sonstiges (Delphi) - Excel - Header und Sheets
trm - Do 17.06.10 22:31
Titel: Excel - Header und Sheets
Huhu,
wo finde ich eine Übersicht über den Aufbau einer 'normalen' Excel (xls) - Datei für Windows?
Ich brauche eine Möglichkeit einzelne Sheets zu erstellen.
Danke
~Mathias
trm - Fr 18.06.10 08:05
Hallo ihr 2,
die PDF guck ich mir gleich an.
Eine kostenpflichtige Variante umgehe ich gern, da ich selbst auch ausschließlich Free/Opensource Software erstelle :)
Dass Excel installiert ist, kann ich auch leider nicht vorraussetzen (ich nutze selbst z.B. auch nur die Viewer von MS.
Danke und ein schönes WE.
~Mathias
bummi - Fr 18.06.10 08:47
Der schnellste Weg ist IMHO, ddem Macrorecorder anzuschmeißen, das zu tun was Du automatisieren willst und Dir das Makro anschauen.
trm - Fr 18.06.10 09:01
Hallo Bummi,
ich möchte eigentlich nichts automatisieren, sondern eine Excel-Datei erstellen, welche mit Daten aus einer Datenbank gefüttert wird.
Aber: eine OLE-Variante kann ich nicht nutzen, weil Excel u.U. nicht installiert ist.
Ich habe dazu als Basis eine Procedure von den Schweizern genommen (
http://www.swissdelphicenter.ch/de/showcode.php?id=379 ) und angepasst für eine Datenbankstruktur.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| function SaveAsExcelFile(AGrid: TStringGrid; AFileName: string): Boolean; const {$J+} CXlsBof: array[0..5] of Word = ($809, 8, 00, $10, 0, 0); {$J-} CXlsEof: array[0..1] of Word = ($0A, 00); var FStream: TFileStream; I, J: Integer; begin Result := False; FStream := TFileStream.Create(PChar(AFileName), fmCreate or fmOpenWrite); try CXlsBof[4] := 0; FStream.WriteBuffer(CXlsBof, SizeOf(CXlsBof)); for i := 0 to AGrid.ColCount - 1 do for j := 0 to AGrid.RowCount - 1 do XlsWriteCellLabel(FStream, I, J, AGrid.cells[i, j]); FStream.WriteBuffer(CXlsEof, SizeOf(CXlsEof)); Result := True; finally FStream.Free; end; end; |
Leider ist es mit diesem Code nicht möglich, mehrere Sheets zu erstellen (wäre angenehm, da ich mehrere Tage unterteilen könnte).
Critter - Fr 18.06.10 09:07
Hallo,
du kannst auch per ADO auf Excel-Datein zugreifen. Der Connection-String müsste dann in etwa so aussehen:
Quelltext
1:
| Provider=Microsoft.Jet.OLEDB.4.0;Data Source=[Hier Pfad und Dateinamen Einfügen];Extended Properties= "Excel 8.0;HDR=Yes";Persist Security Info=False;Persist Security Info=False |
Das anlegen von Sheets könnte dann mir
Create Table-Querys klappen. Das habe ich aber nicht getestet, daher bin ich nicht sicher.
critter
trm - Fr 18.06.10 09:51
Hi Critter,
danke für den Tipp. Leider habe ich bisher noch nicht mit ADO gearbeitet, daher ist mir das im Moment etwas kompliziert. ( ich nutze die freie Datenbank TDbf -> Sourceforge ) Jedoch habe ich mir das hier mal durchgelesen (
http://delphi.about.com/od/database/a/databasecourse.htm ), glaube aber trotzdem nicht, dass ich das nutzen möchte (nenn es Lernfaul ;) ).
Jedenfalls ist es gut zu wissen, dass es noch andere Möglichkeiten gibt, Danke :)
Gruß
~Mathias
bummi - Fr 18.06.10 10:35
Die Adolösung ist trivial zu implementierun und bietet den bequemsten Zugriff.
Ich habe Dir mal ein Microdemoprojekt angehängt.
Critter - Fr 18.06.10 10:37
Hallo,
trm hat folgendes geschrieben : |
| glaube aber trotzdem nicht, dass ich das nutzen möchte (nenn es Lernfaul ;) ). |
das musst du selbst entscheiden, und bei dem Werk das du das rausgesucht hast, kann ich auch nachvollziehen, dass du abgeschreckt bist. Weil ich aber selbst wissen wollte ob das Anlegen von Sheets auf dem ADO Weg möglich ist, habe ich mir gerade mal folgenden Code dahin gepfuscht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Dummy.xls;Extended Properties= "Excel 8.0;HDR=Yes";Persist Security Info=False;Persist Security Info=False'; ADOConnection1.Connected := True; ADOQuery1.Connection := ADOConnection1; ADOQuery1.SQL.Text := 'CREATE TABLE Test1 (ID integer, Name Varchar(50))'; ADOQuery1.ExecSQL; ADOQuery1.SQL.Text := 'INSERT INTO Test1 (ID, Name) VALUES (1, ''Müller'')'; ADOQuery1.ExecSQL; ADOConnection1.Close; |
Nachdem ich in einer neuen Anwendung eine tADOConnection, eine tADOQuery und ein Button hinzugefügt habe und konnte somit feststellen, dass es klappt. Diese paar Zeilen Code legen in der Datei C:\Dummy.xls ein Sheet mit dem Namen Test1 an, welches die Spalten ID und Name sowie den Eintrag 1;Müller enthält. Ich glaube viel einfacher wirst du zu dem Ergebnis nicht kommen können - du musst nur vorher deinen inneren Schweinehund nieder ringen ;).
critter
trm - Fr 18.06.10 11:48
Hallo nochmal an bummi und Critter.
Danke, dass ihr ADO auf die schnelle für mich brauchbar gemacht habt.
Leider verstehe ich nicht, warum die xls-Datei nicht im Microsoft Excel Viewer 2007 zu öffnen ist.
Liegt das daran, dass es vielleicht eine Tabelle ist, die als Datenbank aufgebaut ist, was dann eigentlich die Struktur einer Access-Datenbank wäre.. ?
Vielleicht könnte da mir nochmal jemand helfen, bitte.
Critter - Fr 18.06.10 12:23
Hallo,
kann ich so nicht sagen. Was mir bei meinem Beispiel Code aufgefallen ist, ich halte die Connection offen, wenn das Öffnen also nicht klappt während das Beispiel-Programm geöffnet ist, dann solltest du als letzte Zeile der Funktion ADOConnection1.Close; einfügen. Sonst hält das Programm die Excel Tabelle blockiert.
critter
Ps: Habe die fehlende Zeile oben mal nachgetragen.
trm - Fr 18.06.10 12:31
Du bist ein Held :)
Danke, darauf wäre ich nicht gekommen :(
Jetzt geht Dein Beispiel perfekt.
Bummi seins ist ja im Prinzip genau das gleiche, geht auch, wenn ich die Verbindung schließe.
(Das Wochenende ist gerettet ;) )
Liebe Güße
~Mathias
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!