AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Excel speichern

Ein Thema von vesila · begonnen am 11. Jan 2025 · letzter Beitrag vom 16. Jan 2025
Antwort Antwort
vesila

Registriert seit: 11. Jan 2025
Ort: MInden
9 Beiträge
 
Delphi 6 Enterprise
 
#1

Excel speichern

  Alt 11. Jan 2025, 16:57
Hallo liebe Gemeinschaft,

habe beim abspeichern einer Exceldatei aus Delphi6 Schwierigkeiten.
beim Aufruf der Speicherroutine Workbook.saveAs(dateiname) erscheint die Fehlermeldung
Im Projekt ist eine Exception der Klasse EOleError aufgetreten: Meldung 'Variante referenziert kein Automatisierungsobjekt'.Prozefl wurde angehalten.
Auch beim Aufruf der Speicherroutine mit Excel.Workbook.saveAs(dateiname) erscheint die gleiche Fehlermeldung.
Excel und Woorkbook sind global als variant deklariert.
Was läuft da falsch?
  Mit Zitat antworten Zitat
DaCoda

Registriert seit: 21. Jul 2006
Ort: Hamburg
164 Beiträge
 
Delphi 12 Athens
 
#2

AW: Excel speichern

  Alt 11. Jan 2025, 23:12
Ich habe eine kleine Unit als "Helper" für meine Projekte, wo ich Excel-Sheets brauche.
Da kannst du ja mal schauen ob du da was mit anfangen kannst.

Code:
unit tbOfficeUtils;

interface

uses
  Winapi.Windows,
  Winapi.Messages,
  System.SysUtils,
  System.Variants,
  System.Classes,
  Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs,
  Vcl.StdCtrls,
  System.Win.ComObj;

const
  xlWBATChart = -4109;
  xlWBATExcel4IntlMacroSheet = 4;
  xlWBATExcel4MacroSheet = 3;
  xlWBATWorksheet = -4167;

type
  TExcelFile = class(TObject)
  private
    FApplication: OLEVariant;
    FWorkBook: OLEVariant;
    FWorkSheet: OLEVariant;
    FVisible: Boolean;
    FDisplayAlerts: Boolean;
    FActWorkSheetIdx: Integer;

    procedure SetVisible(Visible: Boolean);
    procedure SetDisplayAlerts(DisplayAlerts: Boolean);
  public
    constructor Create; virtual;
    destructor Destroy; override;

    function Open: Boolean;
    procedure Close;
    function ExportFile(FileName: TFileName): Boolean;
    function SelectWorkSheet(Index: Integer): Boolean;
    function AddWorkSheet: Integer;

    property Application: OLEVariant read FApplication;
    property WorkBook: OLEVariant read FWorkBook;
    property WorkSheet: OLEVariant read FWorkSheet write FWorkSheet;
    property Visible: Boolean read FVisible write SetVisible;
    property DisplayAlerts: Boolean read FDisplayAlerts write SetDisplayAlerts;
    property ActWorkSheetIdx: Integer read FActWorkSheetIdx;
  end;

implementation

uses
  tbUtils;

constructor TExcelFile.Create;
begin
  inherited Create;
  FApplication := NULL;
  FWorkBook := NULL;
  FWorkSheet := NULL;
  FVisible := False;
  FDisplayAlerts := False;
end;

destructor TExcelFile.Destroy;
begin
  if not VarIsNull(FWorkSheet) then begin
    FWorkSheet := NULL;
  end;

  if not VarIsNull(FWorkBook) then begin
    FApplication.Workbooks.Close;
    FWorkBook := NULL;
  end;

  if not varIsNull(Fapplication) then begin
    FApplication.Quit;
    FApplication := NULL;
  end;
  inherited Destroy;
end;

function TExcelFile.Open: Boolean;
begin
  Result := False;
  try
    FApplication := CreateOleObject('Excel.Application');
    if not VarIsNull(FApplication) then begin
      if not VarIsNull(FApplication) then begin
        FApplication.Visible := FVisible;
        FApplication.DisplayAlerts := FDisplayAlerts;
        try
          FWorkBook := FApplication.WorkBooks.Add(xlWBATWorksheet);
          if not VarIsNull(FWorkBook) then begin
            Result := True;
          end;
        except
          ErrorDialog('Die Arbeitsmappe konnte nicht erzeugt werden!');
          FWorkBook := NULL;
        end;
      end;
    end;
  except
    FApplication := NULL;
    ErrorDialog('Excel konnte nicht geöffnet werden!');
  end;
end;

function TExcelFile.AddWorkSheet: Integer;
begin
  Result := -1;
  if not VarIsNull(WorkBook) then begin
    Workbook.Worksheets.Add(After := Workbook.Worksheets[Workbook.Worksheets.Count]);
    Result := Workbook.Worksheets.Count;
  end;
end;

function TExcelFile.SelectWorkSheet(Index: Integer): Boolean;
begin
  Result := False;
  WorkSheet := WorkBook.Sheets[Index];
  if not VarIsNull(WorkSheet) then begin
    WorkSheet.Activate;
    FActWorkSheetIdx := Index;
    Result := True;
  end;
end;

function TExcelfile.ExportFile(FileName: TFileName): Boolean;
begin
  Result := False;
  if not VarIsNull(FWorkBook) then begin
    try
      SelectWorkSheet(1);
      FWorkbook.SaveAs(FileName);
      Result := True;
    except
      ErrorDialog('Die Arbeitsmappe: ' + QuotedStr(FileName) + ' konnte nicht gespeichert werden!');
    end;
  end;
end;

procedure TExcelFile.Close;
begin
  if not VarIsNull(FWorkSheet) then begin
    FWorkSheet := NULL;
  end;

  if not VarIsNull(FWorkBook) then begin
    FApplication.Workbooks.Close;
    FWorkBook := NULL;
  end;

  if not varIsNull(Fapplication) then begin
    FApplication.Quit;
    FApplication := NULL;
  end;
end;

procedure TExcelfile.SetVisible(Visible: Boolean);
begin
  FVisible := Visible;
end;

procedure TExcelFile.SetDisplayAlerts(DisplayAlerts: Boolean);
begin
  FDisplayAlerts := DisplayAlerts;
end;

end.
Benutzen kann man es Beispielsweise so:

Code:
procedure TForm1.btnTestClick(Sender: TObject);
var
  Excel: TExcelFile;
begin
  Excel := TExcelFile.Create;
  try
    with Excel do begin
      Visible := False;
      DisplayAlerts := False;
      if Open then begin
        if SelectWorkSheet(1) then begin
          WorkSheet.Name := 'Erstes Blatt';
          WorkSheet.Columns.Columns[1].ColumnWidth := 150;
          WorkSheet.Cells[1, 1] := 123.456;
          WorkSheet.Cells[1, 1].NumberFormat := '0,00';
          WorkSheet.Cells[2, 1] := 456;
          WorkSheet.Cells[3, 1] := 123;
          WorkSheet.Cells[1, 3] := 'Erstes Blatt';

          WorkSheet.Cells[1, 1].Interior.Color := clRed;
          WorkSheet.Cells[2, 1].Interior.Color := clLime;
          WorkSheet.Cells[3, 1].Interior.Color := clYellow;

          WorkSheet.Cells[1, 1].Font.Name := 'Arial';
          WorkSheet.Cells[1, 1].Font.Size := 20;
          WorkSheet.Cells[1, 1].Font.Bold := True;
          WorkSheet.Cells[1, 1].Font.Color := clYellow;

          WorkSheet.Range['A6', 'A6'].Formula := '=Sum(A1:A3)';

          if AddWorkSheet > -1 then begin;
            if SelectWorkSheet(2) then begin
              Worksheet.Name := 'Zweites Blatt';
              WorkSheet.Cells[1, 5] := 0.815;
              WorkSheet.Cells[1, 5].NumberFormat := '0,00';
              WorkSheet.Cells[1, 5].Font.Name := 'Aial';
              WorkSheet.Cells[1, 5].Font.Size := 6;
              WorkSheet.Cells[1, 5].Font.Bold := True;
              WorkSheet.Cells[1, 5].Font.Color := clRed;

              WorkSheet.Cells[2, 5] := 311264;
              WorkSheet.Cells[3, 5] := 270664;
              WorkSheet.Cells[1, 3] := 'Zweites Blatt';
              WorkSheet.Cells[1, 1].Interior.Color := clMaroon;
              WorkSheet.Cells[2, 1].Interior.Color := clGray;
              WorkSheet.Cells[3, 1].Interior.Color := clWhite;
            end;
          end;
        end;
        ExportFile(System.SysUtils.ExtractFilePath(Vcl.Forms.Application.ExeName) + 'Produktionsberichte.xlsx');
        Close;
      end;
    end;
  finally
    FreeAndNil(Excel);
  end;
end;
Debuggers don’t remove bugs, they only show them in slow-motion.
  Mit Zitat antworten Zitat
vesila

Registriert seit: 11. Jan 2025
Ort: MInden
9 Beiträge
 
Delphi 6 Enterprise
 
#3

AW: Excel speichern

  Alt 12. Jan 2025, 18:09
Guten Abend DaCoda,

vielen Dank für die umfangreiche Unterstützung.
In meiner Delphi Version fehlen die in der uses Anweisung aufgeführten Komponenten bzw die dcu Dateien.
Kann ich mit einer anderen Schreibweise das Problem lösen also statt Winapi.Windows nur Windows, denn diese
sind in der Library vorhanden.
Desweiteren wird eine Unit tbUtils benötigt. wo kann ich die finden .

Viele Grüße und noch einen schönen Sonntag
vesil
  Mit Zitat antworten Zitat
DaCoda

Registriert seit: 21. Jul 2006
Ort: Hamburg
164 Beiträge
 
Delphi 12 Athens
 
#4

AW: Excel speichern

  Alt 12. Jan 2025, 18:29
Durch eine andere Schreibweise, wie zum Beispiel Windows, statt Winapi.Windows müsste es gehen. Die tbUtils werden im Beispiel nicht gebraucht, kannst du weglöschen.

Gutes Gelingen...

LG
Thorsten
Debuggers don’t remove bugs, they only show them in slow-motion.
  Mit Zitat antworten Zitat
vesila

Registriert seit: 11. Jan 2025
Ort: MInden
9 Beiträge
 
Delphi 6 Enterprise
 
#5

AW: Excel speichern

  Alt 14. Jan 2025, 19:19
Guten Abend DaCoda,

ich habe die Anwendung in einem separaten Projekt getestet und wie zu erwarten,
funtioniert sie.

Die unit tbofficeUtils habe ich dann in meine Anwendung eingebunden und entsprechend zugewiesen var ExcFile: TExcelFile; um auf die Prozeduren zugreifen zu können.

Mit nachfolender Prozedur lese ich die Exceltabelle ein.
procedure TVermkal.DateiOeffnenAccept(Sender: TObject);
var
DatSatzname :String;
begin
DatSatzName := DateiOeffnen.Dialog.FileName;
Statbar(DatSatzName);
excel := CreateOleObject('Excel.Application');// Excel ˆffnen
wb := excel.Workbooks.Open(DatSatzName);
excel.visible :=true;
ladeflg:= true;
testpfad :=DatSatzName;
end;


Mit dieser Prozedur will die aktualisierte Datei speichern

procedure TVermkal.SpeichernAccept(Sender: TObject);

begin
testpfad:=Speichern.Dialog.FileName;
Excfile.ExportFile(testpfad);
end;

In der Zeile if not VarIsNull(FWorkbook) then begin

wird eine Exception der Klasse EAccessViolation aufgerufen
Zugriffsverletzung an Adresse xxxx Lesen von Adresse xxxx.

Wie muss ich den Aufruf Excfile.ExportFile(testpfad); in die
SpeichernAccept Prozedur einbinden.

Viele Grüße und einen schönen Wochenanfang
Vesila
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.484 Beiträge
 
Delphi 12 Athens
 
#6

AW: Excel speichern

  Alt 15. Jan 2025, 10:10
FWorkBook wird nicht korrekt zugewiesen.
Delphi-Quellcode:
FWorkBook := FApplication.WorkBooks.Add(xlWBATWorksheet);
..
Ersetzen durch
Delphi-Quellcode:
{fügt das neue WorkBook am Anfang der Liste ein:}
FApplication.WorkBooks.Add(xlWBATWorksheet);
FWorkBook := FApplication.Workbooks[1];
..
  Mit Zitat antworten Zitat
DaCoda

Registriert seit: 21. Jul 2006
Ort: Hamburg
164 Beiträge
 
Delphi 12 Athens
 
#7

AW: Excel speichern

  Alt 16. Jan 2025, 08:51
So wie Blup schrieb. Hast du einfach nur die korrekte Zuweisung vergessen.

Und ein paar TRY...EXCEPT Blöcke für die Fehlerbehandlung wären auch gut...

Viel Erfolg mit deinem Projekt.

LG
Thorsten
Debuggers don’t remove bugs, they only show them in slow-motion.
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 06:20 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