Вставить богатый текст (из RichTextBox, RTF-файла или буфера обмена) в документ Word (закладки или найти / заменить)

#vb.net #ms-word #rtf #bookmarks

#vb.net #ms-word #rtf #закладки

Вопрос:

Подводя итог тому, что я пытаюсь сделать, я работаю в некоммерческой организации, которая рассылает письма с подтверждением, когда кто-то жертвует нам деньги (в основном, спасибо). У нас есть несколько разных писем, которые пишутся каждый месяц и отправляются в IS для «обработки». Я хотел бы сделать это максимально эффективным и использовать как можно меньше времени для IS, поэтому я создал программу в VB.NET который берет содержимое и вставляет его в шаблон с помощью Word bookmarks, обновляет таблицу в SQL, чтобы письмо можно было протестировать с использованием оперативных данных, и отправляет электронное письмо в производственный отдел, сообщая им о необходимости протестировать письмо. Он работает полностью, за исключением…

Я ни за что на свете не могу понять, как сохранить формат RTF (RichText) при вставке содержимого в шаблон письма.

Я попытался сохранить содержимое RichTextBox в виде RTF-файла, но я не могу понять, как вставить содержимое RTF-файла в мой шаблон документа и заменить закладку.

Я пробовал использовать буфер обмена.setText, odoc ……Метод вставки, но он ненадежен, поскольку я не могу точно указать, куда я хотел бы вставить текст. Функция поиска / замены не очень полезна, потому что все закладки, которые я пытаюсь заменить, находятся в текстовых полях.

Я бы показал некоторый код, но большая его часть была удалена из-за разочарования из-за того, что он не работает. В любом случае, вот некоторый код, с которым я работал:

 Private Sub testing()
        strTemplateLocation = "\SERVERAcknowledgementLettersTESTTEMPLATE.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("\SERVERAcknowledgementLettersTESTTEST.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 — Требуется форматированный текст (например: «ТЕСТ«), который будет вставлен в документ Word либо в качестве закладки, либо в качестве заменяющего текста.

Ожидаемые результаты: Замените закладку «fp» (первая страница) на «ТЕСТ«, включая выделение жирным шрифтом. Фактические результаты: «fp» не заменяется (при использовании буфера обмена и метода поиска / замены) или заменяется как «ТЕСТ» без форматирования.

Комментарии:

1. Есть ли причина не использовать mailmerge для создания писем — даже автоматизированного для вывода отдельной буквы для каждой записи?

2. Извините за путаницу. Эта программа просто создает шаблоны, в которых есть другие закладки. Так, например, в одном шаблоне письма может быть написано «Спасибо за ваше пожертвование <пожертвование>» и предоставлено объяснение того, на что они пожертвовали, в то время как другой может быть для ежемесячного пожертвования и сказать что-то вроде «Спасибо за ваше ежемесячное пожертвование <пожертвование>, которое помогает нам продолжать нашу миссию». Я создал отдельную программу, которая использует слияние почты и Gembox для создания PDF-файлов с фактическими данными («Спасибо, мистер Смит, за ваше пожертвование в размере $ 5,00» и т.д.).

Ответ №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