VB.net, экспорт содержимого RTF TextBox в Excel Cell - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть текстовое поле 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 Образец BOLD \ b0 \ par \ par \ i Образец ITALIC \ i0 \ par \ par \ ul Образец UNDERLINE \ par \ par \ ulnone Образец нормальный \par}

(код RTF)

И

ExcelApp.Range("C2").Value = RTFTB.Text

, что дало мне

Образец BOLD

SAMPLE ITALIC

SAMPLE UNDERLINE

SAMPLE NORMAL

(без стиля шрифта)

Ответы [ 2 ]

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

Использование буфера обмена для передачи информации - это не то, что я хотел бы предложить в качестве решения.Однако я не знаю способа достижения вашей цели без преобразования RTF в последовательность команд автоматизации пользовательского интерфейса для имитации добавления текста в Excel и последующего его форматирования.

Следующий метод можно использовать для помещения RTF вБуфер обмена в виде HTML.Он использует элемент управления Webbrowser в редактируемом режиме для преобразования формата RTF буфера обмена в HTML.Затем HTML помещается в буфер обмена.

Общая последовательность:

  1. Поместите RTF в буфер обмена как RTF
  2. Создайте элемент управления WebBrowser и установите его DocumentText равным редактируемому Html.

    В обработчике событий WebBrowser.DocumentCompleted

  3. Вставить RTF в WebBrowser.

  4. Выберите все HTML и скопируйте его.
  5. Наконец, избавьтесь от элемента управления 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 
0 голосов
/ 10 апреля 2019

Я закончил тем, что НЕ выполнял решение 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()
...