我有一个RichTextFormat文本框,其中包含多行,粗体,下划线和斜体文本。我需要将文本和字体样式都粘贴到Excel单元格中,因此“ SAMPLE ”仍然是“ SAMPLE ”,而不是“ SAMPLE”或“ SAMPLE \ b0” \ par“。
我目前正在尝试
ExcelApp.Range("C2").Value = RTFTB.Rtf
那给了我
{\ rtf1 \ ansi \ ansicpg1252 \ deff0 \ deflang1036 {\ fonttbl {\ f0 \ fnil \ fcharset0 Calibri;}} \ viewkind4 \ uc1 \ pard \ b \ f0 \ fs23采样粗体\ b0 \ par \ par \ i SAMPLE ITALIC \ i0 \ par \ par \ ul SAMPLE UNDERLINE \ par \ par \ ulnone样本正常\标准 }
(RTF代码)
和
ExcelApp.Range("C2").Value = RTFTB.Text
那给了我
粗体
SAMPLE ITALIC
样品下划线
样品正常
(没有字体)
答案 0 :(得分:1)
我不建议使用剪贴板传输信息。但是,如果不将RTF转换为一系列UI Automation命令以模拟将文本添加到Excel然后对其进行格式化,我将无法实现您的目标。
可以使用以下方法将RTF作为HTML放置在剪贴板上。它在可编辑模式下使用len( tokenlist )
控件将剪贴板的RTF格式转换到HTML。然后将HTML放置在剪贴板上。
总体顺序为:
创建一个WebBrowser控件并将其DocumentText设置为可编辑的HTML。
在WebBrowser.DocumentCompleted事件处理程序中,
将RTF粘贴到WebBrowser。
...
Webbrowser
编辑:
我使用以上内容将RTF作为HTML放在剪贴板上,以供用户手动粘贴。因此,我没有考虑使用时间紧迫的用例(例如Excel自动化)的含义。
对于自动化情况,最好不要每次都创建控件。此外,通过自动粘贴到Excel(可能与Office剪贴板有关)时,似乎还有其他机制在起作用,这再次表明我不喜欢使用剪贴板。
但是,我发现以下起作用可以将格式化的RTF复制到Excel。我的Office版本比较旧(2007),因此希望它在新版本上仍然适用。创建一个新的WinForm应用程序,并用以下内容替换Form1.VB内容以对其进行测试。在运行代码时,单击“执行”按钮创建一个Excel实例,并将一些已格式化的RTF粘贴到该实例。
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
答案 1 :(得分:0)
我最终没有做RTF to HTML to Excel解决方案,因为我没有必要的技能
相反,我是这样做的:
复制整个RichTextBox
将其粘贴到Word
复制Word文档
将其粘贴到Excel
这不是完美的,因为它变成了图像而不是文本,但至少可以正常工作。
这是我的代码:
'Phase 1 : Copy the RichTextBox
TbRTF.SelectAll()
TbRTF.Copy()
Clipboard.SetData(DataFormats.Rtf, TbRTF.Rtf)
'Prepare phase 2 : Declare variables
Dim aDoc As Word.Document = WordApp.Documents.Open("a blank word file.docx")
Dim TheRange As Word.Range = aDoc.ActiveWindow.Selection.Range
'Phase 2 : Paste into Word
WordApp.Visible = False
TheRange.WholeStory()
TheRange.Paste()
'Phase 3 : Copy from Word
TheRange.WholeStory()
WordApp.ActiveDocument.Select()
WordApp.Selection.Copy()
'Phase 3.5 : Close Word
aDoc.Close()
WordApp.Quit()
'Phase 4 : Paste into Excel
ExcelApp.Range("D" & r).PasteSpecial()
'Phase 4.5 : Close Excel
Classeur.SaveAs("FinishedExcelFile.xlsx")
Classeur.Close()
ExcelApp.Quit()