AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Word Automatisation Beschleunigen

Ein Thema von GoTo0815 · begonnen am 12. Mär 2020 · letzter Beitrag vom 19. Mär 2020
Antwort Antwort
GoTo0815

Registriert seit: 18. Mai 2004
148 Beiträge
 
Delphi XE2 Professional
 
#1

AW: Word Automatisation Beschleunigen

  Alt 13. Mär 2020, 11:23
Habe mich jetzt mal ein wenig bei den VBAlern umgeschaut.
Und habe zumindest einen Lösungsansatz gefunden, dass Dokument einfach weiter zu verwenden.
Man merkt sich die Range der Textmarke füllt diese mit Inhalt. Dadurch werden laut Forumseintrag offene Textmarken zu geschlossenen.
Nach dem Speichern des befüllten Dokuments als PDF ersetze ich die gemerkten Ranges alle wieder durch gleichnamige Textmarken.
Ob das die gewünschte Performance bringt und das alles so klappt, werde ich testen, aber es ist zumindest ein Ansatz, mit dem ich auf Basis von "einer einzigen" geöffneten Vorlage arbeiten könnte.

Hier gefunden: http://www.office-loesung.de/ftopic42883_0_0_asc.php

Code:
Sub TBrange()
    Dim bRange As Range
    '
    If ActiveDocument.Bookmarks.Exists("F1") Then
        Set bRange = ActiveDocument.Bookmarks("F1").Range
        bRange.Text = "der Text"
    End If
    '
    ' Textmarke recykeln
    With ActiveDocument.Bookmarks
        .Add Range:=bRange, Name:="F1"
    End With
End Sub
Falls ich mal ein "DANKE" vergesse, hier schon mal eins im Voraus: Danke für Eure Zeit!
  Mit Zitat antworten Zitat
Benutzerbild von TigerLilly
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.251 Beiträge
 
Delphi 12 Athens
 
#2

AW: Word Automatisation Beschleunigen

  Alt 13. Mär 2020, 13:36
Wenn die Vorlagen auch als RTF Dateien vorliegen können, dann ist das ev. eine Option:

https://www.128byte.ru/
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#3

AW: Word Automatisation Beschleunigen

  Alt 14. Mär 2020, 12:27
Code:
Sub TBrange()
    Dim bRange As Range
    '
    If ActiveDocument.Bookmarks.Exists("F1") Then
        Set bRange = ActiveDocument.Bookmarks("F1").Range
        bRange.Text = "der Text"
    End If
    '
    ' Textmarke recykeln
    With ActiveDocument.Bookmarks
        .Add Range:=bRange, Name:="F1"
    End With
End Sub
Wir haben das gleiche Prinzip in einem alten Delphiprojekt genutzt. Also Ranges über Bookmarks definiert und neu befüllt, gesetzt. Wenn ich mich richtig erinnere war es das beste/schnellste Ergebnis von verschiedenen Varianten / Versuchen (und damals nicht selbstverständlich, es war robust).
Das war allerdings ohne Exists Prüfung, sondern eine Iteration in einem gegebenen Dokument durch die Liste der definierten Bookmarks.
Auf die Art konnte man beliebig große Feldinhalte befüllen und das Ganze auch bei mehrseitigen Dokumenten so schnell, dass man mit einem System/Mitarbeiter mehrere Hochleistungsdrucker in Betrieb halten kann.
Man muss nur aufpassen, dass man sich bei der Arbeit mit den Dokumenten nicht unbemerkt die Bookmarks zerstört. Aber vielleicht kann man das mit neueren Wordversionen auch besser sehen und bedienen.
Drumrum war noch eine Gesamtseitenkontrolle, um Fehldrucke/Fehlbefüllung zu erkennen und einseitig/mehrseitiges vorbedrucktes Papier nicht falsch zu bedrucken.
Gruß, Jo
  Mit Zitat antworten Zitat
GoTo0815

Registriert seit: 18. Mai 2004
148 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Word Automatisation Beschleunigen

  Alt 16. Mär 2020, 20:33
Ich versuche das gerade umzusetzen. Bei einfachen Textersetzungen klappt das auch gut, aber wenn die Textmarke mit einer Tabelle gefüllt ist, dann habe ich Probleme, dass immer mehr Tabellen in einer Textmarke entstehen und nicht wie gewünscht nur eine neue Tabelle in der Textmarke.


Delphi-Quellcode:
  var ovBookmark, ovBRange : OleVariant;
      iRows, iCols : Integer;

  ovBookmark := 'NameDerTextmarke';
  ovBRange := WordApp.ActiveDocument.Bookmarks.Item(ovBookmark).Range;
  WordTable := WordApp.ActiveDocument.Tables.Add(ovBRange, iRows, iCols);
  // Dann wird die Tabelle mit Inhalt gefüllt.
  // ....
  // Später dann noch
  // Hier hatte ich auch schon versucht noch einmal nach dem Befüllen der Tabelle noch einmal ovBRange neu zu setzen.
  // Wenn ich ovBRange := WordApp.ActiveDocument.Bookmarks.Item(ovBookmark).Range; setze ändert das das Problem nicht. Es werden immer mehr Tabellen im Inneren der Bookmark.
  // Wenn ich ovBRange := WordTable.Range; setze, dann erhalte ich beim erneuten erstellen einer Tabelle die Meldung: "Der Bereich kann nicht gelöscht werden".
  WordApp.ActiveDocument.Bookmarks.Add(ovBookmark, ovBRange);
Also der erste Durchgang mit der frischen Vorlage funktioniert. Die Tabelle kann einwandfrei eingesetzt werden. Nur ab dem zweiten Durchgang werden es immer mehr Tabellen innerhalb einer Bookmark und es wird immer langsamer. Was klar ist.
Falls ich mal ein "DANKE" vergesse, hier schon mal eins im Voraus: Danke für Eure Zeit!

Geändert von GoTo0815 (16. Mär 2020 um 20:36 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#5

AW: Word Automatisation Beschleunigen

  Alt 17. Mär 2020, 11:29
Ich krieg leichtes Hirnsausen mit Blick auf VB, aber ich glaube Du musst die Table der Range zuweisen und nicht eine Table mit Hilfe der Range anlegen.
Gruß, Jo
  Mit Zitat antworten Zitat
GoTo0815

Registriert seit: 18. Mai 2004
148 Beiträge
 
Delphi XE2 Professional
 
#6

AW: Word Automatisation Beschleunigen

  Alt 17. Mär 2020, 11:45
Das kann ich gut verstehen.
Ich habe jetzt den Weg gewählt die Tabellen zu löschen, bevor ich neue einfüge.
Dazu merke ich mir die Bookmarks in denen eine Tabelle erstellt wird in einer StringList.

Delphi-Quellcode:

if aListOfBookmarksWithTables.Count > 0 then
begin
  for iCounter2 := aListOfBookmarksWithTables.Count-1 downto 0 do
  begin
    WordTable:= WordApp.ActiveDocument.Bookmarks.Item(aListOfBookmarksWithTables[iCounter2]).Range.Tables.Item(1);
    WordTable.Delete;
    aListOfBookmarksWithTables.Delete(iCounter2);
  end;
end;
Scheint zumindest zu funktionieren.
Falls ich mal ein "DANKE" vergesse, hier schon mal eins im Voraus: Danke für Eure Zeit!
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#7

AW: Word Automatisation Beschleunigen

  Alt 17. Mär 2020, 21:03
Wenn in dem Dokument im Leerzustand keine Tabellen sind, könntest du doch einfach pauschal alle Tabellen im Dokument löschen und musst das nicht so kompliziert mit Merkliste machen, oder?
Ralph
  Mit Zitat antworten Zitat
GoTo0815

Registriert seit: 18. Mai 2004
148 Beiträge
 
Delphi XE2 Professional
 
#8

AW: Word Automatisation Beschleunigen

  Alt 19. Mär 2020, 09:32
Danke Jumpy,
Man muss dem User der die Vorlage gestaltet auch die Möglichkeit geben Tabellen anderweitig zu ergänzen, ohne dass das System dann diese auch löscht. Ergo komme ich am Merken der mit temporären Tabellen befüllten Bookmarks nicht vorbei.
Z.B. werden für die Positionierung der Elemente (Bilder, Beschreibung, Preistabelle) auch Tabellen in unserer aktuellen Vorlage verwendet, daher konnte ich den Weg nicht gehen.

Wir haben das ganze jetzt so im Betrieb und es funktioniert. Allerdings nicht wesentlich schneller als vorher mit dem Neuöffnen der Vorlagen.
Falls ich mal ein "DANKE" vergesse, hier schon mal eins im Voraus: Danke für Eure Zeit!
  Mit Zitat antworten Zitat
Antwort Antwort

 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 00:35 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