Проверка источника данных Word Word слияния программно - PullRequest
0 голосов
/ 23 марта 2009

Я хочу перебрать все строки источника данных слияния MS-Word и извлечь соответствующие данные в XML.

Я сейчас использую этот код:

Imports Microsoft.Office.Interop
Do
  objXW.WriteStartElement("Recipient")
  Dim objDataFields As Word.MailMergeDataFields = DataSource.DataFields
  For Each FieldIndex As Integer In mdictMergeFields.Keys
    strValue = objDataFields.Item(FieldIndex).Value
    If Not String.IsNullOrEmpty(strValue) Then
      strName = mdictMergeFields(FieldIndex)
      objXW.WriteElementString(strName, strValue)
    End If
  Next
  objXW.WriteEndElement()
  If DataSource.ActiveRecord = LastRecord Then
    Exit Do
  Else
    DataSource.ActiveRecord = Word.WdMailMergeActiveRecord.wdNextDataSourceRecord
  End If
Loop

И это оказывается немного вялым (около 1 секунды для каждого ряда). Есть ли способ сделать это быстрее?

Моя фантазия - найти такую ​​функцию, как MailMergeDataSource.ToDatatable, а затем проверить данные.

1 Ответ

0 голосов
/ 23 марта 2009

Каждый раз, когда вы перебираете что-то построчно, а затем выполняете какую-то обработку для каждой строки, это будет немного медленным.

Я был бы склонен подойти к этой проблеме, выполнив перед этим шаг, который подготовил коллекцию mdictMergeFields, чтобы в только содержались элементы, которые не были «нулевыми или пустыми», это означает, что вы не будете нужно проверять это на каждой итерации. Вы можете сделать это в процессе или «незаметно» в фоновом режиме, пока пользователь делает что-то еще.

Другая вещь, которую нужно попробовать (может помочь!), Это изменить блок «Do ... Loop», чтобы в конце каждой импортированной строки вы не проверяли, является ли запись «последней записью». Вместо этого получите количество записей, а затем сравните текущий индекс с максимумом знаний (который может быть быстрее)

т.е:.

Dim i, x as Integer
i = ActiveDocument.MailMerge.DataSource.RecordCount

Do While x < i
objXW.WriteStartElement("Recipient")  
Dim objDataFields As Word.MailMergeDataFields = DataSource.DataFields  
For Each FieldIndex As Integer In mdictMergeFields.Keys    
 strValue = objDataFields.Item(FieldIndex).Value    
 If Not String.IsNullOrEmpty(strValue) Then      
  strName = mdictMergeFields(FieldIndex)      
  objXW.WriteElementString(strName, strValue)    
 End If  
Next  
objXW.WriteEndElement()
x += 1
Loop

Я не особо много работаю с Office Interop, но, надеюсь, это может помочь! Отправить обратно, дайте мне знать, как оно идет.

/ Richard.

...