mit VB .NET Worddokument öffnen und Textmarken "füllen"

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Soulfang.

    mit VB .NET Worddokument öffnen und Textmarken "füllen"

    Moin moin erstmal in die Runde,

    ich möchte aus einer Windows-Forms-Anwendung heraus ein Worddukument öffnen und dort an den vorhanden Textmarken den Inhalt von Variablen und Textboxen einfügen.

    Von der Sache her klappt die Übergabe, nur im Worddukument werden die Variableninhalte alle an ein und derselben Stelle eingefügt, oder aber auch (reproduzierbar, aber unverständlich) wild durcheinander. Soll heissen, die "Word springt nicht an die entsprechende Textmarke".

    Hier der Quellcode, den ich verwende (hatte ich im Netz gefunden und entsprechend angepasst) :

    Zur (vllt wichtigen) Info
    • "Imports Microsoft.Office.Interop.Word" löste haufenweise Fehler aus, da es dadurch wohl Irritationen mit Namespaces gab :/
    • der Verweis auf Microsoft Word 14.0 Object Library ist gesetzt
    • ich verwende Visual Studio 2013 und Word 2010
    • ich bin, sagen wir mal, fortgeschrittener Programmierneuling ;)

    VB.NET-Quellcode

    1. Private Sub word_starten()
    2. Dim Anrede, Name, Beginnjahr As String
    3. Anrede = dt.Rows(pos).Item("Anrede").ToString
    4. Name = Kd_Name.Text.ToString
    5. Beginnjahr = Date.ParseExact(Kd_Tarif_seit.Text, "dd.MM.yyyy", Nothing).Year.ToString
    6. Dim word As New Microsoft.Office.Interop.Word.Application
    7. Dim doc As Microsoft.Office.Interop.Word.Document
    8. Try
    9. word.Visible = True 'Word sehen zum Test?
    10. doc = word.Documents.Open("1.docx")
    11. 'doc.Protect(WdProtectionType.wdNoProtection)
    12. doc.Activate()
    13. word.ActiveDocument.Bookmarks("Vorname").Range.Text = Kd_Vorname.Text
    14. word.ActiveDocument.Bookmarks("Name").Range.Text = Kd_Name.Text
    15. word.ActiveDocument.Bookmarks("Strasse").Range.Text = Kd_Strasse.Text
    16. word.ActiveDocument.Bookmarks("Hausnummer").Range.Text = Kd_Hausnummer.Text
    17. word.ActiveDocument.Bookmarks("Plz").Range.Text = Kd_Plz.Text
    18. word.ActiveDocument.Bookmarks("Ort").Range.Text = Kd_Ort.Text
    19. word.ActiveDocument.Bookmarks("Briefanrede").Range.Text = Kd_Briefanrede.Text
    20. word.ActiveDocument.Bookmarks("Beginnjahr").Range.Text = Beginnjahr
    21. word.ActiveDocument.Bookmarks("Anrede").Range.Text = Anrede
    22. word.ActiveDocument.Bookmarks("Name1").Range.Text = Name
    23. word.Visible = True
    24. 'doc.Protect(WdProtectionType.wdAllowOnlyReading)
    25. ' doc.Activate()
    26. 'doc.SaveAs("c:\\test.doc")
    27. 'doc.Close()
    28. 'MessageBox.Show("Datei erstellt")
    29. Catch ex As Exception
    30. MessageBox.Show(ex.ToString)
    31. ' Log.SaveLogFile(ex.ToString)
    32. 'Finally
    33. ' word.Application.Quit()
    34. End Try
    35. End Sub


    Eigentlich sollte doch ein gezielte Springen zur nächsten Textmarke wegen der Verwendung von XXX.Bookmarks("XXX").Range.Text nicht notwendig sein, oder bin ich da nun auf dem Holzweg?

    Hat jemand eine zündene Idee?

    Vielen Dank schon mal.
    Die Bookmarks kann ich dir nicht unbedingt empfehlen, da du ja immer eine Vorlage dazugeben musst. Mit den Bookmarks hatte ich aber auch mal angefangen.
    Mittlerweile habe ich mir aber eine kleine Word-Klasse geschrieben, die die ganze Dokumentenerstellung etwas erleichtert.
    Gestalte das Dokument lieber zur Laufzeit - folgende Links haben mir geholfen:
    • https://msdn.microsoft.com/de-de/library/bb157880.aspx
    • https://msdn.microsoft.com/de-de/library/kw65a0we.aspx
    • http://www.vb-gera.de/bibliothek/code/ownwordrange.htm
    • http://support.microsoft.com/kb/316383/de
    soooo ...

    hab da nun anders gelöst

    Jetzt habe ich in der Dokumentvorlage eindeutige Bezeichner eingefügt und lasse diese von meiner Anwendung suchen und ersetzten:

    VB.NET-Quellcode

    1. Dim word As New Microsoft.Office.Interop.Word.Application
    2. Dim doc As Microsoft.Office.Interop.Word.Document
    3. Try
    4. word.Visible = True 'Word sehen zum Test?
    5. doc = word.Application.Documents.Add(System.AppDomain.CurrentDomain.BaseDirectory & "\Vorlage.dotx")
    6. doc.Activate()
    7. With word.Selection.Find
    8. ' .ClearFormatting()
    9. .Text = "BEZEICHNER_SUCHTEXT"
    10. .Replacement.ClearFormatting()
    11. .Replacement.Text = "Ersatztext"
    12. .Execute(Replace:=WdReplace.wdReplaceAll)
    13. .Text = "BEZEICHNER_SUCHTEXT1"
    14. .Replacement.ClearFormatting()
    15. .Replacement.Text = "Ersatztext1"
    16. .Execute(Replace:=WdReplace.wdReplaceAll)
    17. 'und so weiter
    18. End With
    19. ' bei Textfeldern mus man ein wenig fummeln, habe in Word keien Möglichkeit gefunden, Textfelder dort zu benennen
    20. word.ActiveDocument.Shapes(1).Select()
    21. With word.Selection.Find
    22. ' .ClearFormatting()
    23. .Text = "BEZEICHNER_SUCHTEXT2"
    24. .Replacement.ClearFormatting()
    25. .Replacement.Text = "Ersatztext2"
    26. .Execute(Replace:=WdReplace.wdReplaceAll)
    27. 'und so weiter
    28. End With


    Falls das dann jemandem, der vor dem gleichen Problem steht weiter hilft ;)
    Hallo zusammen,

    das ist mein 1. Post in diesem Forum und ich habe mich extra dafür angemeldet, also hoffe ich, dass mir jemand bei meinem Problem helfen kann :)
    Erstmal Danke an Frank, auch wenn dieser Thread hier schon etwas älter ist. Allerdings hat mir sein Quellcode sehr geholfen. Jetzt habe ich nur ein Problem. Und zwar ist mein "Ersatztext" (also der über die .Replacement.Text Funktion eingefügt wird) zu lang.

    Wenn mein Programm zu dem Punkt kommt, bei dem es einen zu langen Ersatztext einfügen sollen bekomme ich also die Fehlermeldung:

    Ein Ausnahmefehler des Typs "System.Runtime.InteropServices.COMException" ist in Programm.exe aufgetreten.
    {"Parameter für Zeichenkette zu lang."}


    Jetzt meine Frage? Kennt vielleicht jemand eine andere Lösung zum Ersetzen, die mir das Einfügen eines längeren Texts ermöglicht?

    Gruß
    Benny

    petaod schrieb:

    Finden - Löschen - Einfügen


    ...warum sehe ich nur immer das einfachste nicht^^" - Naja danke sehr :D


    EDIT: Wenn jemand konkrete Befehle (für Suchen, Löschen, Einfügen) hätte wäre ich demjenigen dennoch sehr dankbar.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Soulfang“ ()