Как получить ТОЛЬКО текст из выбранных ячеек в таблице Word? - PullRequest
1 голос
/ 29 октября 2019

Я пишу VSTO, которому нужно получить выбранный текст из электронного письма и что-то с ним делать. Я нашел / изменил некоторый код, который отлично работает, чтобы получить текст из тела письма IFF в виде обычного текста. Если текст находится в таблице, кажется, что он возвращает только первую выбранную ячейку. Если я пытаюсь проверить Application.Selection.Range.Cells, он возвращает часть таблицы, но включает выбранные ячейки и не включает все ячейки. Кто-нибудь знает, как получить выделенные клетки? Вот базовый код, который работает для получения выделенного текста из тела письма:

        Dim objExplorer As Outlook.Explorer = Globals.ThisAddIn.Application.ActiveExplorer()

        'Get the current MailItem
        Dim mailItem As Outlook.MailItem = TryCast(objExplorer.Selection(1), Outlook.MailItem)

        'Get the current TaskItem
        Dim taskItem As Outlook.TaskItem = TryCast(objExplorer.Selection(1), Outlook.TaskItem)

        'Get current ContactItem
        Dim contactItem As Outlook.ContactItem = TryCast(objExplorer.Selection(1), Outlook.ContactItem)

        'Get the current AppointmentItem
        Dim appointmentItem As Outlook.AppointmentItem = TryCast(objExplorer.Selection(1), Outlook.AppointmentItem)

        Dim inspector As Outlook.Inspector = Nothing

        If (mailItem IsNot Nothing) Then
            'Obtain Inspector object for the current MailItem
            inspector = mailItem.GetInspector
        ElseIf (taskItem IsNot Nothing) Then
            'Obtain Inspector object for the current TaskItem
            inspector = taskItem.GetInspector
        ElseIf (contactItem IsNot Nothing) Then
            'Obtain Inspector object for the current NoteItem
            inspector = contactItem.GetInspector
        ElseIf (appointmentItem IsNot Nothing) Then
            'obtain Inspector object for the current AppointmentItem
            inspector = appointmentItem.GetInspector
        End If

        If inspector Is Nothing Then
            MsgBox("Please open an item to scan.", vbOKOnly + vbExclamation)
            Return ""
        End If

        ' Obtain the Document object from the Inspector object
        Dim document As word.Document = inspector.WordEditor

        'Store the selected text to a variable
        Dim selectedText As String = If(document.Application.Selection IsNot Nothing, document.Application.Selection.Text, "")

1 Ответ

0 голосов
/ 29 октября 2019

Из вопроса

Кто-нибудь знает, как получить выбранные ячейки?

Я понимаю, что пользователь выберет несколько несмежных ячеек, ожидая, что ихсодержимое может быть прочитано.

Это невозможно;Объектная модель Word не может обрабатывать несколько выборок , даже если пользователь может их создавать (с недавних пор, фактически, объектная модель никогда не догоняла это).

Необходимо будет применить какое-то уникальное форматирование символов к Application.Selection, а затем найти каждый экземпляр этого форматирования для извлечения содержимого. Обычно это можно сделать с помощью команды «Найти в цикле» - часть цикла, чтобы взять содержимое и удалить форматирование.

Фрагмент кода ниже иллюстрирует, как это можно сделать.

  • В документ добавлен «нейтральный» стиль символов. Поскольку он основан на шрифте по умолчанию для текущего абзаца, он не будет виден пользователю.
  • Этот стиль применяется к текущему выделению. (Selection является единственной частью объектной модели, которая может работать с несколькими выбранными несмежными материалами.)
  • Весь текст документа определяется как диапазон поиска, и единственным критерием поиска являетсянейтральный стиль
  • Поиск выполняется в цикле, пока стиль найден.
  • Найденное содержимое добавляется в строку (или обрабатывается иным образом, как требуется), по умолчаниюСтиль шрифта абзаца повторно применяется к найденному диапазону. Если диапазон находится в ячейке таблицы, его необходимо применить ко всей ячейке.
  • Затем диапазон свернут перед повторением цикла.
  • В конце маркерстиль удален из документа.

    Dim doc As Word.Document = inspector.WordEditor
    Dim styl As Word.Style = doc.styles.Add("MultiSelectMarker", _
                             Word.WdStyleType.wdStyleTypeCharacter)
    styl.BaseStyle = Word.WdBuiltinStyle.wdStyleDefaultParagraphFont
    Application.Selection.Style = styl
    
    Dim rngFind As Word.Range = doc.Content
    Dim selectedContent As String
    
    With rngFind.Find
        .Text = ""
        .Format = True
        .Style = styl
        .Wrap = Word.WdFindWrap.wdFindStop
        Do While .Execute
          'Concatenate the non-contiguous selections' content
          selectedContent = selectedContent & rngFind.Text & " "
          If rngFind.Information(Word.WdInformation.wdWithInTable) Then
            'Extend the range to include the cell structures so that
            'applying the default style does not result in Find.Execute = true
            rngFind.Cells(1).Range.Style = Word.WdBuiltinStyle.wdStyleDefaultParagraphFont
          Else
            rngFind.Style = Word.WdBuiltinStyle.wdStyleDefaultParagraphFont
          End If
          'Move outside the found Range so that the search continues
          rngFind.Collapse wdCollapseEnd
        Loop
    End With
    Debug.Print(selectedContent)
    styl.Delete
    
...