#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