将RichText(来自RichTextBox,RTF文件或剪贴板)插入Word文档(书签或查找/替换)

时间:2019-04-03 19:22:23

标签: vb.net ms-word rtf bookmarks

总结一下我要做的事情,我在一个非营利组织工作,当有人向我们捐款时,该组织会发出致谢信(基本上是谢谢您)。我们每个月都会写出多个不同的信件,并发送给IS进行“处理”。我想使其高效并尽可能少地用于IS,因此我在VB.NET中创建了一个程序,该程序将内容并使用Word书签将其粘贴到模板中,并更新SQL中的表,以便可以使用实时数据对这封信进行测试,然后向生产部门发送电子邮件,让他们知道如何对这封信进行测试。它可以正常工作,除了...

当我将内容插入信函模板时,我一生都无法弄清楚如何保留RTF(RichText)。

我尝试将RichTextBox的内容另存为RTF文件,但是我不知道如何将RTF文件的内容插入到我的文档模板中并替换书签。

我尝试使用Clipboard.SetText,odoc ...... Paste方法,但是它不可靠,因为我无法准确说明要粘贴文本的位置。查找/替换功能不是很有用,因为我要替换的所有书签都在文本框中。

我将显示一些代码,但是由于无法正常工作,大部分代码出于沮丧而删除了。无论哪种方式,这都是我一直在使用的一些代码:

Private Sub testing()
        strTemplateLocation = "\\SERVER\AcknowledgementLetters\TEST\TEMPLATE.dot"
        Dim Selection As Word.Selection
        Dim goWord As Word.Application
        Dim odoc As Word.Document

        goWord = CreateObject("Word.Application")
        goWord.Visible = True
        odoc = goWord.Documents.Add(strTemplateLocation)

        Clipboard.Clear()
        Clipboard.SetText(txtPreD.Rtf, TextDataFormat.Rtf)
        odoc.Content.Find.Execute(FindText:="<fp>", ReplaceWith:=My.Computer.Clipboard.GetText)

        'Code for looping through all MS Word Textboxes, but didn't produce desired results
        For Each oCtl As Shape In odoc.Shapes
            If oCtl.Type = Microsoft.Office.Core.MsoShapeType.msoTextBox Then
                oCtl.TextFrame.TextRange.Text.Replace("<fp>", "Test")
                goWord.Selection.Paste()
            End If
        Next

        'Clipboard.Clear()
        'Clipboard.SetText(txtPostD.Rtf, TextDataFormat.Rtf)
        'odoc.Content.Find.Execute(FindText:="<bp>", ReplaceWith:="")
        'goWord.Selection.Paste()

        MsgBox("Click Ok when finished checking.")

        odoc.SaveAs2("\\SERVER\AcknowledgementLetters\TEST\TEST.docx")
        odoc = Nothing
        goWord.Quit(False)
        odoc = Nothing
        goWord = Nothing
    End Sub

...这是设置书签的默认代码。只要不需要格式化,它就可以完美地工作:


Private Sub SetBookmark(odoc As Object, strBookmark As String, strValue As String)
    Dim bookMarkRange As Object


    If odoc.Bookmarks.Exists(strBookmark) = False Then
        Exit Sub
    End If

    bookMarkRange = odoc.Bookmarks(strBookmark).Range


    If ((Err.Number = 0) And (Not (bookMarkRange Is Nothing))) Then

        bookMarkRange.text = strValue

        odoc.Bookmarks.Add(strBookmark, bookMarkRange)

        bookMarkRange = Nothing
    End If
End Sub

TL; DR-需要格式化的文本(例如:“ TEST ”)作为书签或替换文本插入Word文档。

预期结果:用包括粗体格式的“ 测试”替换“ fp”(首页)书签。 实际结果:“ fp”未被替换(使用剪贴板和查找/替换方法时),或者被替换为“ TEST”且未格式化。

1 个答案:

答案 0 :(得分:1)

我知道了!我不得不以一种奇怪的方式来做到这一点,但它确实有效。

以下代码将RichTextBox保存为.rtf文件:

RichTextBoxName.SaveFile("temp .rtf file location")

然后我使用以下代码将.rtf文件插入书签:

goWord.ActiveDocument.Bookmarks("BookmarkName").Select()
goWord.Selection.InsertFile(FileName:="temp .rtf file location")

然后我删除了临时文件:

If My.Computer.FileSystem.FileExists("temp .rtf file location") Then
    My.Computer.FileSystem.DeleteFile("\temp .rtf file location")
End If