Worddatei in Richtextbox einlesen

  • VB.NET

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

    Worddatei in Richtextbox einlesen

    Tach auch,

    ich würde gerne eine Worddatei in eine Richtextbox einlesen, jedoch soll die Formatierung dabei erhalten bleiben.
    Mit meinem Code jedoch geht das nicht. In der Richtextbox steht nur Plaintext.
    Was mache ich hier falsch?

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports Microsoft.Office.Interop
    3. Public Class Form1
    4. Public strPfad As String = Replace(CurDir(), "Wordlesen\bin\Debug", "")
    5. Private Sub CmdRTFLesen_Click(sender As Object, e As EventArgs) Handles CmdRTFLesen.Click
    6. RichTextBox1.LoadFile(strPfad & "worddatei.rtf")
    7. End Sub
    8. Private Sub CmdWordLesen_Click(sender As Object, e As EventArgs) Handles CmdWordLesen.Click
    9. Dim objWord As New Word.Application()
    10. Dim objDocument As Word.Document
    11. Dim WrdText As String
    12. objWord = DirectCast(CreateObject("Word.Application"), Word.Application)
    13. objWord.Visible = False
    14. objDocument = objWord.Documents.Open(strPfad & "worddatei.doc", , True)
    15. WrdText = objDocument.Content.Text
    16. RichTextBox1.Text = WrdText.ToString
    17. objDocument.Close()
    18. objWord.Application.Quit()
    19. End Sub
    20. End Class
    Dateien
    • Wordlesen.zip

      (96,36 kB, 55 mal heruntergeladen, zuletzt: )
    Mit freundlichen Dinges

    Lupus
    P.S: bei allen meine Fragen beziehen sich auf das arbeiten mit Visual Studio 2019 auf Win 10/64 bit und MySQL
    @Lupusverlach Du musst der RTB sagen, dass sie einen Rich-Text einlesen soll:

    VB.NET-Quellcode

    1. RichTextBox1.LoadFile("PATH", RichTextBoxStreamType.RichText)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallöschen,

    das funktioniert aber nur bei einer echten RTF Datei. :(

    RodFromGermany schrieb:

    Du musst der RTB sagen, dass sie einen Rich-Text einlesen soll:

    Wenn ich damit eine Worddatei einlesen möchte bekomme ich die Fehlermeldung System.ArgumentException: Ungültiges Dateiformat.
    Mit freundlichen Dinges

    Lupus
    P.S: bei allen meine Fragen beziehen sich auf das arbeiten mit Visual Studio 2019 auf Win 10/64 bit und MySQL
    @Lupusverlach Eine RTB kann keine Word-Datei lesen, sondern nur PlaunText und RTF.
    Du kannst ja mal probieren, ob Du das über die Zwischenablage lösen kannst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany hat dir da leider schon die Antwort gegeben, die du dir selbst auch schon gegeben hattest. Zitat : Mit meinem Code jedoch geht das nicht. In der Richtextbox steht nur Plaintext.
    Schau mal auf folgender Seite nach, da wird dir erklärt warum es nicht geht. add-in-express.com/creating-ad…document-content-objects/

    RodFromGermany schrieb:

    Du kannst ja mal probieren, ob Du das über die Zwischenablage lösen kannst.

    Die Lösung hier ging schneller:

    petaod schrieb:

    Öffne die Word-Datei, speichere sie im RTF-Format, öffne die RTF-Datei und lade sie in die RTB.


    So sieht mein Code nun aus:

    VB.NET-Quellcode

    1. Private Sub CmdWordLesen_Click(sender As Object, e As EventArgs) Handles CmdWordLesen.Click
    2. Dim objWord As New Word.Application()
    3. Dim objDocument As Word.Document
    4. objWord = DirectCast(CreateObject("Word.Application"), Word.Application)
    5. objWord.Visible = False
    6. objDocument = objWord.Documents.Open(strPfad & "worddatei.docx", , True)
    7. objDocument.SaveAs2(FileName:=strPfad & "word.rtf", FileFormat:=6)
    8. objDocument.Close()
    9. objWord.Application.Quit()
    10. RichTextBox1.LoadFile(strPfad & "word.rtf", RichTextBoxStreamType.RichText)
    11. If My.Computer.FileSystem.FileExists(strPfad & "word.rtf") = True Then
    12. My.Computer.FileSystem.DeleteFile(strPfad & "word.rtf")
    13. End If
    14. End Sub


    Die RichTextBox1 ist hängt jedoch an einer BindingSource. Also in der Anwendung wo ich sie dann brauche, nicht hier im Beispiel.
    Wenn ich dort speichere oder einfach auch nur einen Datensatz weiter gehe (ohne zu speichern) und dann wieder zurück. Ja dann ist die Formatierung vollständig wieder weg und nur PalinText zu sehen.

    Was läuft hier schief?

    Gespeichert wird hier so:

    VB.NET-Quellcode

    1. Private Sub BtnSpeichern_Click(sender As Object, e As EventArgs) Handles BtnSpeichern.Click
    2. Try
    3. Me.Validate()
    4. Me.projekteBindingSource.EndEdit()
    5. Me.projekteTableAdapter.Update(PVDataSet.projekte)
    6. Catch ex As Exception
    7. MsgBox("Update failed")
    8. End Try
    9. End Sub
    Mit freundlichen Dinges

    Lupus
    P.S: bei allen meine Fragen beziehen sich auf das arbeiten mit Visual Studio 2019 auf Win 10/64 bit und MySQL
    Habs hinbekommen :D

    Der Code sieht nun so aus

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports Microsoft.Office.Interop
    3. Public Class Form1
    4. Public strPfad As String = Replace(CurDir(), "Wordlesen\bin\Debug", "") ' Für die Testzwecke wird der Ort angegeben wo die Testworddateien liegen.
    5. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    6. 'TODO: Diese Codezeile lädt Daten in die Tabelle "WordreadDataSet.RTFInhalt". Sie können sie bei Bedarf verschieben oder entfernen.
    7. Me.RTFInhaltTableAdapter.Fill(Me.WordreadDataSet.RTFInhalt)
    8. Dim Skill As New Binding("Rtf", BSRichText, "Skill", True)
    9. Me.RichTextBox1.DataBindings.Add(Skill)
    10. End Sub
    11. ' Einlesen einer RTF Datei
    12. Private Sub CmdRTFLesen_Click(sender As Object, e As EventArgs) Handles CmdRTFLesen.Click
    13. RichTextBox1.LoadFile(strPfad & "worddatei.rtf", RichTextBoxStreamType.RichText)
    14. End Sub
    15. ' Einlesen einer Worddatei. Jedoch kann VB.NET diese nicht einlesen
    16. ' Die Wortdatei öffnen und als RTF speichern. Das kann dann gelesen werden.
    17. ' Die RTF wird hier nach dem Einlesen wieder gelöscht
    18. Private Sub CmdWordLesen_Click(sender As Object, e As EventArgs) Handles CmdWordLesen.Click
    19. Dim objWord As New Word.Application()
    20. Dim objDocument As Word.Document
    21. objWord = DirectCast(CreateObject("Word.Application"), Word.Application)
    22. objWord.Visible = False
    23. objDocument = objWord.Documents.Open(strPfad & "worddatei.docx", , True)
    24. objDocument.SaveAs2(FileName:=strPfad & "word.rtf", FileFormat:=6)
    25. objDocument.Close()
    26. objWord.Application.Quit()
    27. RichTextBox1.LoadFile(strPfad & "word.rtf", RichTextBoxStreamType.RichText)
    28. If My.Computer.FileSystem.FileExists(strPfad & "word.rtf") = True Then
    29. My.Computer.FileSystem.DeleteFile(strPfad & "word.rtf")
    30. End If
    31. End Sub
    32. 'Speichern der Datensätze.
    33. ' Hier muss der Bezug geschaffen werden, das RTF auch gepsiechert werden kann
    34. Private Sub BtnSpeichern_Click(sender As Object, e As EventArgs) Handles BtnSpeichern.Click
    35. Dim intPos As Integer = BSRichText.Position ' Aktuelle Position auslesen
    36. Me.Validate()
    37. Me.BindingContext(BSRichText).EndCurrentEdit() ' Ein Bezug zu RTF musste noch rein
    38. Me.RTFInhaltTableAdapter.Update(WordreadDataSet.RTFInhalt)
    39. ' Der einfacherhalber wird der TableAdapter einfach nur neu geladen
    40. Me.RTFInhaltTableAdapter.Fill(Me.WordreadDataSet.RTFInhalt)
    41. Me.BSRichText.Position = intPos ' Zurück zur akutellen Position
    42. End Sub
    43. Private Sub Button_Click(sender As Object, e As EventArgs) Handles BtnPrevious.Click, BtnNext.Click, BtnLast.Click, BtnFirst.Click
    44. Select Case True
    45. Case sender Is BtnPrevious : BSRichText.MovePrevious()
    46. Case sender Is BtnNext : BSRichText.MoveNext()
    47. Case sender Is BtnLast : BSRichText.MoveLast()
    48. Case sender Is BtnFirst : BSRichText.MoveFirst()
    49. End Select
    50. End Sub
    51. End Class


    Verbesserungsvorschläge willkommen. Will ja was lernen.
    Dateien
    • Wordlesen.zip

      (169,84 kB, 60 mal heruntergeladen, zuletzt: )
    Mit freundlichen Dinges

    Lupus
    P.S: bei allen meine Fragen beziehen sich auf das arbeiten mit Visual Studio 2019 auf Win 10/64 bit und MySQL