AGB  ·  Datenschutz  ·  Impressum  







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

ExcelExport löst einen Fehler aus

Ein Thema von Ykcim · begonnen am 14. Jan 2014 · letzter Beitrag vom 15. Jan 2014
Antwort Antwort
Seite 1 von 2  1 2      
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
828 Beiträge
 
Delphi 10.4 Sydney
 
#1

ExcelExport löst einen Fehler aus

  Alt 14. Jan 2014, 10:45
Hallo Zusammen,

ich habe unter Delphi xe2 mit diesem Objekt einen Excel-Export realisiert. Jetzt muss ich ein Programm unter Delphi 2009 Prof. schreiben und bekomme den ExcelExport nicht ans Laufen...

 FExcelApp := CreateOleObject('Excel.Application'); Hier wird ein Fehler ausgelöst mit der Nachricht, dass es eine Zugriffsverletzung gegeben hat. Sieht einer, was ich falsch mache?

Vielen Dank

Patrick



Delphi-Quellcode:
unit TExcelExportUnit;

interface

uses SysUtils, Variants, Dialogs, Grids, BaseGrid, AdvGrid, ShlObj, ComObj, Math;

type
   TExcelExport = class
      strict protected
         FExcelApp: OleVariant;
         FWorkbook: OleVariant;
         FWorksheet: OleVariant;
         FRange: OleVariant;
         FData: OleVariant;
         FValue: OleVariant;
         FMaxCol, FMaxRow: integer;
      public
         constructor OpenTemp(Pfad:string);
         procedure exportieren(StringGrid : TStringGrid; Pfad:string; Space:integer);
         function RefToCell(Col, Row, Space : Integer) : string;
         function GetExcelApp: OleVariant;
         function GetWorkbook: OleVariant;
         function GetWorksheet: OleVariant;
         function GetRange: OleVariant;
         function GetData: OleVariant;
         function GetValue: OleVariant;
         function GetMaxCol: integer;
         function GetMaxRow: integer;
         procedure SetExcelApp;
         procedure SetWorkbook;
         procedure SetWorksheet;
         procedure SetRange;
         procedure SetData;
         procedure SetValue;
         procedure SetMaxCol(val: integer);
         procedure SetMaxRow(val: integer);
         procedure SaveDokument(Pfad: string);
         property ExcelApp: OleVariant read GetExcelApp;
         property Workbook: OleVariant read GetWorkbook;
         property Worksheet: OleVariant read GetWorksheet;
         property Range: OleVariant read GetRange;
         property Data: OleVariant read GetData;
         property Value: OleVariant read GetValue;
         property MaxCol: integer read GetMaxCol write SetMaxCol;
         property MaxRow: integer read GetMaxRow write SetMaxRow;
   end;

var ExportGrid: TExcelExport;

implementation

function StringToVariant(const SourceString : string) : Variant;
var
  FloatValue : Extended;
begin
  if TryStrToFloat(SourceString, FloatValue) then
    Result := FloatValue
  else
    Result := SourceString;
end;

constructor TExcelExport.OpenTemp(Pfad:string);
var Row, Col: integer;
begin
   //Verbindung zu Excel herstellen
   FExcelApp := CreateOleObject('Excel.Application');
   try
      if not VarIsNull(FExcelApp) then begin
         //Neues FWorkbook öffnen
         FWorkbook :=FExcelApp.Workbooks.open(pfad);
         if VarIsNull(FWorkbook) then
            showmessage('Datei konnte nicht geöffnet werden.');
      end;
   Finally

   end;
end;

procedure TExcelExport.SaveDokument(Pfad: string);
begin
   FExcelApp.ActiveWorkbook.SaveAs(Pfad);
end;


//Inhalt eines TStringGrid nach Excel exportieren
procedure TExcelExport.exportieren(StringGrid : TStringGrid; Pfad:string; Space:integer);
var Row, Col: integer;
begin
  //Verbindung zu Excel herstellen
  FExcelApp := CreateOleObject('Excel.Application');
  try
    if not VarIsNull(FExcelApp) then
    begin
      //Neues FWorkbook öffnen
      FWorkbook :=FExcelApp.Workbooks.open(pfad);
      if not VarIsNull(FWorkbook) then
      begin
        //Maximalen Bereich bestimmen
        FMaxCol := Min(StringGrid.ColCount, FExcelApp.Columns.Count);
        FMaxRow := Min(StringGrid.RowCount, FExcelApp.Rows.Count);
        if (FMaxRow > 0) and (FMaxCol > 0) then
        begin
          //FWorksheet auswählen
          FWorksheet := FWorkbook.ActiveSheet;
          //Bereich auswählen
          FRange := FWorksheet.Range[RefToCell(1, 1, Space), RefToCell(FMaxCol, FMaxRow, Space)];
          if not VarIsNull(FRange) then
          begin
            //Daten aus Grid holen
            FData := VarArrayCreate([1, FMaxRow, 1, FMaxCol], varVariant);
            for Row := 0 to Pred(FMaxRow) do
            begin
              for Col := 0 to Pred(FMaxCol) do
              begin
                FValue := StringToVariant(StringGrid.Cells[Col, Row]);
                FData[Succ(Row), Succ(Col)] := FValue
              end;
            end;
            //Daten dem Excelsheet übergeben
            FRange.Value := FData;
            //Excel anzeigen
            {FWorkbook.Activate;
            FExcelApp.Visible := True;}

          end;
        end;
      end;
    end;
  finally
    //FValue := UnAssigned;
    FData := UnAssigned;
    //FRange := UnAssigned;
    //FWorkbook := UnAssigned;
    //FExcelApp := UnAssigned;
  end;
end;

function TExcelExport.RefToCell(Col, Row, Space : Integer) : string;
var
  Pos : Integer;
begin
  //Spalte bestimmen
  Result := '';
  while Col > 0 do
  begin
    Pos := Col mod 26;
    if Pos = 0 then
    begin
      Pos := 26;
      Dec(Col);
    end;
    Result := Chr(Ord('A') + Pos -1) + Result;
    Col := Col div 26;
  end;
  //Spalte und Zeile zusammenführen
  Result := Result + IntToStr(Row+Space);
end;

function TExcelExport.GetExcelApp;
begin
   Result:=FExcelApp;
end;

function TExcelExport.GetWorkbook;
begin
   Result:=FWorkbook;
end;

function TExcelExport.GetWorksheet;
begin
   Result:=FWorksheet;
end;

function TExcelExport.GetRange;
begin
   Result:=FRange;
end;

function TExcelExport.GetData;
begin
   Result:=FData;
end;

function TExcelExport.GetValue;
begin
   Result:=FValue;
end;

function TExcelExport.GetMaxCol;
begin
   Result:=FMaxCol;
end;

function TExcelExport.GetMaxRow;
begin
   Result:=FMaxRow;
end;

procedure TExcelExport.SetExcelApp;
begin
   FExcelApp:=UnAssigned;
end;

procedure TExcelExport.SetWorkbook;
begin
   FWorkBook:=UnAssigned;
end;

procedure TExcelExport.SetWorksheet;
begin
   FWorksheet:=UnAssigned;
end;

procedure TExcelExport.SetRange;
begin
   FRange:=UnAssigned;
end;

procedure TExcelExport.SetData;
begin
   FData:=UnAssigned;
end;

procedure TExcelExport.SetValue;
begin
   FValue:=UnAssigned;
end;

procedure TExcelExport.SetMaxCol(val: integer);
begin
   FMaxCol:= val;
end;

procedure TExcelExport.SetMaxRow(val: integer);
begin
   FMaxRow:= val;
end;


initialization
   ExportGrid := TExcelExport.Create;

finalization
   if ExportGrid <> nil then
      ExportGrid.Free;
end.
Patrick
  Mit Zitat antworten Zitat
GHorn

Registriert seit: 24. Mär 2009
Ort: NRW
124 Beiträge
 
#2

AW: ExcelExport löst einen Fehler aus

  Alt 14. Jan 2014, 11:05
Ich mache das i.d.R. so:

Delphi-Quellcode:
 
     try
        XLApp := GetActiveOleObject('Excel.Application');
      except
        XLApp := CreateOleObject('Excel.Application');
      end;
Gruß
Gerald
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
828 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: ExcelExport löst einen Fehler aus

  Alt 14. Jan 2014, 11:11
Habe ich versucht, aber er löst auch bei

FExcelApp := GetActiveOleObject('Excel.Application'); den Fehler aus...

Gruß Patrick
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#4

AW: ExcelExport löst einen Fehler aus

  Alt 14. Jan 2014, 11:19
Aber "ExcelExport" gibt es schon?

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
828 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: ExcelExport löst einen Fehler aus

  Alt 14. Jan 2014, 11:28
Das Objekt wird erstellt, die Software lässt sich problemlos compilieren, der Fehler tritt nur auf, wenn ich die Export-Funktion auslöse...
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

AW: ExcelExport löst einen Fehler aus

  Alt 14. Jan 2014, 11:33
Teste doch mal mit einem von Delphi unabhängigen System:
Folgenden Code in einer *.vbs-Datei speichern und mit Doppelklick starten
Code:
Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open("C:\test.xls")
fork me on Github
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
828 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: ExcelExport löst einen Fehler aus

  Alt 14. Jan 2014, 11:38
passiert nichts - Datei wurde erstellt, Exceldatei wurde erstellt und an den angegebenen Ort gelegt. Aber wenn ich die vbs Datei starte, passiert nichts.
Patrick
  Mit Zitat antworten Zitat
GHorn

Registriert seit: 24. Mär 2009
Ort: NRW
124 Beiträge
 
#8

AW: ExcelExport löst einen Fehler aus

  Alt 14. Jan 2014, 11:48
Im Constructor rufst OpenTemp(..) auf und startest CreateOleObject(..).
Das gleiche machst aber in der procedure exportieren(..) ohne FExelApp
frei zu geben. Oder wie ist die Aufrufreihenfolge?
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
828 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: ExcelExport löst einen Fehler aus

  Alt 15. Jan 2014, 10:33
Hallo Zusammen,

@GHorn: Du warst genau auf dem richtigen Weg!

Ich habe in der anderen Software das Objekt zu der Klasse erst in der Prozedure erstellt. Jetzt wird das Objekt aber schon erstellt, wenn die Klasse eingebunden wird. Das bedeutete, dass OpenTemp gar nicht mehr ausgeführt wurde...

Ich habe das jetzt das Ganze so umgebuat und es funktioniert...

Delphi-Quellcode:
unit TExcelExportUnit;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComObj, Grids, AdvObj, BaseGrid, Math,
      AdvGrid;

type
   TExcelExport = class
      strict protected
         FExcelApp: OleVariant;
         FWorkbook: OleVariant;
         FWorksheet: OleVariant;
         FRange: OleVariant;
         FData: OleVariant;
         FValue: OleVariant;
         FMaxCol, FMaxRow: integer;
      public
         procedure OpenTemp(Pfad:string);
         procedure exportieren(StringGrid : TStringGrid; Pfad:string; Space:integer);
         function RefToCell(Col, Row, Space : Integer) : string;
         function GetExcelApp: OleVariant;
         function GetWorkbook: OleVariant;
         function GetWorksheet: OleVariant;
         function GetRange: OleVariant;
         function GetData: OleVariant;
         function GetValue: OleVariant;
         function GetMaxCol: integer;
         function GetMaxRow: integer;
         procedure SetExcelApp;
         procedure SetWorkbook;
         procedure SetWorksheet;
         procedure SetRange;
         procedure SetData;
         procedure SetValue;
         procedure SetMaxCol(val: integer);
         procedure SetMaxRow(val: integer);
         procedure SaveDokument(Pfad: string);
         property ExcelApp: OleVariant read GetExcelApp;
         property Workbook: OleVariant read GetWorkbook;
         property Worksheet: OleVariant read GetWorksheet;
         property Range: OleVariant read GetRange;
         property Data: OleVariant read GetData;
         property Value: OleVariant read GetValue;
         property MaxCol: integer read GetMaxCol write SetMaxCol;
         property MaxRow: integer read GetMaxRow write SetMaxRow;
   end;

var ExportGrid: TExcelExport;

implementation

function StringToVariant(const SourceString : string) : Variant;
var
  FloatValue : Extended;
begin
  if TryStrToFloat(SourceString, FloatValue) then
    Result := FloatValue
  else
    Result := SourceString;
end;

procedure TExcelExport.OpenTemp(Pfad:string);
begin
   //Verbindung zu Excel herstellen
   try
      FExcelApp := GetActiveOleObject('Excel.Application');
   except
      FExcelApp := CreateOleObject('Excel.Application');
   end;
end;

procedure TExcelExport.SaveDokument(Pfad: string);
begin
   FExcelApp.ActiveWorkbook.SaveAs(Pfad);
end;


//Inhalt eines TStringGrid nach Excel exportieren
procedure TExcelExport.exportieren(StringGrid : TStringGrid; Pfad:string; Space:integer);
var Row, Col: integer;
begin
  //Verbindung zu Excel herstellen
   OpenTemp(Pfad);
   try
    if not VarIsNull(FExcelApp) then
    begin
      //Neues FWorkbook öffnen
      FWorkbook :=FExcelApp.Workbooks.open(pfad);
      if not VarIsNull(FWorkbook) then
      begin
        //Maximalen Bereich bestimmen
        FMaxCol := Min(StringGrid.ColCount, FExcelApp.Columns.Count);
        FMaxRow := Min(StringGrid.RowCount, FExcelApp.Rows.Count);
        if (FMaxRow > 0) and (FMaxCol > 0) then
        begin
          //FWorksheet auswählen
          FWorksheet := FWorkbook.ActiveSheet;
          //Bereich auswählen
          FRange := FWorksheet.Range[RefToCell(1, 1, Space), RefToCell(FMaxCol, FMaxRow, Space)];
          if not VarIsNull(FRange) then
          begin
            //Daten aus Grid holen
            FData := VarArrayCreate([1, FMaxRow, 1, FMaxCol], varVariant);
            for Row := 0 to Pred(FMaxRow) do
            begin
              for Col := 0 to Pred(FMaxCol) do
              begin
                FValue := StringToVariant(StringGrid.Cells[Col, Row]);
                FData[Succ(Row), Succ(Col)] := FValue
              end;
            end;
            //Daten dem Excelsheet übergeben
            FRange.Value := FData;
            //Excel anzeigen
            {FWorkbook.Activate;
            FExcelApp.Visible := True;}

          end;
        end;
      end;
    end;
  finally
    //FValue := UnAssigned;
    FData := UnAssigned;
    //FRange := UnAssigned;
    //FWorkbook := UnAssigned;
    //FExcelApp := UnAssigned;
  end;
end;

function TExcelExport.RefToCell(Col, Row, Space : Integer) : string;
var
  Pos : Integer;
begin
  //Spalte bestimmen
  Result := '';
  while Col > 0 do
  begin
    Pos := Col mod 26;
    if Pos = 0 then
    begin
      Pos := 26;
      Dec(Col);
    end;
    Result := Chr(Ord('A') + Pos -1) + Result;
    Col := Col div 26;
  end;
  //Spalte und Zeile zusammenführen
  Result := Result + IntToStr(Row+Space);
end;

function TExcelExport.GetExcelApp;
begin
   Result:=FExcelApp;
end;

function TExcelExport.GetWorkbook;
begin
   Result:=FWorkbook;
end;

function TExcelExport.GetWorksheet;
begin
   Result:=FWorksheet;
end;

function TExcelExport.GetRange;
begin
   Result:=FRange;
end;

function TExcelExport.GetData;
begin
   Result:=FData;
end;

function TExcelExport.GetValue;
begin
   Result:=FValue;
end;

function TExcelExport.GetMaxCol;
begin
   Result:=FMaxCol;
end;

function TExcelExport.GetMaxRow;
begin
   Result:=FMaxRow;
end;

procedure TExcelExport.SetExcelApp;
begin
   FExcelApp:=UnAssigned;
end;

procedure TExcelExport.SetWorkbook;
begin
   FWorkBook:=UnAssigned;
end;

procedure TExcelExport.SetWorksheet;
begin
   FWorksheet:=UnAssigned;
end;

procedure TExcelExport.SetRange;
begin
   FRange:=UnAssigned;
end;

procedure TExcelExport.SetData;
begin
   FData:=UnAssigned;
end;

procedure TExcelExport.SetValue;
begin
   FValue:=UnAssigned;
end;

procedure TExcelExport.SetMaxCol(val: integer);
begin
   FMaxCol:= val;
end;

procedure TExcelExport.SetMaxRow(val: integer);
begin
   FMaxRow:= val;
end;


initialization
   ExportGrid := TExcelExport.Create;

finalization
   if ExportGrid <> nil then
      ExportGrid.Free;
end.
Vielen Dank

Patrick
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#10

AW: ExcelExport löst einen Fehler aus

  Alt 15. Jan 2014, 10:36
Zitat:
Delphi-Quellcode:
if ExportGrid <> nil then
      ExportGrid.Free;
Das ist zwar nicht falsch, aber auch nicht notwendig. Free prüft intern bereits auf nil, so dass man das nicht selbst machen muss. Und das ist im übrigen auch der Grund, weshalb man zur Freigabe immer Free verwenden soll statt Destroy.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  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 16:17 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