VB.net,正在将 RTF 文本框内容导出到 Excel 单元格
VB.net, exporting RTF TextBox content to Excel Cell
我有一个包含多行、粗体、下划线和斜体文本的 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 SAMPLE BOLD\b0\par
\par
\i SAMPLE ITALIC\i0\par
\par
\ul SAMPLE UNDERLINE\par
\par
\ulnone SAMPLE NORMAL\par
}
(RTF 代码)
和
ExcelApp.Range("C2").Value = RTFTB.Text
这给了我
SAMPLE BOLD
SAMPLE ITALIC
SAMPLE UNDERLINE
SAMPLE NORMAL
(无字体样式)
使用剪贴板传输信息不是我想推荐的解决方案。但是,我知道如果不将 RTF 转换为一系列 UI 自动化命令来模拟将文本添加到 Excel 然后对其进行格式化,就无法实现您的目标。
可以使用以下方法将RTF作为Html放置在剪贴板上。它在可编辑模式下使用 Webbrowser
控件 将剪贴板的 RTF 格式 转换为 Html。 Html 然后被放置在剪贴板上。
整体顺序为:
- 将 RTF 作为 RTF 文件放在剪贴板上
创建一个 WebBrowser 控件并将其 DocumentText 设置为可编辑Html。
在WebBrowser.DocumentCompleted事件处理程序中,
将 RTF 粘贴到 WebBrowser。
- Select所有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 剪贴板有关?),这再次证实了我不喜欢使用剪贴板。
但是,我发现以下 可以 将格式化的 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
我最终没有做 RTF 到 HTML 到 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()
我有一个包含多行、粗体、下划线和斜体文本的 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 SAMPLE BOLD\b0\par \par \i SAMPLE ITALIC\i0\par \par \ul SAMPLE UNDERLINE\par \par \ulnone SAMPLE NORMAL\par }
(RTF 代码)
和
ExcelApp.Range("C2").Value = RTFTB.Text
这给了我
SAMPLE BOLD
SAMPLE ITALIC
SAMPLE UNDERLINE
SAMPLE NORMAL
(无字体样式)
使用剪贴板传输信息不是我想推荐的解决方案。但是,我知道如果不将 RTF 转换为一系列 UI 自动化命令来模拟将文本添加到 Excel 然后对其进行格式化,就无法实现您的目标。
可以使用以下方法将RTF作为Html放置在剪贴板上。它在可编辑模式下使用 Webbrowser
控件 将剪贴板的 RTF 格式 转换为 Html。 Html 然后被放置在剪贴板上。
整体顺序为:
- 将 RTF 作为 RTF 文件放在剪贴板上
创建一个 WebBrowser 控件并将其 DocumentText 设置为可编辑Html。
在WebBrowser.DocumentCompleted事件处理程序中,
将 RTF 粘贴到 WebBrowser。
- Select所有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 剪贴板有关?),这再次证实了我不喜欢使用剪贴板。
但是,我发现以下 可以 将格式化的 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
我最终没有做 RTF 到 HTML 到 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()