AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein ExcelApplication in Delphi xe2 starter
Thema durchsuchen
Ansicht
Themen-Optionen

ExcelApplication in Delphi xe2 starter

Ein Thema von Ykcim · begonnen am 29. Sep 2011 · letzter Beitrag vom 15. Nov 2012
Antwort Antwort
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
856 Beiträge
 
Delphi 12 Athens
 
#1

AW: ExcelApplication in Delphi xe2 starter

  Alt 15. Nov 2012, 22:42
Okay, hier die Lösung, wie ich eine der vielen Procduren, die es dafür gibt angepasst habe.
Das ganze in einer Klasse gekapselt:

Delphi-Quellcode:
uses ... ComObj

Type
   TExcelExport = class
      strict protected
         FExcelApp: OleVariant;
         FWorkbook: OleVariant;
         FWorksheet: OleVariant;
         FRange: OleVariant;
         FData: OleVariant;
         FValue: OleVariant;
         FMaxCol, FMaxRow: integer;
      public
         constructor create(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;
         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;
         property MaxRow: integer read GetMaxRow;
   end;


implementation

function Min(X1, X2 : Integer) : Integer;
begin
   if (X1 < X2) then
     Result := X1
   else
     Result := X2;
end;

{=============================================================================}

function Max(X1, X2 : Integer) : Integer;
begin
   if (X1 > X2) then
     Result := X1
   else
     Result := X2;
end;

{=============================================================================}

//Inhalt eines TStringGrid nach Excel exportieren
constructor TExcelExport.create(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
    FData := 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;

{=============================================================================}


Aufruf mit Formatierung:

Delphi-Quellcode:
procedure TMain.AdvGlowButton4Click(Sender: TObject);
var Pfad: string;
      Space: integer;
      Objekt: TExcelExport;
begin
   Space:=2;
   // Programmpfad ermitteln
   Pfad:=ExtractFilePath(ParamStr(0));
   Pfad:=Pfad+'\Temp\Export.xlt';
   Objekt:=TExcelExport.create(Main.FrameTerminVerfolgungIntern1.GridEigene, Pfad, Space);
   Try
      //Excel formatieren
      Objekt.ExcelApp.Range['E2:E2'].Value:='Briefkasten: Alle eigene FAs';
      Objekt.ExcelApp.Range['A3:S3'].Select; //Den Bereich A1 bis I3 makieren
      Objekt.ExcelApp.Selection.Font.Bold := true;//und im Makierten Bereich die Schriftdicke ändern
      Objekt.ExcelApp.Range[Objekt.RefToCell(1, 1, Space), Objekt.RefToCell(Objekt.MaxCol, Objekt.MaxRow, Space)].Select;
      Objekt.ExcelApp.Selection.borders.weight:=2;
      Objekt.ExcelApp.Range['A3:S3'].Select;
      Objekt.ExcelApp.Selection.borders.weight:=3;
      Objekt.Range.Columns.AutoFit;
      Objekt.ExcelApp.Range['Q:Q'].Columnwidth:=8;
      Objekt.ExcelApp.Range['R:R'].Columnwidth:=0;
      Objekt.ExcelApp.Range['I:I'].Columnwidth:=1.71;
      Objekt.ExcelApp.Range['D:D'].Columnwidth:=13;
      Objekt.ExcelApp.Range['G:G'].Columnwidth:=14.71;
      Objekt.ExcelApp.Range['O:O'].Columnwidth:=22;
      Objekt.ExcelApp.Range['O:O'].WrapText:=true;
      Objekt.ExcelApp.Range['Q:Q'].WrapText:=true;
      Objekt.ExcelApp.Range['D:D'].WrapText:=true;
      Objekt.ExcelApp.Range['G:G'].WrapText:=true;
      Objekt.ExcelApp.Range['A2:O2'].mergecells:=true;
      Objekt.ExcelApp.ActiveSheet.PageSetup.LeftFooter:=Main.StartUser.Caption;
   Finally
      Objekt.Free;
   end;
end;
In diesem Sinne

Ykcim
Patrick
  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:03 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