Wie kann ich Daten an Word übergeben?

Hallo,

ich hab schon in mehreren Software-Paketen gesehen, dass man sich eine Word-Vorlage mit Feldern erstellt und dann in der Fremd-Software genau die Felder definiert und dann Word startet und mit den Inhalten befüllt wird.

Wie wird sowas realisiert?
Ich hab beim Googlen schon was von VBS gelesen an das dann per XML die Daten übergeben werden. Wie schaut das VBS und vor allem wie muss das XML geschrieben werden.

Hat jemand von Euch ein richtiges Beispiel?

Wäre super, lieben Dank

Sutti

hi Sutti

mehrere möglichkeiten gibt es:

  • serienbrief: dein programm erstellt eine sogenannte datenquelle, also eine datei, in der die erste zeile die namen der felder darstellt und dann pro datensatz eine zeile mit den daten. im word erstellst du einen serienbrief, der auf diese datenquelle zugreift. im serienbrief selbst fügst du serienbrief-datenfelder ein (also felder, die dann die werte aus der datenquelle aufnehmen). dann mischt du den serienbrief mit der datenquelle und hast ein fertiges dokument, in dem die daten befüllt sind.
  • serienbrief2: word kann über eine odbc-schnittstelle direkt auf andere datenbanken zugreifen. in der datenbank einfach eine view definieren, die die gewünschten daten beinhaltet. im word ist es ein normaler serienbrief, nur dass die datenquelle eben keine datei sonder direkt die datenbank ist.
  • vbs/vba: vbs ist Visual Basic Script, also eine skriptsprache von microsoft, die unter windows xp standardmässig verfügbar ist und eine dem visual basic sehr ähnliche syntax hat (so ähnlich wie javascript, dass irgendwie dem java ähnelt, aber was ganz anderes ist). vba ist Visual Basic vor Applications, die sprache, die office-produkte zum erstellen von makros verwenden und die dem visual basic noch um einiges ähnlicher ist. über beide schienen kann man vorgänge im word automatisieren - mit vbs direkt aus dem betriebssystem heraus, mit vba nur aus geöffnetem word heraus (wobei vbs in diesem zusammenhang aber sehr wohl intern auch word starten muss!). in beiden fällen handelt es sich um eine vollwertige programmiersprache, mit der man dateien öffnen und deren inhalt verarbeiten kann. vbs bzw. vba selbst löst aber nicht dein problem sondern stellt nur möglichkeiten zur verfügung. wie du dein problem dann realisiert, ist dir überlassen.
  • ole-schnittstelle: etliche programme bieten eine möglichkeit, verknüpfungen zu den daten über die ole-schnittstelle herzustellen. z.b. kann man daten aus msproject direkt in word einbinden, sodass z.b. der name eines arbeitspaketes automatisch sich im word ändern, wenn er im project geändert wurde. diese möglichkeit setzt aber voraus, dass die quellanwendung das aktiv unterstützt.
  • dde: es geht natürlich auch mit dem vorläufer von ole, nur um einiges komplizierter und unkomfortabler. nicht wirklich zu empfehlen!
  • es gibt auch programme, die word komplett ignorieren: man definiert einfach rtf-dokumente, die dann direkt mit daten befüllt werden. das fertige dokument kann mit word normal geöffnet werden. diese programme können aber meist auch rtf direkt drucken oder in pdf konvertieren. beispiel dafür wäre z.b. CIB Print (ist aber sehr teuer).

zum thema vbs/vba: ob du nun xml, flatfiles oder sonstwas einsetzt ist letztendlich geschmackssache. xml-dateien sind einfach „state-of-the-art“ aber nicht notwendigerweise besser geeignet als einfache CSV-Dateien.

es gibt auch mehrere möglichkeiten, wie man daten aus einer datei ins dokument bekommt - und zwar vollautomatisiert über vbs/vba:

  • wiederum serienbrief, nur soweit automatisiert durch vbs/vba, dass der benutzer mit word möglichst wenig interagieren muss (im optimalfall nur auf ein ikon am desktop klicken)
  • man kann auch mit dokumentvariablen bzw. mit dokumenteigenschaften arbeiten. variablen sind zwar besser, eigenschaften können dafür mit standardmitteln auch kontrolliert/verarbeitet werden. auch gibt es mehrere programme, die dokumenteigenschaften verändern können, ohne dass das dokument mit word geöffnet werden muss - die daten können damit z.b. auch auf einem linux-server in die dokumente reingeschrieben werden. dokumentvariablen sind meines wissens nach nicht so gut unterstützt - bin da aber nicht so extrem gut informiert.
  • es geht auch über textmarken, was aber keine wirklichen vorteile gegenüber variablen oder eigenschaften hat.
  • natürlich geht es auch über simples suchen-und-ersetzen. würde ich aber nicht wirklich empfehlen.

bleibt nur das problem: solange ich keine ahnung habe, was genau du vorhast, kann ich dir nicht wirklich eine sinnvolle variante nenne und schon gar nicht ein beispiel liefern. interessant wäre daher:

  • welche anwendung liefert die daten?
  • in welchem format sind die daten lieferbar
  • welche möglichkeiten hast du, in der anwendung etwas zu automatisieren?
  • kann man von aussen auf die daten der anwendung zugreifen?
  • welche word-version verwendest du?
  • wie komfortabel soll die lösung sein?
    o für den anwender selbst
    o für den administrator, sobald sich änderungen ergeben
  • wie viele benutzer betrifft das ganze?
  • lösung auf einem pc, im netz in einem lan, im wan/internet?

lg
erwin

vielen Dank für Deinen ausführlichen Bericht.

So genau weiß ich selbst noch nicht, was ich möchte :smile: Ist erst mal interesse halber - bis ich mir genaue Gedanken dazu gemacht habe.

Ich kenne jetzt konkret ein Programm (OCTOOffice), in dem ich ein Word-Dokument hinterlegen kann, in mittels Textformularfelder gewünschte Felder eingefügt wurden. Dann kann ich aus OCTOOffice einen Button klicken und habe z.B. die Adresse ins Word geschrieben bekommen.

Dieses Word-Dokument enthält keinen Bezug zu Serienbrief oder ähnliches. Folglich muss irgendwie anders das Word-Dokument die Nutzdaten übergeben werden.

Eine Idee, wie das funkionieren könnte?

Sutti

mit
  WordBasic.SetFormResult
kann man scheinbar diese Felder ansteuern.

Hab aber keine Ahnung, wenn das Word aufgerufen wird, wie ich diesem dann einen Programmcode unterjubeln kann.

Vielleicht geht’s ja auch ganz anders.

will mal nicht so sein…
hi Sutti

na gut, du hast explizit nach vbs und xml gefragt, also hier eine beispiellösung:

folgende voraussetzungen:

  1. unter c:\temp gibt es ein word.dokument mit namen „vartest.doc“

es ist ein relativ normales word-dokument, in dass du an beliebiger stelle folgende Felder einfügst:

{docvariable name}
{docvariable adresse}
{docvariable telefon}

(die geschwungenen klammern erhältst du durch drücken von strg-f9)

  1. ebenfalls unter c:\temp gibt es eine xml-datei „vartest.xml“ mit folgendem inhalt:

    max musterfeldweg 11234

  2. du legst ein vbscript mit dateinamen „c:\temp\vartest.vbs“ und folgendem inhalt an:

    dim datei
    dim xml
    dim mainelement
    dim feld

    set xml = createobject(„msxml2.domdocument“)
    if not xml.load („c:\temp\vartest.xml“) then
    msgbox „XML-Daten konnte nicht geladen werden“
    stop
    end if

    set datei = getobject(„c:\temp\vartest.doc“)

    set mainelement = xml.documentelement

    setVariable „name“, mainelement.selectsinglenode("./name").text
    setVariable „adresse“, mainelement.selectsinglenode("./adresse").text
    setVariable „telefon“, mainelement.selectsinglenode("./telefon").text

    for each feld in datei.fields
    feld.update
    next

    datei.save
    datei.close

    sub setVariable(VarName, Wert)
    On Error Resume Next
    datei.Variables.Item(VarName).Value = Wert
    If Err.Number 0 Then
    datei.variables.add VarName, Wert
    end if
    End Sub

  3. einfach auf die vartest.vbs doppelt klicken

wenn du nun das word-dokument aufmachst, sollte dort, wo du deine docvariable-felder eingefügt hast, der wert aus dem dokument stehen.

noch ein paar hinweise:

  • solange eine dokumentvariable nicht angelegt ist, kommt beim referenzieren darauf entweder ein leerer text oder eine fehlermeldung
  • dokumentvariablen MÜSSEN einen inhalt haben. setzt man den inhalt auf leer, wird die variable automatisch gelöscht
  • es gibt keine möglichkeit, mit standardmitteln im word auf die variablen zuzugreifen (ausser eben über das docvariable-feld). das kann ein vorteil und ein nachteil sein

das ganze ist natürlich ein quick-and-dirty-beispiel. es fehlen alle arten von fehlerbehandlungen, kommentare usw. soll ja nur das prinzip zeigen, wie sowas möglich ist.

lg
erwin

super, vielen Dank
o.T.