2009-03-23 5 views
0

Je souhaite effectuer une itération sur toutes les lignes d'une source de données de fusion et publipostage MS-Word et extraire les données pertinentes dans un fichier XML.Inspection d'une source de données de fusion et publipostage par programme

J'utilise actuellement ce code:

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 

Et il se révèle être un peu lent (environ 1 seconde pour chaque ligne). Y a-t-il un moyen de le faire plus vite?

Mon fantasme est de trouver une fonction comme MailMergeDataSource.ToDatatable puis d'inspecter le datatable.

+0

Je viens d'utiliser un profileur sur mon application et a trouvé que la ligne problématique est strValue = objDataFields.Item (fieldIndex) .Value Remplacement avec strValue = « » rend l'application ultra-rapide! –

Répondre

0

Chaque fois que vous parcourez une ligne après l'autre et que vous effectuez un traitement sur chaque ligne, cela devient un peu lent.

Je serais enclin à aborder ce problème en ayant une étape avant ce qui a préparé la collection mdictMergeFields afin qu'il ne contenait des éléments qui ne sont pas « nul ou vide », cela signifie que vous n'aurez pas à vérifier pour cela à chaque itération. Vous pouvez le faire en cours de traitement ou «en cachette» en arrière-plan pendant que l'utilisateur fait autre chose.

L'autre chose à essayer (pourrait aider!) Est de changer le bloc "Do ... Loop" de sorte que vous ne vérifiiez pas à la fin de chaque ligne importée si ou l'enregistrement est le 'dernier enregistrement' . Au lieu de cela, obtenir un nombre d'enregistrements, puis comparer l'indice actuel au maximum de knowm (qui pourrait être plus rapide)

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 

Je ne travaille pas vraiment avec le Bureau Interop beaucoup, mais j'espère que cela pourrait offrir de l'aide! Post-retour, laissez-moi savoir comment ça se passe.

/Richard.

+0

Merci, mais cela n'aide pas. J'ai ajouté un commentaire ci-dessus sur la ligne problématique. –

+0

Si vous définissez manuellement strValue = "" à chaque fois, vous n'avez même pas besoin de la vérification .IsNullOrEmpty. Il suffit de supprimer strValue = "", puis se débarrasser de l'If/End Si en dessous de cela ... Donner un sens? – Richard

Questions connexes