Ошибки в Microsoft Word - PullRequest
       29

Ошибки в Microsoft Word

5 голосов
/ 21 июля 2010

Я работаю с ошибками в Microsoft Word.С помощью всего лишь нескольких орфографических ошибок доступ к коллекции SpellingErrors становится слишком медленным (по крайней мере, с циклами For / Next или For / Each).

Есть ли способ получить список (сделать копию, скопировать)записи, остановить динамический характер коллекции) быстро?Мне просто нужен список, моментальный снимок, чтобы он не был динамическим или в реальном времени.

1 Ответ

5 голосов
/ 23 июля 2010

Вот как я бы симулировал создание и проверку орфографических ошибок:

Sub GetSpellingErrors()
    ''# Turn off auto-spellchecking
    Application.Options.CheckSpellingAsYouType = False
    ''# Set document
    Dim d As Document
    Set d = ActiveDocument
    ''# Insert misspelled text
    d.Range.Text = "I wantedd to beet hym uup to rite some rongs."
    ''# Get spelling errors
    Dim spellErrs As ProofreadingErrors
    Set spellErrs = d.SpellingErrors
    ''# Dump spelling errors to Immediate window
    For spellErr = 1 To spellErrs.Count
        Debug.Print spellErrs(spellErr).Text
    Next
    ''# Turn back auto-spellchecking
    Application.Options.CheckSpellingAsYouType = True
End Sub

Тестирование на моей стороне выполняется очень быстро, как в Word 2003, так и в Word 2010. Обратите внимание, что это даст вам шесть орфографических ошибок, а не четыре. Хотя «свекла» и «обряд» являются словами на английском языке, они считаются «с ошибками» в контексте этого предложения.

Обратите внимание на Application.Options.CheckSpellingAsYouType = False. Это отключает автоматическое обнаружение орфографических ошибок (красные волнистые линии). Это настройка для всего приложения, а не только для одного документа, поэтому рекомендуется снова включить его, если это то, чего конечный пользователь ожидает в Word, как я делал в конце.

Теперь, если обнаружение включено в Word 2007/2010 (это не работает для 2003 и более ранних версий), вы можете просто прочитать слова с ошибками в XML (WordprocessingML). Это решение сложнее в настройке и управлении, и его действительно следует использовать, только если вы не используете VBA для программирования, а скорее Open XML. Достаточно простого запроса с Linq-to-XML, чтобы получить IEnumerable из всех слов с ошибками. Вы бы сбросили все .Value XML между каждым w:type="spellStart" и w:type="spellEnd" атрибутами элемента <w:proofErr/>. Документ, созданный выше, имеет этот абзац в WordprocessingML:

<w:p w:rsidR="00A357E4" w:rsidRDefault="0008442E">
  <w:r>
    <w:t xml:space="preserve">I </w:t>
  </w:r>
  <w:proofErr w:type="spellStart"/>
  <w:r>
    <w:t>wa</w:t>
  </w:r>
  <w:bookmarkStart w:id="0" w:name="_GoBack"/>
  <w:bookmarkEnd w:id="0"/>
  <w:r>
    <w:t>ntedd</w:t>
  </w:r>
  <w:proofErr w:type="spellEnd"/>
  <w:r>
    <w:t xml:space="preserve"> to </w:t>
  </w:r>
  <w:proofErr w:type="spellStart"/>
  <w:r w:rsidR="003F2F98">
    <w:t>b</w:t>
  </w:r>
  <w:r w:rsidR="005D3127">
    <w:t>eet</w:t>
  </w:r>
  <w:proofErr w:type="spellEnd"/>
  <w:r w:rsidR="005D3127">
    <w:t xml:space="preserve"> </w:t>
  </w:r>
  <w:proofErr w:type="spellStart"/>
  <w:r w:rsidR="005D3127">
    <w:t>hym</w:t>
  </w:r>
  <w:proofErr w:type="spellEnd"/>
  <w:r w:rsidR="005D3127">
    <w:t xml:space="preserve"> </w:t>
  </w:r>
  <w:proofErr w:type="spellStart"/>
  <w:r w:rsidR="005D3127">
    <w:t>uup</w:t>
  </w:r>
  <w:proofErr w:type="spellEnd"/>
  <w:r w:rsidR="005D3127">
    <w:t xml:space="preserve"> to </w:t>
  </w:r>
  <w:proofErr w:type="spellStart"/>
  <w:r w:rsidR="005D3127">
    <w:t>rite</w:t>
  </w:r>
  <w:proofErr w:type="spellEnd"/>
  <w:r w:rsidR="005D3127">
    <w:t xml:space="preserve"> some </w:t>
  </w:r>
  <w:proofErr w:type="spellStart"/>
  <w:r w:rsidR="005D3127">
    <w:t>rongs</w:t>
  </w:r>
  <w:proofErr w:type="spellEnd"/>
  <w:r w:rsidR="005D3127">
    <w:t xml:space="preserve">. </w:t>
  </w:r>
</w:p>
...