Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Daten aus InterbaseDB in "vorhandene" Excel-Datei schreiben (https://www.delphipraxis.net/42859-daten-aus-interbasedb-vorhandene-excel-datei-schreiben.html)

spoona 24. Mär 2005 20:10

Datenbank: interbase • Zugriff über: Interbase

Daten aus InterbaseDB in "vorhandene" Excel-Datei
 
Hallo,

also ich habe schon vieles durchgeschaut, bin jetzt aber total durcheinander.....
Was ich will:
Ich möchte gerne Daten aus einer Db in eine vorhandene Excel-Datei schreiben.
Dabei soll die vorhandene Datei als Muster dienen, welches dann mit Daten gefüllt wird. Dann möchte ich es natürlich unter einem anderen Namen abspeichern. Ich weiß jetzt aber nicht, ob ich das ganze über OLE realisieren soll(Excell ist ja vorhanden) oder die Delphi Steuerkomponente in "Server" vewenden soll
(Verwende Delphi 7). Und ich habe auch keine Ahnung, wie ich es jetzt im Quellcode realisieren muss und wodrauf ich achten sollte. Was ist denn ein Workbook?-->Die Datei(Arbeitsbereich)?
Mein erster Versuch war jetzt:
Delphi-Quellcode:

procedure TFrm_Bestellung.BitBtn4Click(Sender: TObject);
var Excel: variant;
zeile,spalte:integer;
begin
  Excel := CreateOleObject('Excel.Application');
  Excel.Workbooks.Add('c:\temp2\mappe1.xls');
  For zeile:=1 to 5 do
    For spalte:=1 to 5 do
      begin
        Excel.Cells[zeile,spalte].Value:='WERT aus DB'
      end;
  Excel.Quit;
end;
Also er macht ja schon eigentlich das, was ich will. Die Excel-Datei wird an den richtgen Stellen gefüllt und die anderen Daten in der Datei werden nicht gelöscht.Außerdem wird gefragt, ob ich die Datei speichern will--OK.Eigentlich will ich vorher angeben, wo es gespeichert werden soll.
Aber ist das jetzt auch sicher programmiert oder birgt es irgendwelche Gefahren?Sollte ich lieber die Komponente ExcelApllication verwenden, wenn ja was brauche ich noch dazu und wodrauf muss ich achten??

Ohh man das ist wieder viel, aber ich hoffe auf eine Antwort!
Vielen Dank für Eure Mühe
Gruß Spoona

Hansa 24. Mär 2005 20:38

Re: Daten aus InterbaseDB in "vorhandene" Excel-Da
 
Zitat:

Zitat von spoona
Ich möchte gerne Daten aus einer Db in eine vorhandene Excel-Datei schreiben.
Dabei soll die vorhandene Datei als Muster dienen, welches dann mit Daten gefüllt wird.

Inwiefern ist die Datei vorhanden ? Ist sie leer oder was ? Wenn sie leer ist, wieso ist sie dann überhaupt da ? 8) Schätze mal, am einfachsten wäre es, die DB Daten in eine Textdatei zu schreiben. Die erste Zeile enthält dabei die Definitionen, also quasi die Feldnamen. Hatte so was schon mal gemacht. Vielleicht war das aber auch Word. :mrgreen:

spoona 24. Mär 2005 20:42

Re: Daten aus InterbaseDB in "vorhandene" Excel-Da
 
Hallo,

also die Datei ist nicht leer. Es geht darum eine Statistik zu erstellen.
Die Musterdatei ist also bereits formatiert und beinhaltet Spaltennamen.
Eine Textdatei ist da leider nich möglich.
Aber Vielen Dank für deine Antwort.

Gruß Spoona

Hansa 24. Mär 2005 20:57

Re: Daten aus InterbaseDB in "vorhandene" Excel-Da
 
Was ist nicht möglich ? Ich will darauf hinaus, eine Datei zu erstellen aus Interbase heraus, in der die Spaltennamen aus der DB kommen und die Daten auch. Also 1. Zeile Spaltenname und alles dahinter die Daten. Das müßte sich automatisch einlesen und formatieren lassen.

Für XML und ganz sicher Word (Serienbrief) habe ich das schon gemacht. Excel ist nun mal anders, aber doch, das habe ich auch schon gemacht. Das ist auch kein Problem. Desweiteren empfehle ich Dir zu diesem Thema Lemmys Seite : www.delphi-tutorials.de Da ist ein Tuto dabei "Word und Excel Automation" in dem zwar wohl nicht dein Problem beschrieben wird, aber Lemmy sagt schon, worauf es ankommt.

spoona 24. Mär 2005 21:11

Re: Daten aus InterbaseDB in "vorhandene" Excel-Da
 
Also ich wollte nicht sagen, dass es nicht möglich ist.
Nur dass es nicht ist,was ich will bzw. machen MUSS!
Diese Datei muss eben danach weiter verarbeitet werden und dazu wird eben EXCEL benötigt.
Ich gehe jetzt aber davon aus, dass mein Quellcode soweit richtig ist.
Danke für deine Hilfe und deinen Link, den ich mir mal anschauen werde.

Gruß Spoona

Ferber 25. Mär 2005 07:50

Re: Daten aus InterbaseDB in "vorhandene" Excel-Da
 
Hi !
Du machst das alles ganz richtig.
Ein Workbook ist die Datei(.xls), das Worksheet ist das Tabellenblatt.
Starte in Excel den Macrorecorder und führe die Dinge aus die du benötigst, zb Datei unter anderem Namen zu Speichern,
der Macrorecorder schreibt den VBA-Programmtext.
Diesen kann man dann sehr einfach als 'spranze' für das OLE-objekt verwenden.

Wenn Du deinem Prog einen RemoteDatamodul und TypeLibrary hinzufügst kannst Du dieses auch von Excel aus aufrufen und
Dinge realisieren die wirklich sehr nett sind, jedoch für Dein Problem augenblicklich nicht erforderlich.

Excel würde ich folgendermassen starten:
Delphi-Quellcode:
function TExcel.GetApplication:Variant;
begin
  if VarType(FExcelApp)=varEmpty then
  try
    FExcelApp:=GetActiveOleObject('Excel.Application');
    FExcelApp.Visible:=True;
  except
    FExcelApp:=  CreateOleObject('Excel.Application');
    FExcelApp.Visible:=True;
  end;
  Result:=FExcelApp;
end;
falls Du mehr Info brauchts, sag's :wink:

spoona 25. Mär 2005 10:28

Re: Daten aus InterbaseDB in "vorhandene" Excel-Da
 
Hallo,

vielen Dank für deine Antwort, das mit dem Makro konnte mir echt weiterhelfen.
Bin jetzt schlauer. Zumindest weiß ich jetzt, dass ich kein sheet hinzufügen muss, da ich per Default
ja auf dem Ersten arbeite und keine weiteren brauche.Also habe ich folgenden Code realisiert, was auch sehr gut funktioniert:
Delphi-Quellcode:
var Excel: variant;
zeile,spalte:integer;
begin
  Excel := CreateOleObject('Excel.Application');// VIELLEICHT noch in deine Funktion auslagern, ist schöner!
  if FileExists('c:\temp2\test2.xls') then begin
    ShowMessage('File exists!')
    exit;
  end;
  Excel.Workbooks.Add('c:\temp2\Muster.xls');
  zeile:=1;
  TB_Kontengruppe.Open;
  TB_Kontengruppe.First;
  while (not (TB_Kontengruppe.Eof)) do begin
    if TB_KontengruppeNummer.Value > 12 then begin
      Excel.Cells[zeile,1].Value:=TB_KontengruppeBereich.Value;
      Excel.Cells[zeile,2].Value:=TB_KontengruppeNummer.Value-100;
      Excel.Cells[zeile,3].Value:=TB_KontengruppeNummer.Value-200;
      Excel.Cells[zeile,4].Value:=TB_KontengruppeNummer.Value-300;
      inc(zeile);
    end;
    TB_Kontengruppe.Next;
  end;
Excel.ActiveWorkbook.SaveAs('c:\temp2\test2.xls');
Excel.Quit;
Excel := Unassigned;
TB_Kontengruppe.Close;
end;
Wenn ich weitere Fragen habe dann melde ich mich einfach bei Dir.
Vielen Dank
Gruß Spoona


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz