Использование буфера обмена для передачи информации - это не то, что я хотел бы предложить в качестве решения.Однако я не знаю способа достижения вашей цели без преобразования RTF в последовательность команд автоматизации пользовательского интерфейса для имитации добавления текста в Excel и последующего его форматирования.
Следующий метод можно использовать для помещения RTF вБуфер обмена в виде HTML.Он использует элемент управления Webbrowser
в редактируемом режиме для преобразования формата RTF буфера обмена в HTML.Затем HTML помещается в буфер обмена.
Общая последовательность:
- Поместите RTF в буфер обмена как RTF
Создайте элемент управления WebBrowser и установите его DocumentText равным редактируемому Html.
В обработчике событий WebBrowser.DocumentCompleted
Вставить RTF в WebBrowser.
- Выберите все HTML и скопируйте его.
- Наконец, избавьтесь от элемента управления WebBrowser.
...
Public Shared Sub RtfToHtmlClipboard(rtf As String)
Clipboard.SetData(DataFormats.Rtf, rtf)
Dim browser As New WebBrowser
AddHandler browser.DocumentCompleted, Sub(sender As Object, e As WebBrowserDocumentCompletedEventArgs)
Dim wb As WebBrowser = CType(sender, WebBrowser)
wb.Document.ExecCommand("Paste", False, Nothing)
wb.Document.ExecCommand("SelectAll", False, Nothing)
wb.Document.ExecCommand("Copy", False, Nothing)
wb.Dispose()
End Sub
browser.DocumentText = "<html><body contenteditable=""true""></body></html>"
End Sub
Редактировать:
Я использую вышеупомянутое, чтобы поместить RTF как HTML в буфер обмена для вставки пользователем вручную.Следовательно, я не учел последствия использования какого-то конкретного сценария использования, например, автоматизации Excel.
Для случая автоматизации предпочтительно не создавать элемент управления каждый раз.Более того, создается впечатление, что при вставке в Excel с помощью автоматизации действуют другие механизмы (возможно, связанные с Office Clipboard?), Которые лишь подтверждают мою неприязнь к использованию буфера обмена.
Однако я обнаружил, что следующее работает для копирования отформатированного RTF в Excel.Моя версия Office старая (2007), так что, надеюсь, она все еще работает на более новых версиях.Создайте новое приложение WinForm и замените содержимое Form1.VB на следующее, чтобы протестировать его.При запуске кода нажмите кнопку «Excecute», чтобы создать экземпляр Excel, и вставьте в него какой-нибудь сформированный RTF.
Imports Excel = Microsoft.Office.Interop.Excel
Public Class Form1
Private WithEvents rtb As RichTextBox
Private WithEvents btnExecute As Button
Private editableBrowser As WebBrowser
Public Sub New()
InitializeComponent()
Setup()
End Sub
Private Sub Setup()
editableBrowser = New WebBrowser With {
.DocumentText = "<html><body contenteditable=""true""></body></html>"
}
btnExecute = New System.Windows.Forms.Button()
rtb = New System.Windows.Forms.RichTextBox()
SuspendLayout()
btnExecute.Location = New System.Drawing.Point(580, 20)
btnExecute.Size = New System.Drawing.Size(135, 50)
btnExecute.TabIndex = 0
btnExecute.Text = "Execute"
btnExecute.UseVisualStyleBackColor = True
AddHandler btnExecute.Click, AddressOf btnExecute_Click
rtb.Location = New System.Drawing.Point(20, 20)
rtb.Size = New System.Drawing.Size(450, 350)
rtb.TabIndex = 1
ClientSize = New System.Drawing.Size(800, 450)
Controls.Add(Me.rtb)
Controls.Add(Me.btnExecute)
ResumeLayout()
End Sub
Private Sub btnExecute_Click(sender As Object, e As EventArgs)
ExcelWork()
COMCleanUp()
End Sub
Private Function GetRTF1() As String
rtb.Clear()
' add some text and format it.
Dim formattedText As String = "some sample rtf"
rtb.Text = "This is " & formattedText & " to format and copy."
rtb.CreateControl()
rtb.SelectionStart = rtb.Find(formattedText)
rtb.SelectionLength = formattedText.Length
rtb.SelectionColor = Color.Red
rtb.SelectionFont = New Font(Font.FontFamily, Font.Size + 2.0F, FontStyle.Bold)
Return rtb.Rtf
End Function
Sub ExcelWork()
Dim app As New Excel.Application
Dim wb As Excel.Workbook = app.Workbooks.Add()
Dim rng As Excel.Range = DirectCast(wb.Worksheets(1), Excel.Worksheet).Range("A1")
PlaceRtfFAsHtmlOnClipboard(GetRTF1)
' for some reason rng.PasteSpecial just pastes as
' unformatted text. manual pasting results in formatted
' text.
' The Worsheet.Paste method as well as the Worsheet.PasteSpecial
' methods will paste the Clipboard HTML format
rng.Worksheet.PasteSpecial(Format:="HTML")
'rng.Worksheet.Paste(rng)
wb.Saved = True
app.Visible = True ' hand control over to user
app.UserControl = True
End Sub
Private Sub PlaceRtfFAsHtmlOnClipboard(rtf As String)
' Clear the browser
editableBrowser.Document.ExecCommand("SelectAll", False, Nothing)
editableBrowser.Document.ExecCommand("Cut", False, Nothing)
' put rtf on clipboard
Clipboard.SetData(DataFormats.Rtf, rtf)
' and paste to the editable broswer
editableBrowser.Document.ExecCommand("Paste", False, Nothing)
editableBrowser.Document.ExecCommand("SelectAll", False, Nothing)
' copy the html to the Clipboard
editableBrowser.Document.ExecCommand("Copy", False, Nothing)
End Sub
Private Sub COMCleanUp()
Do
GC.Collect()
GC.WaitForPendingFinalizers()
Loop While System.Runtime.InteropServices.Marshal.AreComObjectsAvailableForCleanup
End Sub
End Class