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

每当您逐行迭代某些内容,然后对每一行进行某种处理时,都会变得有点慢。

我倾向于通过在此之前准备 mdictMergeFields 集合的步骤来解决这个问题,以便它只包含非“空或空”的元素,这意味着您不必在每次迭代时检查它。您可以在进程中执行此操作,或者在用户执行其他操作时在后台“偷偷摸摸”地执行此操作。

要尝试的另一件事(可能有帮助!)是更改“Do...Loop”块,这样您就不会在每个导入行的末尾检查记录是否是“最后一条记录”。相反,获取记录计数,然后将当前索引与已知最大值进行比较(这可能更快)

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

我并没有真正使用 Office Interop,但希望这可能会提供一些帮助!回帖,让我知道进展如何。

/理查德。

于 2009-03-23T09:27:39.293 回答