Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Excelautomation und Pagesetup (https://www.delphipraxis.net/75193-excelautomation-und-pagesetup.html)

Jens Schumann 15. Aug 2006 17:56


Excelautomation und Pagesetup
 
Hallo,
mit u.s. Code formatiere ich die Druckausgabe einer zuvor generierten Exceltabelle.
Die Excelarbeitsmappe wird komplett vom Programm erstellt und gefüllt.
Als Bremse hat sich das Setzen der Druckoptionen herausgestellt. Im Vergleich
zu den anderen Operationen arbeitet dieser Codeabschnitt ziemlich langsam.
Delphi-Quellcode:
    With Excel.WorkSheet.PageSetup do
      begin
      LeftHeader := '';
      CenterHeader := '';
      RightHeader := '';
      LeftFooter := '';
      CenterFooter := '';
      RightFooter := FRightFooterText;
      LeftMargin := SystemDataProvider.Excel.Application.InchesToPoints(0.787401575);
      RightMargin := SystemDataProvider.Excel.Application.InchesToPoints(0.787401575);
      TopMargin := SystemDataProvider.Excel.Application.InchesToPoints(0.984251969);
      BottomMargin := SystemDataProvider.Excel.Application.InchesToPoints(0.984251969);
      HeaderMargin := SystemDataProvider.Excel.Application.InchesToPoints(0.4921259845);
      FooterMargin := SystemDataProvider.Excel.Application.InchesToPoints(0.4921259845);
      PrintHeadings := False;
      PrintGridlines := False;
      PrintComments := xlPrintNoComments;
      //       PrintQuality[1] := 600;
      CenterHorizontally := False;
      CenterVertically := False;
      If FDataprovider.PrintOrientation=poPortrait then
        Orientation := xlPortrait
        else
          Orientation := xlLandscape;
      Draft := False;
      PaperSize := xlPaperA4;
      FirstPageNumber := xlAutomatic;
      Order := xlDownThenOver;
      BlackAndWhite := False;
      Zoom := False;
      FitToPagesWide := 1;
      FitToPagesTall := False;
      //   PrintErrors := xlPrintErrorsDisplayed;
      end; // With Excel.WorkSheet.PageSetup do
Gibt evt. einen anderen Zugriffsweg um die Sache zu beschleunigen?

Beim Zugriff auf die Zellen ist es z.B. schneller über das Range Objeckt anstatt über die Selection zu gehen.

omata 15. Aug 2006 17:59

Re: Excelautomation und Pagesetup
 
Diese Bremse ist mir auch bekannt. Ich habe da allerdings noch nichts gefunden dies zu beschleunigen, da die Stelle ja sowieso nicht so häufig aufgerufen wird sollte das eigentlich auch kein Problem sein.

Edit: In Excel selbst dauert das Umschalten also neu setzen auf einen neuen Drucker auch länger.

Gruss
Thorsten

Jens Schumann 15. Aug 2006 18:04

Re: Excelautomation und Pagesetup
 
Hallo omata,
die Stelle wird pro Arbeitsblatt genau einmal aufgerufen.
Es können jedoch bis zu 5 Arbeitsmappen, die ca. 60 Arbeitsblätter enthalten können erstellt.

Da macht sich die Bremse schon bemerkbar.

omata 15. Aug 2006 18:08

Re: Excelautomation und Pagesetup
 
Wie gesagt im Druckfenster von Excel dauert dieses Umschalten/Setzen selber etwas länger. Dieses Softwareproblem wirst du wohl nur durch neue/schnellere Hardware lösen können, sorry.

Gruss
Thorsten

shmia 15. Aug 2006 18:25

Re: Excelautomation und Pagesetup
 
Du schreibst öfters:
Delphi-Quellcode:
irgendwas := SystemDataProvider.Excel.Application.InchesToPoints(
Jeder Punkt benötigt zusätzliche (Inter Prozess-)Kommunikation zwischen deiner Anwendung und Excel.
Deshalb:
Delphi-Quellcode:
xlapp := Excel.Application;
  LeftMargin := xlapp.InchesToPoints(0.787401575);
  RightMargin := xlapp.InchesToPoints(0.787401575);
...

Jens Schumann 15. Aug 2006 19:07

Re: Excelautomation und Pagesetup
 
Hallo shmia,
habe Deinen Tip schon umgesetzt. Eine fühlbare Beschleunigung ist leider nicht zu bemerken.

shmia 16. Aug 2006 09:28

Re: Excelautomation und Pagesetup
 
Zitat:

Zitat von Jens Schumann
Hallo shmia,
habe Deinen Tip schon umgesetzt. Eine fühlbare Beschleunigung ist leider nicht zu bemerken.

Dann würde ich noch das Papier ganz am Anfang setzen. Gut möglich, dass Excel andernfalls 2* rechnen muss.
(kann aber auch sein, dass es nix bringt; dann ist einfach Excel/Windows schuld)

Thorus 29. Aug 2006 12:51

Re: Excelautomation und Pagesetup
 
Hallo, ich habe nach Möglichkeiten gesucht, damit die Arbeit mit PageSetup schneller geht, aber habe beim Übertragen nach Delphi Probleme.

Code:
Sheets.Select
Sheets("Tabelle1").Activate
With ActiveSheet.PageSetup
  .LeftHeader = ""
  ...
Damit selektiert man alle Tabellen in der Arbeitsmappe und ändert von allen gleichzeitig die Eigenschaft PageSetup. Dies funktioniert als Excel-Makro.
Nur in Delphi ändert er es nur von der ersten und ich weiß nicht wieso.
Code:
wb.Sheets.Select;
wb.Sheets[1].Activate;
Page := wb.ActiveSheet.PageSetup;
Page.LeftHeader := '';
...
Dies selektiert zwar alle Tabellen, wie man dann sieht, aber ändert es trotzdem nur von der ersten. Habe ich beim übertragen ein Fehler gemacht?

Oder gibt es eine andere Möglichkeit von allen Tabellen PageSetup gleichzeitig zu ändern? Außer natürlich von allen Tabellen per Schleife das zu ändern, was langsam ist.


Im Internet hatte ich noch etwas anderes gefunden, was im Excel zwar geht, aber bei Delphi nicht.

Code:
wb.Sheets.Select
xls.ExecuteExcel4Macro('"Page.Setup("""",""&L&8&F, &A, &D"",1.43,0.38,0.47,0.47,False,False,True,False,1,9,True,,,,,0.27,0.27,False,False)"');
xls entspricht Application aus Excel.

Dies ist eine Excel4 Makro. Es funktioniert leider nur so nicht in Delphi, aber in Excel schon. Und ist es überhaupt sinnvoll was älteres zu nehmen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:06 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