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


Gerd Kayser - Fr 18.06.10 05:22

user profile icontrm hat folgendes geschrieben Zum zitierten Posting springen:
wo finde ich eine Übersicht über den Aufbau einer 'normalen' Excel (xls) - Datei für Windows?


http://sc.openoffice.org/excelfileformat.pdf

Zitat:
Ich brauche eine Möglichkeit einzelne Sheets zu erstellen.


Bei installiertem Excel hilft Dir das evtl. weiter:

http://www.djpate.freeserve.co.uk/Automation.htm


DonManfred - Fr 18.06.10 07:21

Ansonsten ist das TMS FlexCel Studio for VCL/LCL [http://www.tmssoftware.com/site/flexcel.asp] was für Dich. Mit 75,- nicht grad kostenlos aber du kannst damit XLS erstellen und vorhandene manipulieren.


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..5of Word = ($809800$1000); {$J-}
  CXlsEof: array[0..1of Word = ($0A00);
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,
user profile icontrm hat folgendes geschrieben Zum zitierten Posting springen:
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