0

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、データテーブルを調べることです。

4

1 に答える 1

0

行ごとに何かを繰り返し処理し、各行で何らかの処理を行うと、少し遅くなります。

「nullまたは空」ではない要素のみが含まれるようにmdictMergeFieldsコレクションを準備するこの前のステップを持つことで、この問題にアプローチする傾向があります。これは、反復ごとにそれを確認する必要がないことを意味します。これは、ユーザーが何か他のことをしている間にバックグラウンドで実行することも、バックグラウンドで「こっそり」実行することもできます。

もう 1 つの試み (役立つかもしれません!) は、「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 を実際にはあまり使用していませんが、これが何らかの助けになることを願っています! ポストバック、それがどうなるか教えてください。

/リチャード。

于 2009-03-23T09:27:39.293 に答える