| Autor |
Beitrag |
trm
      
Beiträge: 491
Erhaltene Danke: 19
Windows 7x64
Delphi 7
|
Verfasst: Do 17.06.10 22:31
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
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Fr 18.06.10 05:22
trm hat folgendes geschrieben : | | wo finde ich eine Übersicht über den Aufbau einer 'normalen' Excel (xls) - Datei für Windows? |
sc.openoffice.org/excelfileformat.pdf
| Zitat: | | Ich brauche eine Möglichkeit einzelne Sheets zu erstellen. |
Bei installiertem Excel hilft Dir das evtl. weiter:
www.djpate.freeserve.co.uk/Automation.htm
|
|
DonManfred
      
Beiträge: 148
Erhaltene Danke: 2
Windows 7
Delphi XE3 Pro + HTML5Builder
|
Verfasst: Fr 18.06.10 07:21
Ansonsten ist das TMS FlexCel Studio for VCL/LCL was für Dich. Mit 75,- nicht grad kostenlos aber du kannst damit XLS erstellen und vorhandene manipulieren.
_________________ Gruss Manfred
|
|
trm 
      
Beiträge: 491
Erhaltene Danke: 19
Windows 7x64
Delphi 7
|
Verfasst: 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
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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 
      
Beiträge: 491
Erhaltene Danke: 19
Windows 7x64
Delphi 7
|
Verfasst: 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 ( www.swissdelphicente.../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
      
Beiträge: 328
Erhaltene Danke: 3
Windows 7
Delphi 7 Pro.
|
Verfasst: 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
_________________ Diejenigen, die grundlegende Freiheiten aufgeben, um ein wenig mehr vorrübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit.
(Benjamin Franklin;"The Papers of Benjamin Franklin", Vol. 6, Apr. 1, 1755, through Sep. 30, 1756)
|
|
trm 
      
Beiträge: 491
Erhaltene Danke: 19
Windows 7x64
Delphi 7
|
Verfasst: 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 ( delphi.about.com/od/...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
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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.
Einloggen, um Attachments anzusehen!
|
|
Critter
      
Beiträge: 328
Erhaltene Danke: 3
Windows 7
Delphi 7 Pro.
|
Verfasst: 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
_________________ Diejenigen, die grundlegende Freiheiten aufgeben, um ein wenig mehr vorrübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit.
(Benjamin Franklin;"The Papers of Benjamin Franklin", Vol. 6, Apr. 1, 1755, through Sep. 30, 1756)
Zuletzt bearbeitet von Critter am Fr 18.06.10 12:23, insgesamt 1-mal bearbeitet
|
|
trm 
      
Beiträge: 491
Erhaltene Danke: 19
Windows 7x64
Delphi 7
|
Verfasst: 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
      
Beiträge: 328
Erhaltene Danke: 3
Windows 7
Delphi 7 Pro.
|
Verfasst: 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.
_________________ Diejenigen, die grundlegende Freiheiten aufgeben, um ein wenig mehr vorrübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit.
(Benjamin Franklin;"The Papers of Benjamin Franklin", Vol. 6, Apr. 1, 1755, through Sep. 30, 1756)
Zuletzt bearbeitet von Critter am Fr 18.06.10 12:44, insgesamt 1-mal bearbeitet
|
|
trm 
      
Beiträge: 491
Erhaltene Danke: 19
Windows 7x64
Delphi 7
|
Verfasst: 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
|
|
|