Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi StringGrid & Excel (https://www.delphipraxis.net/108774-stringgrid-excel.html)

BarcB 19. Feb 2008 13:07


StringGrid & Excel
 
Ich habe diesen Post bereits gelesen:
http://www.delphipraxis.net/internal...ct.php?t=43640

bisheriger Code:
Delphi-Quellcode:
procedure ExcelFuellen;
var
  Excel : Variant;
begin
  Excel := CreateOleObject('Excel.Application');
  Excel.Application.SheetsInNewWorkBook := 8; //Die 8 is die Anzahl der Sheets
  Excel.Workbooks.Add;
  Excel.Sheets.Add; //einen neuen Sheet hinzufügen
  Excel.Sheets[1].Name := 'DP Sheet'; //Hierbei ist 1 das erste Sheet 2 das zweite usw.
  Excel.Visible := true;
  Excel := unassigned; // Frage: was bedeutet das?
end;
Jetzt würde ich gern einen Button haben, der immer bei einem Klick, in das offene Excel eine Zeile bzw einen Wert an der angegebenen Stelle im offenen Excel Dokument hinzufügt. Leider habe ich es nur geschafft beim Aufruf von Excel Werte zu übergeben.
Ist dies auch anders möglich?


Danke

Chemiker 19. Feb 2008 18:06

Re: StringGrid & Excel
 
Hallo BarcB;

Unter TForm die Variable deklarieren:

Delphi-Quellcode:
 private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    Excel: Variant;
Und dann einfach unter ButtonClick schreiben:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
  Excel.Worksheets['Tabelle1'].Activate;
  Excel.cells[10,20]:= 'Testausgabe';
end;
Bis bald Chemiker

sirius 19. Feb 2008 18:13

Re: StringGrid & Excel
 
Zitat:

Zitat von BarcB
Delphi-Quellcode:
 Excel := unassigned; // Frage: was bedeutet das?

Objekt löschen. Zumindest deinen Instanzzeige aufgeben
Bei einer "richtigen" Klasse würde man Excel.free aufrufen.

Chemiker 19. Feb 2008 18:29

Re: StringGrid & Excel
 
Hallo,

wenn das aufrufende Programm geschlossen wird, sollt man Excel auch schließen. Für diesen Fall würde ich diesen Code empfehlen.

Delphi-Quellcode:
procedure TForm1.FormDestroy(Sender: TObject);
begin
  if not VarIsEmpty(Excel) then
  begin
    Excel.DisplayAlerts:= FALSE;
    Excel.Quit;
    Excel := Unassigned;
  end;
end;
Bis bald Chemiker

BarcB 19. Feb 2008 18:34

Re: StringGrid & Excel
 
sorry wurde ja beantwortet

Chemiker 19. Feb 2008 18:40

Re: StringGrid & Excel
 
Hallo,

Delphi – Hilfe benutzen, „Unassigned“ markieren und STRG-F1 Taste drücken.

Excel.Visible := true;
Excel := unassigned;

In dieser Kombination ist das Blödsinn, weil Du danach keinen Zugriff auf Excel mehr hast.

Bis bald Chemiker

BarcB 19. Feb 2008 19:22

Re: StringGrid & Excel
 
Super, dass funktioniert schonmal richtig gut!

Nun noch eine Frage: Wenn man aus Delphi Excel zum speichern bringen will
"Excel.ActiveWorkbook.SaveAs('daten.xls');"

dann speichert Excel die Datei im voreingestellten Speicherordner für Excel Dateien, bei mir Eigene Dateien.
Ich möchte die Datei aber gern im selben Verzeichnis, wie in dem das Programm läuft, speichern.

Chemiker 19. Feb 2008 19:54

Re: StringGrid & Excel
 
Hallo,

mit

Ordner:= ExtractFilePath(ParamStr(0));

Bis bald Chemiker

BarcB 19. Feb 2008 20:33

Re: StringGrid & Excel
 
Vielen Dank erstmal, hat mir alles sehr geholfen!
Bis zu nächsten Frage!

BarcB 29. Feb 2008 17:42

Re: StringGrid & Excel
 
Empfiehlt es sich die Excel Verbindung mit
Excel := CreateOleObject('Excel.Application');
aufzubauen oder lieber gleich die TExcelApplication Komponente nutzen?

Wenn ich jetzt ein bestehendes Excel Dokument laden möchte, wie stellt man am besten die Verbindung zu diesem her?

Chemiker 1. Mär 2008 01:00

Re: StringGrid & Excel
 
Hallo BarcB,

das sind zwei Verschiedene Möglichkeiten.

Excel := CreateOleObject('Excel.Application'); späte Bindung

Mit der Komponente TExcelApplication baute man eine frühe Bindung auf.

Mit beiden Verfahren ist es möglich eine bestehendes Excel – Dokument zu laden.

Beide Verfahren haben ihre Vor- und Nachteile.

Mit TExcelApplication (frühen Bindung)
Vorteil: schneller, Fehlerprüfung beim Compilieren, Programmierhilfe vorhanden.
Nachteil: Der entsprechende Automations-Server Excel muss auf dem Entwicklungsrechner
vorhanden sei. (Für mich persönlich der größte Nachteil)
Man muss mehr Quell – Code schreiben.

Welches Verfahren man nun benutzt hängt nun davon ab was man damit machen will.

In den meisten Fällen ist die frühre Bindung zu bevorzugen.


Bis bald Chemiker

BarcB 1. Mär 2008 13:46

Re: StringGrid & Excel
 
Also einmal muss ich beim start des Programms Excel öffnen, den Inhalt auslesen und danach kann Excel eigtl wieder geschlossen werden.

Beim zweiten Programm muss Excel gestartet werden und solange das Programm läuft muss auch Excel offen bleiben.

Hier (oder in beiden Fällen!?) empfiehlt sich dann wohl die Komponente.

Chemiker 1. Mär 2008 16:16

Re: StringGrid & Excel
 
Hallo BarcB,

ist mit späte und frühe Bindung möglich.

Da fällt mir noch ein Nachteil für die frühe Bindung ein. Es haben sich bei machen Excel – Versionen die Parameter – Anzahl von einigen Befehle geändert z.B. beim Excel.Workbooks.Open, sind es bei ExcelXP 16 Parameter, bei älteren Versionen ist die Anzahl der Parameter aber geringer.

Bis bald Chemiker

BarcB 1. Mär 2008 16:20

Re: StringGrid & Excel
 
Zitat:

Wenn ich jetzt ein bestehendes Excel Dokument laden möchte, wie stellt man am besten die Verbindung zu diesem her?
Die Frage ist trotzdem noch offen! :)

Nehmen wir es einfach für eine späte Bindung!


okay jetzt hab ichs selber :)

Delphi-Quellcode:
 
    Excel := CreateOleObject('Excel.Application');
  Excel.Workbooks.Open(ExtractFilePath(ParamStr(0))+'Kontenliste\konten.xls');
  Excel.Visible := true;

toms 1. Mär 2008 16:41

Re: StringGrid & Excel
 
Zitat:

Zitat von BarcB
und solange das Programm läuft muss auch Excel offen bleiben.

Das ist gar nicht so einfach dies sicher zu stellen.
Was genau hast du denn vor?

BarcB 1. Mär 2008 16:44

Re: StringGrid & Excel
 
Ich werde aus Excel Informationen entnehmen und gleichzeitig auch wieder speichern.

Mal ne andere Frage, wenn ich 2 Forms habe und in Form1 die Verbindung mit Excel hergestellt wird, kann man dann in Form2 auch darauf zugreifen?

Chemiker 1. Mär 2008 16:46

Re: StringGrid & Excel
 
Hallo BarcB,

mit z.B.:

Delphi-Quellcode:
Excel.Workbooks.Open (DateiName);
Bis bald Chemiker

Chemiker 1. Mär 2008 16:58

Re: StringGrid & Excel
 
Hallo BarcB,

warum soll das nicht gehen?

Es muss nur sichergestellt sein das Form2, die Excel – Variable bekannt ist.

Warum willst Du Excel ständig offen halten?

Es ist doch ohne Probleme möglich z.B.
1. Excel zu starten
2. Excel – Datei laden
3. Excel – Werte zu verarbeiten
4. Excel wieder schließen evt. Vorher die Excel – Datei speichern.

Bis bald Chemiker

BarcB 1. Mär 2008 17:04

Re: StringGrid & Excel
 
Weil ich dann nur am öffnen/schließen bin.

Die Daten werden über Netzwerk und Internet ständig aktualisiert und ich möchte diese möglichst 'Live' in diese Datei speichern.

Chemiker, wie mach Form2 die Excel Variable bekannt?
Unit2.Excel := Unit1.Excel;

habs :D

grenzgaenger 1. Mär 2008 17:26

Re: StringGrid & Excel
 
Zitat:

Zitat von BarcB
Weil ich dann nur am öffnen/schließen bin.

Die Daten werden über Netzwerk und Internet ständig aktualisiert und ich möchte diese möglichst 'Live' in diese Datei speichern.

Chemiker, wie mach Form2 die Excel Variable bekannt?
Unit2.Excel := Unit1.Excel;

habs :D

<hellhörig werd> was sind denn das für daten, wie häufig aktualiseren sich diese und in welchem format kommen diese an?

die erfahrung hat gezeigt, dass z.b. EXCEL öfters die daten zerschiesst. falls es etwas wichtiges ist, könntest du deine auswertungen vergessern.

in so einem falle, zwischenspeichern und erst bei bedarf ans EXCEL übertragen. da ist es dann auch nicht problematisch wenn EXCEL abschmiert und nur noch datenschrott hinterlässt :-)

BarcB 1. Mär 2008 17:36

Re: StringGrid & Excel
 
Is ja für schule..

BarcB 2. Mär 2008 10:46

Re: StringGrid & Excel
 
Und noch ne Frage.
Wie kopiert man ein Sheet innerhalb eines Workbooks?
Wenn ich eins kopieren will erstellt er immer ein neues Workbook. Sad

Chemiker 2. Mär 2008 14:03

Re: StringGrid & Excel
 
Hallo BarcB,

ich kann grenzgaenger nur beipflichten ich würde so etwas, ohne Excel machen mit den Biff – Format.

Zitat:

Chemiker, wie mach Form2 die Excel Variable bekannt?
Du kannst z.B. die Excel – Variable im MainForm (Hauptformular) als globale Variable hinterlegen, dann ist die Variable Excel auch in andere Units bekannt.

Zitat:

Und noch ne Frage.
Wie kopiert man ein Sheet innerhalb eines Workbooks?
Wenn ich eins kopieren will erstellt er immer ein neues Workbook. Sad
Normalerweise wird es im Forum gerne gesehen, dass für jede Frage ein eigener Beitrag erstellt wird.

Etwas Hintergrund – Information:

Das oberste Objekt der Hierarchie in Excel ist die Excel – Applikation. Eine Ebene tiefer sind die Workbooks (Arbeitsmappen), dann folgt wieder eine Stufe tiefer die Sheets (Tabellenblätter) usw.
Abhängig von der verwendeten Methode (z.B. .Add) kannst Du ein Diagramm, -Makro- oder Tabellenblatt oder nur Tabellenblätter (Worksheets- Auflistung) hinzufügen.
Arbeitsmappen müssen in der Regel explizit angesprochen werden, wenn mehrere davon offen sind und nur eine bestimmte davon etwas ausführen soll.

Das bedeutet in Deinem Fall, dass eine OleVariabel verwendet wird, um die spezielle Arbeitsmappe (Workbook) anzusprechen.

Delphi-Quellcode:
WB:= Excel.Workbooks.Open (ExcelMappDateiName); // WB= Workbook als OleVariabel
WB ist jetzt die Arbeitsmappe mit der Du was ausführen willst.

Delphi-Quellcode:
WB.Worksheets[1].copy (Before:=WB.Worksheets[1]);
Das erste Tabellenblatt in der Arbeitsmappe die zuvor geladen worden ist, wird kopiert und die Kopie wird vor dem Original Arbeitsblatt eingetragen.

Delphi-Quellcode:
WB.ActiveSheet.Name := 'Kopie';
Das kopierte Arbeitsblatt ist jetzt aktiv und wird mit einem Namen versehen. Das kopierte Arbeitsblatt hat den Name ‚Kopie’.

Bis bald Chemiker


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:08 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-2025 by Thomas Breitkreuz