2009-03-23 4 views
0

Ich möchte über alle Zeilen einer MS-Word-Seriendruck-Datenquelle iterieren und die relevanten Daten in ein XML extrahieren.Eine Word-Seriendruck-Datenquelle programmgesteuert prüfen

Ich bin derzeit mit diesen 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 

Und es stellt sich heraus, ein wenig träge (etwa 1 Sekunde für jede Zeile) zu sein. Gibt es einen Weg, es schneller zu machen?

Meine Fantasie findet eine Funktion wie MailMergeDataSource.ToDatatable und prüft dann die Datentabelle.

+0

Früher habe ich nur einen Profiler auf meine App und fand heraus, dass die problematische Zeile ist strValue = objDataFields.Item (Field) .Value es mit strValue ersetzen = „“ macht die Anwendung extrem schnelle! –

Antwort

0

Jedes Mal, wenn Sie Zeile für Zeile durchgehen und dann in jeder Zeile eine Art von Verarbeitung durchführen, wird es etwas langsam.

Ich würde geneigt sein, dieses Problem zu nähern, indem ein Schritt, bevor diese, die die mdictMergeFields Sammlung vorbereitet, so dass es nur Elemente enthalten, die nicht ‚null oder leer‘ waren, das Sie nicht überprüfen bedeuten haben dafür bei jeder Iteration. Sie können dies im Prozess oder "hinterhältig" im Hintergrund tun, während der Benutzer etwas anderes macht.

Die andere Sache zu versuchen (möglicherweise helfen!) Ist, ändern Sie den "Do ... Loop" -Block, so dass Sie nicht am Ende jeder importierten Zeile überprüfen, ob oder der Datensatz ist der "letzte Datensatz" . Stattdessen eine Zählung der Aufzeichnungen, und dann den aktuellen Index zum knowm Maximum vergleichen (was schneller sein könnte)

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 

ich wirklich nicht viel mit dem Office-Interop arbeiten, aber hoffentlich bietet das etwas Hilfe! Post zurück, lassen Sie mich wissen, wie es geht.

/Richard.

+0

Danke, aber das hilft nicht. Ich habe oben einen Kommentar zur problematischen Zeile hinzugefügt. –

+0

Wenn Sie strValue = "" jedes Mal manuell setzen, brauchen Sie nicht einmal die Überprüfung .IsNullOrEmpty. Entferne einfach strValue = "", dann entferne das If/End If darunter ... Macht es Sinn? – Richard

Verwandte Themen