Вставьте RichText (из RichTextBox, RTF-файл или буфер обмена) в документ Word (закладки или найти / заменить) - PullRequest
0 голосов
/ 03 апреля 2019

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

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

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

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

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

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" (титульный лист) на " TEST ", включая форматирование жирным шрифтом. Фактические результаты: «fp» не заменяется (при использовании буфера обмена и метода поиска / замены) или заменяется на «TEST» без форматирования.

1 Ответ

1 голос
/ 03 апреля 2019

Я понял это! Я должен был сделать это странным образом, но это работает.

Следующий код сохраняет 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
...