2009-03-23 18 views
0

MS-Word差し込み印刷データソースのすべての行に対して繰り返し処理を行い、関連するデータをXMLに抽出します。Wordの差し込み印刷データソースをプログラムで検査する

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のような機能を見つけて、データテーブルを検査しています。

+0

私はちょうど「」=私のアプリ上でプロファイラを使用して strValueにして、それを交換し、問題行 が strValueに= objDataFields.Item(FieldIndexに).Valueの であることが判明 は、高速燃えるアプリケーションを作ります! –

答えて

0

行ごとに何かを繰り返し実行していて、各行で何らかの処理を行っているときは、少し遅くなるでしょう。

この問題を解決するには、mdictMergeFieldsコレクションを準備したステップを先に進めてに「nullまたは空でない」要素しか含まれていないことを確認する必要がありますそれぞれの反復でそれのために。ユーザーが何か他のことをやっている間、あなたはこのプロセスをやり直すことができます。

もう1つの試み(役立つかもしれません)は、「実行...ループ」ブロックを変更して、インポートされた各行の最後にレコードが「最後のレコード」かどうかをチェックしないようにすることです。代わりに、レコードのカウントを取得した後、(より速いかもしれません)knowmの最大の現在のインデックス

IE比較:

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 

私は本当に多くのオフィス相互運用機能では動作しませんが、うまくいけば、これはいくつかの援助を提供するかもしれませポストバック、それがどうなるか教えてください。

/Richard。

+0

ありがとうございますが、これは役に立ちません。問題のある行について上記のコメントを追加しました。 –

+0

毎回strValue = ""を手動で設定しようとしている場合は、.IsNullOrEmptyチェックも必要ありません。 strValue = ""を削除して、その下のIf/End Ifを取り除いてください...意味がありますか? – Richard

関連する問題