我有一个特殊的需要。我需要能够从csv文件中读取一行,将数据合并到mailmerge文档中,使用唯一名称保存文档,继续下一行,冲洗并重复。
我完全不知道如何使用/合并从文件中提取的单行数据作为邮件合并的数据源。有人能给我一些洞察下面的oDoc.mailmerge ...行应该是什么样的吗?
我知道下面的代码中的打开和关闭效率不高,这是我通过快速联系以获得我的观点。我可以休息一下。我只需要合并线的帮助。
DATAFILE = "test.txt"
DOCFILE = "myDoc.doc"
listFile = fso.OpenTextFile(DATAFILE).ReadAll
listLines = Split(listFile, vbCrLf)
For Each line In listLines
WScript.Echo line
'My Stuff
dim objWord, oDoc, wdName
Set objword = CreateObject("Word.Application")
wdName = "D:\My Documents\DOCFILE"
set oDoc = objword.Documents.Open (wdName)
objword.Visible = True
oDoc.MailMerge.OpenDataSource ?line?, , ,True, , , , , , , , , "IDONTKNOWWHATGOESHERE"
oDoc.MailMerge.Execute
oDoc.PrintOut
'redefine savename and execute save here
oDoc.Close()
objword.Quit (0)
Next
答案 0 :(得分:0)
OpenDataSource不允许您指定除SQL之外的各个行。你通常会做的是使用一个循环来增加(比方说)iRecord然后使用
obj.MailMerge.DataSource.FirstRecord = iRecord
obj.MailMerge.DataSource.LastRecord = iRecord
您可以每次打开数据源,但有效的方法是打开它,然后有一个循环设置这两个值并执行执行。无论哪种方式,你需要意识到你的" oDoc"对象将始终引用邮件合并主文档,而不是合并产生的文档。要从VBScript访问 文档,我认为您需要objWord.ActiveDocument。
在我看来,其他任何方法都比较复杂。
但是,如果您真的想使用OpenDataSource行来控制合并,OpenDataSource(a)需要使用磁盘文件,而不是像listLines数组这样的内存结构,(b)需要发布用于检索单行的SQL(这反过来要求您的数据源具有唯一的键字段,并且(可能)您知道其名称和类型。
如果你有,那么你的OpenDataSource行可能就像
oDoc.MailMerge.OpenDataSource "the full path and name of the data file",,,,,,,,,,,, _
"SELECT * FROM X WHERE [fieldname] = " & cstr(theFieldValue)
从listLines数组中的相应记录中获取相关的theFieldValue。或者,如果您知道该字段包含行号,则可以生成该号码,您可能根本不需要您的阵列。
如果theFieldValue是字符串类型而不是数字类型,那么您需要更多类似的东西:
oDoc.MailMerge.OpenDataSource "the full path and name of the data file",,,,,,,,,,,, _
"SELECT * FROM X WHERE [fieldname] = '" & theFieldValue & "'"
" X"只是满足Word要求有一个FROM子句(Word有一个非常粗糙的内部SQL方言)。 OTOH,如果Word决定使用其OLE DB提供程序打开文件,您可能需要更多关注"表名"
另一种方法是使用VBScript和FileSystemObject为数据源中的每个数据行创建一个新数据文件(由标题行+ 1数据行组成)。然后mailmerge整个文件。