App soll Daten an Word übergeben und drucken

  • #1
M

MasterQ

Bekanntes Mitglied
Themenersteller
Dabei seit
06.03.2006
Beiträge
139
Reaktionspunkte
0
Hallo,

ich will realisieren, dass ein Programm Daten an Word sendet, um einen Bericht zu erstellen. Dazu soll eine Vorlage mit diversen Textfeldern durch die Daten von der Anwendung gefüllt werden.

Ich blicke es im Moment nicht wirklich, wie das gehen soll. Es gibt die Serienbrief-Funktion. Damit kann ich das per Hand tun, also Vorlage öffnen, Datenquelle anbinden, Datensatz auswählen und Drucken drücken.

Das alles soll aber im Hintergrund ohne Zutun des Anwenders laufen. Mit meiner Anwendung kann ich Exceltabellen erzeugen. Damit kann ich schon mal meine Datenquelle bereitstellen, bzw. aktualisieren. Dann müsste meine Anwendung Word irgendwie aufrufen und die entsprechenden Aktionen anstoßen.

Word geht doch auch als ActiveX oder?

Ich hangele mich seit Stunden durch die ActiveX-Methoden von Word, finde da aber nix.

Geht das mit ActiveX nicht direkt? Kann ich mit ActiveX Makros aufrufen?

Kennt jemand das Prinzip mit dem man mein Anliegen umsetzen kann? Wo muss ich suchen, um Hinweise zu finden, wie ich das umsetzen kann? Ich rede bewusst nicht von konkreten Programmiersprachen. Ich will das Prinzip verstanden haben, dann komme ich auch mit meiner Programmiersprache hier zurecht.

Gruß

MQ
 
  • #2
Programmiersprachen brauchst Du dazu gar nicht. WinWord kann das von alleine. So geht's:

Wenn möglich, veranlasse, dass Deine Anwendung die Datenquelle im Nur-Text-Format anlegt, vorzugsweise im Format Text-csv. Ich setze jetzt mal voraus, Du weisst, was das ist und kennst den internen Aufbau so einer Datei. Stelle auch sicher, dass Deine Anwendung die Datenquelle mit der Endung DOC im Dateinamen versieht; dass es sich dabei nicht um ein Word-Dokument handelt, ist in dem Zusammenhang unerheblich.

Erstelle sodann das Word-Dokument, das Du mit den Daten aus der Anwendung befüllt haben willst. Dieses muss ein Serienbriefdokument und die oben genannte Datenquelle muss mit dem Dokument verbunden sein. Beachte für WinWord ab Version 2003, dass hier grundsätzlich die Anbindung einer echten Datenbank erwartet wird. Soll hingegen eine gewöhnliche Textdatei als Datenquelle verbunden werden und soll Word 2003 hinsichtlich der Serienbriefe so reagieren wie seine Vorgängerversionen, musst Du vor Erstellung des Word-Dokuments Hand an die Registry legen und einen neuen Schlüssel einfügen. Begib Dich hierzu an HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Word\Options, lege den neuen Schlüssel SQLSecurityCheck als DWORD-Wert an und versieh diesen mit dem Wert Null (meist schon voreingestellt beim Anlegen).

Im Wesentlichen war's das auch schon. Jetzt fehlt nur noch der SHELL-Aufruf für WinWord mit besagtem Serienbrief-Dokument als Kommandozeilenparameter in Deiner Anwendung, und schon kann's losgehen.
 
  • #3
Moin,

KFSoftware schrieb:
Programmiersprachen brauchst Du dazu gar nicht. WinWord kann das von alleine. So geht's:

Ich meinte damit die Datengenerierung etc.

Wenn möglich, veranlasse, dass Deine Anwendung die Datenquelle im Nur-Text-Format anlegt, vorzugsweise im Format Text-csv. Ich setze jetzt mal voraus, Du weisst, was das ist und kennst den internen Aufbau so einer Datei. Stelle auch sicher, dass Deine Anwendung die Datenquelle mit der Endung DOC im Dateinamen versieht; dass es sich dabei nicht um ein Word-Dokument handelt, ist in dem Zusammenhang unerheblich.

csv - comma separated values - Kenn ich!

Erstelle sodann das Word-Dokument, das Du mit den Daten aus der Anwendung befüllt haben willst. Dieses muss ein Serienbriefdokument und die oben genannte Datenquelle muss mit dem Dokument verbunden sein. Beachte für WinWord ab Version 2003, dass hier grundsätzlich die Anbindung einer echten Datenbank erwartet wird. Soll hingegen eine gewöhnliche Textdatei als Datenquelle verbunden werden und soll Word 2003 hinsichtlich der Serienbriefe so reagieren wie seine Vorgängerversionen, musst Du vor Erstellung des Word-Dokuments Hand an die Registry legen und einen neuen Schlüssel einfügen. Begib Dich hierzu an HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Word\Options, lege den neuen Schlüssel SQLSecurityCheck als DWORD-Wert an und versieh diesen mit dem Wert Null (meist schon voreingestellt beim Anlegen).

Ich verwende Word 2003. Wenn ich das Seriendokument mit einer Quelle verbinde, dann habe ich verschiedene Auswahlmöglichkeiten. Ich kann auch normale Excel-Tabellen auswählen. Das ganze DB-Geraffel fällt weg, wenn man als Dateityp irgendetwas anderes auswählt. So wird auch csv angeboten. Zumindest mit Excel klappt das. CSV hab ich noch nicht ausprobiert, wäre aber mein bevorzugtes Format gewesen.

Der Key in der Registry existiert bei mir noch nicht. Den brauch ich wohl aber auch nicht. -?-

Im Wesentlichen war's das auch schon. Jetzt fehlt nur noch der SHELL-Aufruf für WinWord mit besagtem Serienbrief-Dokument als Kommandozeilenparameter in Deiner Anwendung, und schon kann's losgehen.

OK, damit krieg ich meine Daten in Word. So ungefähr habe ich es mir auch vorgestellt. Nur, wie krieg ich es hin, dass


  • [li]aus der Datendatei ein bestimmter Datensatz ausgewählt wird, [/li]
    [li]das so erstellte Dokument mit speziellem Namen gespeichert wird,[/li]
    [li]das so erstellte Dokument als PDF ausgedruckt wird,[/li]
    [li]das so erstellte Dokument physikalisch auf Papier ausgedruckt wird.[/li]

Notfalls erzeuge ich eine temporäre Datendatei mit nur einem Eintrag, die ich danach wieder lösche. Das ist nicht das Problem.

Notfalls kann ich auch auf das Speichern als Word-Dokument verzichten. Unverzichtbar ist aber das Erzeugen eines PDF und das Ausdrucken auf Papier.

Prinzipiell ließe sich das durch ein Makro automatisieren, das ich per Kommandozeile in Word ausführe. Wenn das mit dem Makro klappt, dann bräuchte ich nur so was wie

winword.exe -startemakro foo

Dateinamen wären sowohl für die Wordvorlage die gefüllt werden soll, als auch für die Datendatei fix. Zum Abspeichern und zum PDF Erzeugen müsste ich allerdings im Makro auf einzelne Felder der Datendatei zurückgreifen. Sollte aber auch kein Problem sein. ASCII lesen kann VB ja.

Wo sind denn die Kommandozeilenparameter von Word beschrieben?

Gruß

MQ
 
  • #4
MasterQ schrieb:
Der Key in der Registry existiert bei mir noch nicht. Den brauch ich wohl aber auch nicht. -?-

Doch, leider. Ohne dem funktioniert die Seriendruck-Vorschau in WinWord 2003 nicht wie von früheren Versionen her gewohnt, wenn man Nicht-Datenbanken als Serienbrief-Datenquellen einsetzt. Diese Schaltfläche in der Seriendruck-Werkzeugleiste ist ohne Registry-Ergänzung entweder deaktiviert oder das Anklicken bewirkt nichts - im Dokument sieht man ohne Registry-Eintrag immer nur die Bezeichnungen der eingefügten Seriendruckfelder, aber niemals den Inhalt derselben.

MasterQ schrieb:
...wie kriege ich es hin, dass aus der Datendatei ein bestimmter Datensatz ausgewählt wird,

Das sollte eigentlich Deine App. besorgen in dem Sinne, dass der User einen bestimmten Datensatz in der App. auswählt, den Druckbefehl erteilt, die App. daraufhin die Datenquelle befüllt und WinWord mit dem gewünschten DOC startet.

Soll Deine App. hingegen mehrere oder gar viele Datensätze auf einmal in die Datenquelle schreiben, muss der User den oder die gewünschten manuell auswählen, fürchte ich, und dann das DOC mit den gewünschten Daten drucken. Zur Datensatz-Auswahl hält WinWord in der Serienbrief-Werkzeugleiste ja eine Art Mini-Datensteuerelement vor (mit Vor- und Rücklaufbuttons), das zu diesem Zweck zu benutzen ist. Ich bezweifle, dass man das von außen durch eine externe Anwendung steuern kann.

In dem Zusammenhang:
MasterQ schrieb:
Notfalls erzeuge ich eine temporäre Datendatei mit nur einem Eintrag, die ich danach wieder lösche. Das ist nicht das Problem.

Ich würde es so machen.

MasterQ schrieb:
...das so erstellte Dokument mit speziellem Namen gespeichert, als PDF und auf Papier gedruckt wird...
Prinzipiell ließe sich das durch ein Makro automatisieren, das ich per Kommandozeile in Word ausführe.

Nicht nötig. Das VBA-Makro baust Du wahlweise in die Prozeduren Document_New() oder Document_Open() des oder der zu verwendenden DOCs ein, das bewirkt bereits deren automatische Ausführung, sobald das Dokument geöffnet oder ein neues Dokument nach dem Muster des genannten erzeugt wird. Kommandozeilenparameter sind diesbezüglich nicht erforderlich.

MasterQ schrieb:
Dateinamen wären sowohl für die Wordvorlage die gefüllt werden soll, als auch für die Datendatei fix. Zum Abspeichern und zum PDF Erzeugen müsste ich allerdings im Makro auf einzelne Felder der Datendatei zurückgreifen. Sollte aber auch kein Problem sein. ASCII lesen kann VB ja.

Ganz genau. Das VBA-Statement ActiveDocument.MailMerge.DataSource.DataFields(Seriendruckfeld_Name).Value erlaubt das Auslesen des Inhalts der bezeichneten Seriendruck-Felder und deren Weiterverarbeitung im folgenden Makro-Code.

MasterQ schrieb:
Wo sind denn die Kommandozeilenparameter von Word beschrieben?

Ich erspare es mir, sie hier aufzulisten, und bitte um Nachsicht. In meinem antiken WinWord 2000 zu finden in der WinWord-Hilfe nach Eingabe des Suchbegriffs starten und dem anschließenden Anklicken des Themas Steuern der Vorgänge beim Starten von Microsoft Word. Hoffe mal, Microsoft hat das in Version 2003 nicht allzusehr verändert.

Davon abgesehen sieht der SHELL-Befehl, den Deine App. absetzen muss, um WinWord mit dem besagten Dokument zu öffnen, so aus:

[Pfad][\]winword.exe [Pfad][\]dokumentname.doc.

Aber das ahntest Du sicher schon.
 
  • #5
Hallo,

KFSoftware schrieb:
MasterQ schrieb:
Der Key in der Registry existiert bei mir noch nicht. Den brauch ich wohl aber auch nicht. -?-

Doch, leider. Ohne dem funktioniert die Seriendruck-Vorschau in WinWord 2003 nicht wie von früheren Versionen her gewohnt, wenn man Nicht-Datenbanken als Serienbrief-Datenquellen einsetzt. Diese Schaltfläche in der Seriendruck-Werkzeugleiste ist ohne Registry-Ergänzung entweder deaktiviert oder das Anklicken bewirkt nicht - im Dokument sieht man ohne Registry-Eintrag immer nur die Bezeichnungen der eingefügten Seriendruckfelder, aber niemals den Inhalt derselben.

Bei mir tut's!

Nicht nötig. Das VBA-Makro baust Du wahlweise in die Prozeduren Document_New() oder Document_Open() des oder der zu verwendenden DOCs ein, das bewirkt bereits deren automatische Ausführung, sobald das Dokument geöffnet oder ein neues Dokument nach dem Muster des genannten erzeugt wird. Kommandozeilenparameter sind diesbezüglich nicht erforderlich.

Ja, inzwischen hab ich das auch gelesen. Irgendwo stand, dass AutoExec und AutoOpen Überbleibsel aus alten Tagen sind und man heute über New und Open geht.

Na ja, ich habe auch einige Zeit gebraucht, um dahinter zu kommen, dass das auch nur dann so geht, wenn man ein Dokument öffnet und nicht von einer Vorlage ein neues erzeugt.

ein winword foo.doc ruft die Openroutine auf, ein winword -tfoo.dot nicht!! Aua.



MasterQ schrieb:
Wo sind denn die Kommandozeilenparameter von Word beschrieben?


hab'se gefunden.

Ich denke, ich krieg es jetzt hin.

Meine App kann nun Word aufrufen und mit Hilfe der Makroaufzeichnung habe ich auch die Befehle rausgekriegt, mit denen ich die Dokumente öffne, die Datendatei anlinke, den Datensatz auswähle und speichere und drucke und den ganzen Rest auch.

Danke für die Hilfe

Gruß

MQ
 
  • #6
MasterQ schrieb:

Respekt!

MasterQ schrieb:
ein winword foo.doc ruft die Openroutine auf, ein winword -tfoo.dot nicht!! Aua.

Open wird davon auch nur indirekt betroffen; an sich sollte ein neues Dokument nach dem Muster der Vorlage erstellt werden, und irgendwie geht das auch - schon seit längerer Zeit schnüffle ich der Masche hinterher, wie, aber ich komm' einfach nicht dahinter...

MasterQ schrieb:
Ich denke, ich krieg es jetzt hin. ... Danke für die Hilfe

Noch viel Erfolg und - - - gern geschehen!

Ist ein interessantes Gebiet, mit dem Du dich beschäftigst, und v.a. der Schriftverkehr lässt sich damit unheimlich auf Effizienz pushen.
 
  • #7
Moin,

KFSoftware schrieb:
MasterQ schrieb:

Respekt!

Habe ich dafür nicht verdient. Bei mir tut es out of the böxle. Dafür habe ich andere Probleme, so habe ich (wichtige) Dokumente aus Word2000 übernommen und kann diese ohne Kniebeugen nicht mit Word2003 ausdrucken. Es schmiert einfach ab!

Open wird davon auch nur indirekt betroffen; an sich sollte ein neues Dokument nach dem Muster der Vorlage erstellt werden, und irgendwie geht das auch - schon seit längerer Zeit schnüffle ich der Masche hinterher, wie, aber ich komm' einfach nicht dahinter...

Das Dokument wird aus der dot schon erstellt. Nur werden die Methoden nicht aufgerufen. Ich verstehe nicht warum die in diesem Fall nicht ausgeführt werden bzw. weiß ich nicht, welche in diesem Fall anstatt dieser aufgerufen werden.

Ist ein interessantes Gebiet, mit dem Du dich beschäftigst, und v.a. der Schriftverkehr lässt sich damit unheimlich auf Effizienz pushen.

Yepp! Bei mir werden Messdaten erzeugt, die bisher per Hand in Excel übertragen wurden, aus dem dann (halbautomatisch) ein Messbericht erstellt wurde. Das soll sich ändern. Ich bastele ein Programm zu geführten Messung, Schritt für Schritt mit Datenaufnahme, übertragen der Daten in eine Datenbank bzw. Datendatei und dem Erstellen eines Berichts mit den Ergebnissen.

Gruß

MQ
 
  • #8
KFSoftware schrieb:
...an sich sollte ein neues Dokument nach dem Muster der Vorlage erstellt werden, und irgendwie geht das auch - schon seit längerer Zeit schnüffle ich der Masche hinterher, wie, aber ich komm' einfach nicht dahinter...

MasterQ schrieb:
ein winword -tfoo.dot ...

DAS ist genau der entscheidende Hinweis, den ich seit langem gesucht habe!!!

Herzlichen Dank für den Hinweis, habe den Parameter zwar schon gekannt, bin aber stets gescheitert, weil ich zwischen /t und foo.dot immer ein Leerzeichen in meiner App. setzte, so dass WinWord die DOT öffnete, statt ein neues DOC zu erzeugen. Hab' wohl immer noch zu viel DOS-Tomaten auf den Augen gehabt. Zu DOS-Zeiten musste zwischen den einzelnen Parametern stets ein Leerzeichen sein.
 
  • #9
Hallo,

KFSoftware schrieb:
MasterQ schrieb:
ein winword -tfoo.dot ...

DAS ist genau der entscheidende Hinweis, den ich seit langem gesucht habe!!!

Herzlichen Dank für den Hinweis, habe den Parameter zwar schon gekannt, bin aber stets gescheitert, weil ich zwischen /t und foo.dot immer ein Leerzeichen in meiner App. setzte, so dass WinWord die DOT öffnete, statt ein neues DOC zu erzeugen. Hab' wohl immer noch zu viel DOS-Tomaten auf den Augen gehabt. Zu DOS-Zeiten musste zwischen den einzelnen Parametern stets ein Leerzeichen sein.

Freut mich, wenn ich auch helfen konnte.

Das mit dem Leerzeichen ist schon verwirrend. Ich frage mich, welcher Teufel die MS-Leute geritten hat, solch einen Blödsinn zu implementieren. Da wäre es doch sinnvoller eine neue Option einzuführen. Aber vielleicht hat deren Alphabet einfach weniger Buchstaben oder die Tastatur war kaputt.

Es gibt auch noch andere Optionen von Word, die auf diese Art missbraucht werden.

Gruß

MQ
 
  • #10
Hallo, MQ,

einen hab' ich noch:

MasterQ schrieb:
Das Dokument wird aus der dot schon erstellt. Nur werden die Methoden nicht aufgerufen. Ich verstehe nicht warum die in diesem Fall nicht ausgeführt werden bzw. weiß ich nicht, welche in diesem Fall anstatt dieser aufgerufen werden.

Sieh' Dir dazu die Sicherheitseinstellungen für Makros in WinWord an, im 2003er sollten diese immer noch via Menü Extras => Makro => Sicherheit erreichbar sein. Voreingestellt ist hier normalerweise Hoch, um die Ausführung von Makroviren zu verhindern. Kannst auf Mittel oder Niedrig heruntersetzen.

Falls Du Deine App. zu verkaufen oder sonstwie zu distribuieren beabsichtigst, weise in der Dokumentation unbedingt auf diese Einstellmöglichkeit hin, sonst hagelt's Kunden-Mecker!
 
Thema:

App soll Daten an Word übergeben und drucken

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.838
Beiträge
707.959
Mitglieder
51.491
Neuestes Mitglied
haraldmuc
Oben