![]() |
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:
Gibt evt. einen anderen Zugriffsweg um die Sache zu beschleunigen?
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 Beim Zugriff auf die Zellen ist es z.B. schneller über das Range Objeckt anstatt über die Selection zu gehen. |
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 |
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. |
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 |
Re: Excelautomation und Pagesetup
Du schreibst öfters:
Delphi-Quellcode:
Jeder Punkt benötigt zusätzliche (Inter Prozess-)Kommunikation zwischen deiner Anwendung und Excel.
irgendwas := SystemDataProvider.Excel.Application.InchesToPoints(
Deshalb:
Delphi-Quellcode:
xlapp := Excel.Application;
LeftMargin := xlapp.InchesToPoints(0.787401575); RightMargin := xlapp.InchesToPoints(0.787401575); ... |
Re: Excelautomation und Pagesetup
Hallo shmia,
habe Deinen Tip schon umgesetzt. Eine fühlbare Beschleunigung ist leider nicht zu bemerken. |
Re: Excelautomation und Pagesetup
Zitat:
(kann aber auch sein, dass es nix bringt; dann ist einfach Excel/Windows schuld) |
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:
Damit selektiert man alle Tabellen in der Arbeitsmappe und ändert von allen gleichzeitig die Eigenschaft PageSetup. Dies funktioniert als Excel-Makro.
Sheets.Select
Sheets("Tabelle1").Activate With ActiveSheet.PageSetup .LeftHeader = "" ... Nur in Delphi ändert er es nur von der ersten und ich weiß nicht wieso.
Code:
Dies selektiert zwar alle Tabellen, wie man dann sieht, aber ändert es trotzdem nur von der ersten. Habe ich beim übertragen ein Fehler gemacht?
wb.Sheets.Select;
wb.Sheets[1].Activate; Page := wb.ActiveSheet.PageSetup; Page.LeftHeader := ''; ... 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:
xls entspricht Application aus Excel.
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)"'); 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 04:48 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