以编程方式检查Word邮件合并数据源

时间:2009-03-23 06:57:41

标签: vb.net interop ms-office mailmerge

我想迭代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这样的函数,然后检查数据表。

1 个答案:

答案 0 :(得分:0)

每当你逐行迭代某些事情,然后对每一行进行某种处理时,就会变得有点慢。

我倾向于通过在此之前做一个准备mdictMergeFields集合的步骤来解决这个问题,以便包含不是'null或empty'的元素,这意味着你赢了'必须在每次迭代时检查一次。您可以在此过程中执行此操作,或在用户执行其他操作时在后台“偷偷摸摸”。

要尝试的另一件事(可能有帮助!)是更改“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,但希望这可能会提供一些帮助!回复,让我知道它是怎么回事。

/理查德。