AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Excel generieren ohne Office
Thema durchsuchen
Ansicht
Themen-Optionen

Excel generieren ohne Office

Offene Frage von "Hey Joe"
Ein Thema von Moony · begonnen am 28. Okt 2011 · letzter Beitrag vom 23. Mär 2020
Antwort Antwort
Seite 1 von 2  1 2      
Moony

Registriert seit: 29. Jul 2003
Ort: Essen
454 Beiträge
 
Delphi 2010 Professional
 
#1

Excel generieren ohne Office

  Alt 28. Okt 2011, 11:23
Datenbank: MS SQL • Version: 2008 • Zugriff über: ADO
Hallo zusammen,

ich habe ein Programm geschrieben, mit dem man ein vorhandenes Excel öffnet und dort die Zellen füllt. Dies passiert zur Zeit über XLApplication := CreateOleObject('Excel.Application'); .

Gibt es eine andere Möglichkeit das zu realisieren ohne dass Office benötigt wird???

Danke und Gruß,Moony
Ich weiß, daß ich nichts weiß! Sokrates
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
534 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Excel generieren ohne Office

  Alt 28. Okt 2011, 11:26
Wir machen's mit dem

Gibt aber auch anderes.
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#3

AW: Excel generieren ohne Office

  Alt 28. Okt 2011, 11:36
ja mit z.B: AdvStringGrid und AdvExcelIO von TMS Software geht das...
  Mit Zitat antworten Zitat
Benutzerbild von tshubaka
tshubaka

Registriert seit: 11. Sep 2009
Ort: Neckertal
35 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Excel generieren ohne Office

  Alt 28. Okt 2011, 15:23
hallo,
das geht auch ohne Zusatz.
Delphi-Quellcode:
const
{$J+}
  CXlsBof: array[0..5] of Word = ($809, 8, 00, $10, 0, 0);
{$J-}
  CXlsEof: array[0..1] of Word = ($0A, 00);
////////////////////////////////////////////////////////////////////////////////
procedure XlsWriteCellNumber(XlsStream: TStream; const ACol, ARow: Word;
const AValue: Double);
const
{$J+}
  CXlsNumber: array[0..4] of Word = ($203, 14, 0, 0, 0);
{$J-}
begin
  CXlsNumber[2] := ARow;
  CXlsNumber[3] := ACol;
  XlsStream.WriteBuffer(CXlsNumber, SizeOf(CXlsNumber));
  XlsStream.WriteBuffer(AValue, 8);
end;
////////////////////////////////////////////////////////////////////////////////
procedure XlsWriteCellLabel(XlsStream: TStream; const ACol, ARow: Word;
const AValue: string);
var
  L : Word;
const
{$J+}
  CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
{$J-}
begin
  L := Length(AValue);
  CXlsLabel[1] := 8 + L;
  CXlsLabel[2] := ARow;
  CXlsLabel[3] := ACol;
  CXlsLabel[5] := L;
  XlsStream.WriteBuffer(CXlsLabel, SizeOf(CXlsLabel));
  XlsStream.WriteBuffer(Pointer(AValue)^, L);
end;
////////////////////////////////////////////////////////////////////////////////
procedure XlsWriteVal(XLsStream:TStream; Const ERow , ECol :word;Field:TField);
var
  S : String;
  N : Extended;
  D : TDateTime;
Begin
  N := 50000;
  S := '';
  D := 0;
  case field.DataType of
    ftUnknown : S:='UNKNOWN';
    ftString : S:=Field.asstring;
    ftSmallint : N:=Field.asfloat;
    ftInteger : N:=Field.asfloat;
    ftWord : N:=Field.asfloat;
    ftBoolean : S:=Field.asstring;
    ftFloat : N:=Field.asfloat;
    ftCurrency : N:=Field.asfloat;
    ftBCD : N:=Field.asfloat;
    ftDate : N:=Field.AsFloat;
    ftTime : N:=Field.AsFloat;
    ftDateTime : D:=Field.AsDateTime;
    ftBytes : S:='BYTES';
    ftVarBytes : S:='VARBYTES';
    ftAutoInc : N:=Field.asfloat;
    ftBlob : S:='BLOB';
    ftMemo : S:=field.AsString;
    ftGraphic : S:='GRAPHIC';
    ftFmtMemo : S:='FMTMEMO';
    ftParadoxOle : S:='PARADOXOLE';
    ftDBaseOle : S:='DBASEOLE';
    ftTypedBinary: S:='TYPEBIN';
    ftCursor : S:='CURSOR';
    ftFixedChar : S:=field.asstring;
    ftWideString : S:=field.asstring;
    ftLargeInt : N:=Field.asfloat;
    ftADT : S:='ADT';
    ftArray : S:='ARRAY';
    ftReference : S:='REFER';
    ftDataSet : S:='DATASET';
    ftOraBlob : S:='ORABBLOB ';
    ftOraClob : S:='ORACCBLOB ';
    ftVariant : S:=field.asstring;
    ftInterface : S:='INTERFACE';
    ftIDispatch : S:='IDISPATCH';
    ftGuid : S:='GUID';
  end;
  if N <> 50000 then // auch nuller
     XlsWriteCellNumber(XLsStream, ERow, ECol, N);
  if S <> 'then
     XlsWriteCellLabel(XLsStream, ERow, ECol, S);
  if D <> 0 then
     XlsWriteCellNumber(XLsStream, ERow, ECol, D)
end;
////////////////////////////////////////////////////////////////////////////////
function SaveAsExcelFile(AGrid: TStringGrid; AFileName: string): Boolean;
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
    begin
      for j := 0 to AGrid.RowCount - 1 do
      begin
        try
          XlsWriteCellNumber(FStream, I, J, strtofloat(AGrid.cells[i, j]));
        except
          XlsWriteCellLabel(FStream, I, J, AGrid.cells[i, j]);
        end;
      end;
    end;
    FStream.WriteBuffer(CXlsEof, SizeOf(CXlsEof));
    Result := True;
  finally
    FStream.Free;
  end;
end;
////////////////////////////////////////////////////////////////////////////////
procedure dbtoXLS(data : TDataset; AFileName : String);
var
  BOOKm : pointer;
  i : integer;
  FStream : TFileStream;
begin
  if not data.active then exit;
  BOOKm:=DATA.GetBookmark;
  data.DisableControls;
  data.first;
  FStream := TFileStream.Create(AFileName, fmCreate);
  try
    CXlsBof[4] := 0;
    FStream.WriteBuffer(CXlsBof, SizeOf(CXlsBof));
    for i:=0 to Data.FieldCount-1 do
      XlsWriteCellLabel(FStream, i, 0 , data.fields[i].FieldName);
    while not DATA.Eof do
    begin
      for i:=0 to Data.fieldcount-1 do
        XlsWriteVal(FStream,i , data.recno , Data.Fields[i]);
      data.NEXT;
    end;
    FStream.WriteBuffer(CXlsEof, SizeOf(CXlsEof));
  finally
    data.GotoBookmark(BOOKm);
    data.EnableControls;
    FStream.Free;
  end;
end;
Gruss
Peter
Peter
  Mit Zitat antworten Zitat
Moony

Registriert seit: 29. Jul 2003
Ort: Essen
454 Beiträge
 
Delphi 2010 Professional
 
#5

AW: Excel generieren ohne Office

  Alt 28. Okt 2011, 16:17
Danke, ich werd das mal umsetzen...
Ich weiß, daß ich nichts weiß! Sokrates
  Mit Zitat antworten Zitat
marky522

Registriert seit: 30. Okt 2006
29 Beiträge
 
Delphi XE2 Professional
 
#6

AW: Excel generieren ohne Office

  Alt 24. Dez 2011, 10:20
Hallo,

das Thema Excel-Files ohne Excel zu erzeugen scheint immer wieder hier im Forum hochzukommen,
daher habe ich ich entschieden eine DLL (Usbiff8.dll) und eine dazugehörige Unit (UXLS.pas)
hier zu veröffentlichen, welche dies ermöglichen.
Die Datei Beschreibung.txt enthält eine Beschreibung der Funktionen und Eigenschaften.
Zusätzlich ist noch eine Unit (Unit1.pas) angehängt, welche als Demoprojekt dient. Bitte ein Label
und einen Button auf das Form ziehen.

Ich habe die DLL selbst erstellt, daher verbleiben die Urheberrechte bei mir. Es kann jedoch
jeder die DLL völlig frei benutzen.

Die DLL wurde unter folgenden Betriebssystemen getestet: WIN 98, WIN 2000, XP, VISTA (32Bit, 64Bit),
WIN 7 (32Bit, 64Bit)
Die erstellten Excel Dateien wurden mit Microsoft Office (97-2010), Planmaker Office, Kingsoft Office,
Open Office und Gnumeric getestet.

Es existieren folgende Haupt-Restriktionen: Es können keine Charts und keine Pictures erzeugt werden.
Ebenso können keine Formeln eingegeben werden.
(Ich habe mit der Implementierung von Charts begonnen, sie aber nicht beendet, daher bitte die
entsprechenden Befehle nicht aufrufen. Sie sind noch in der DLL und UXLS.pas vorhanden.)

Geändert von marky522 (24. Dez 2014 um 07:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.314 Beiträge
 
Delphi 12 Athens
 
#7

AW: Excel generieren ohne Office

  Alt 24. Dez 2011, 10:34
PChar ist ein sehr ungünstiger Exporttyp.

Ich empfehle dringend auf PAnsiChar zu ändern, da die DLL ja mit Delphi 7 erstellt wurde und die DLL demnach als PAnsiChar deklariert wurde.

Zitat:
Die DLL wurde unter folgenden Betriebssystemen getestet: WIN 98, WIN 2000, XP, VISTA (32Bit, 64Bit),
WIN 7 (32Bit, 64Bit)
PS: Der Versuch eine Datei in C:\... zu erstellen kann seit Win7 (mit ordentlichen Benutzerrechten, bzw. mit aktivem UAC noch nie funktioniert haben. (eigentlich schon seit Win2000, mit Benutzerrechte ging das nicht ... Zugriff verweigert)

Und eigentlich ist die Übergabe von Objekten, über die DLL-Grenzen hinweg, sowieso keine soooo gute Idee.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (24. Dez 2011 um 11:07 Uhr)
  Mit Zitat antworten Zitat
karin_ro

Registriert seit: 8. Okt 2006
Ort: Balingen
4 Beiträge
 
Delphi XE2 Enterprise
 
#8

AW: Excel generieren ohne Office

  Alt 27. Jun 2012, 16:27
Ich habe das mal versucht, das klappt einwandfrei.
Wenn Man die Stringfelder umdefiniert als AnsiString, so
gibt es auch mit Delphi XE2 keine Probleme.
Jetzt habe ich noch 3 Fragen

1. Wie kann an eine bestehende Exceldatei angefügt werden
2. Wo finde ich Infos, zur Formattierung
3. Klappt das auch umgekehrt, so dass eine Datei eingelesen werden kann.

Wa da jemand Infos hätte, wäre das echt Super!!!!
Es grüsst die Alb

Karin
  Mit Zitat antworten Zitat
marky522

Registriert seit: 30. Okt 2006
29 Beiträge
 
Delphi XE2 Professional
 
#9

AW: Excel generieren ohne Office

  Alt 28. Jun 2012, 20:57
Hallo,

zu Deinen Fragen:

1) Es kann nichts an eine bestehende Excel Datei angefügt werden. Die Datei muss von
von Grund auf erstellt werden.

2) Infos zum Biff8 Format sind in folgenden zwei Dateien enthalten, die man durch
"googlen" im Internet findet:
-MICROSOFT OFFICE EXCEL 97-2007
BINARY FILE FORMAT SPECIFICATION
[*.xls (97-2007) format]
-OpenOffice.org's Documentation of the
Microsoft Excel File Format
Excel Versions 2, 3, 4, 5, 95, 97, 2000, XP, 2003

In der DLL sind die wichtigsten und nötigsten Formate entsprechend diese beiden
Dokumente implementiert.

3) Nein! Dazu muss die Datei im Biff8 Format analysiert werden.
Ich habe das nicht in der DLL implementiert.
  Mit Zitat antworten Zitat
marky522

Registriert seit: 30. Okt 2006
29 Beiträge
 
Delphi XE2 Professional
 
#10

AW: Excel generieren ohne Office

  Alt 29. Jun 2012, 11:53
Noch ein kleiner Nachtrag:

Die mit Hilfe der oben genannten Dokumente erstellte Biff8 Datei muss dann
noch in Micropsoft Compound File Format eingelabert werden.
Dies geschieht gemäß dieses Dokuments:

-OpenOffice.org's Documentation of the
Microsoft Compound Document
File Format

Das Dokument kann ebenfalls durch "googeln" gefunden werden.

MfG
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz