Перебор текста и изображений внутри абзаца Word - PullRequest
0 голосов
/ 10 декабря 2018

Я хотел бы пройтись по «объектам» в абзаце документа Word.Допустим, этот абзац содержит только символы и изображения.

Я нашел способ перебора символов:

For Each lCharacter In pParagraph.Range.Characters
   ...
Next

Я также нашел способ перебора изображений:

For Each lInlineShape In pParagraph.Range.InlineShapes
   ...
Next

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

Мне нужно перебирать каждый «объект» по порядку (как символ, так и изображение).или что-то еще), найдите тип объекта и сделайте с ним что-нибудь соответственно.

Есть ли способ сделать это?

(На самом деле, я нашел подсказку: этоКажется, что первый цикл дает мне символ "/", когда есть изображение ... Но я не могу проверить, означает ли это, что "/" означает, что там есть изображение, или если текст на самом деле содержит символ "/").

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Объектная модель Word на самом деле не была разработана с учетом этого.Это может быть сделано, но будет довольно медленно.Работа с базовым Word Open XML сделает это лучше и, вероятно, будет намного быстрее.Однако ...

Одной из возможностей является зацикливание символов и проверка Range.InlineShapes.Count.Если символом является InlineShape, то число будет больше 0 (оно должно быть одним):

Sub IsCharacterImage()
    Dim c As Word.Range

    For Each c In Selection.Characters
        If c.InlineShapes.Count > 0 Then
            Debug.Print "Is an image"
        Else
            Debug.Print "Is not an image"
        End If
    Next
End Sub

Другой, хотя и не очень надежный подход, будет получить Start или * 1009.* свойство объектов в циклах показано в вопросе и сравните их, чтобы определить, в каком порядке отображается содержимое.

Проблема этого подхода заключается в том, что если в Range есть скрытые символы, коды полей илиВ других невидимых «контрольных символах» в тексте эти значения могут быть неточными.В общем, я бы склонялся к первому подходу ...

Sub StartCharImage()
    Dim pParagraph As Word.Paragraph, lcharacter As Word.Range
    Dim linlineshape As Word.InlineShape
    Dim sCharStart As String, sImgStart As String
    Dim aCharStart As Variant, aImgStart As Variant

    Set pParagraph = ActiveDocument.paragraphs(1)
    For Each lcharacter In pParagraph.Range.Characters
       sCharStart = sCharStart & lcharacter.Start & ","
    Next
    sCharStart = Left(sCharStart, Len(sCharStart) - 1)
       Debug.Print sCharStart
    aCharStart = Split(sCharStart, ",")

    For Each linlineshape In pParagraph.Range.InlineShapes
        sImgStart = sImgStart & linlineshape.Range.Start & ","
    Next
    sImgStart = Left(sImgStart, Len(sImgStart) - 1)
    Debug.Print sImgStart
    aImgStart = Split(sImgStart, ",")
End Sub
0 голосов
/ 10 декабря 2018

Вы должны разбить эти вещи на отдельные запросы по какой-либо категории объектов, будь то Документ или Абзац внутри документа.

Вы можете искать InlineShapes на уровне документа ...

Dim iShp As Word.InlineShape
For Each iShp In ActiveDocument.InlineShapes
    If iShp.Type = wdInlineShapePicture Then
        'do something
    End If
Next

Или, если вы хотите рассматривать «Параграфы» как основную группу, то сработает что-то подобное, и вы можете включить просмотр символов в диапазоне ...

Dim iShp As Word.InlineShape, oPara As Word.Paragraph
Dim chr As Variant
For Each oPara In ActiveDocument.Paragraphs
    For Each iShp In oPara.Range.InlineShapes
        If iShp.Type = wdInlineShapePicture Then
            'do something
        End If
    Next
    For Each chr In oPara.Range.Characters
        Debug.Print chr
    Next
Next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...