我正在尝试在VB.NET中动态创建word文档,我发现所有这些文档似乎都非常缺乏。现在我的程序通过循环遍历数据库表来工作,并且对于每一行,它都会拉出变量。然后程序循环并解析模板word doc,用数据库中的变量替换该模板中的变量,然后保存为新的doc。
相反,对于我将要创建的每个“新文档”,我只想将它附加到另一个文档上,当需要在表中解析1000行时,我不必创建和保存1000个不同的word文档到文件系统。
我似乎无法找到任何有关此事的内容。一切都提到合并文档(我实际上想要追加,而不是合并)或我可以追加(“插入”)文档的唯一方法是使用WordApplication.Selection.InsertFile(newWordDocument.FullName)
。这有效,但要求我在插入之前将newWordDocument
保存到文件系统。
有没有办法在内存中将newWordDocument
添加到我的WordApplication
对象中?
这是我现在拥有的伪代码
For each row in TableOfVariables
Dim WordApplication as New Word.Application
Dim tempDoc as New Word.Document
tempDoc = WordApplication.Documents.Add
tempDoc = fillVariablesOfTheDocument(tempDoc, row)
tempDoc.Save() 'This is the problem - it saves as a new file rather than appending into WordApplication
Next
答案 0 :(得分:0)
您没有进行任务,只是使用
进行声明objWordApp.Documents.Add(tempDoc)'这就是问题所在!
Dim wordApp as new Microsoft.Office.Interop.Word.Application
wordApp.Visible = true
Dim doc as Word.Document
doc = wordApp.Documents.Add
在你做好并准备好之前,你不必保存它。这也有效
Dim Word As Word.Application
Dim Doc As Word.Document
'Start Word and open the document template.
Word = CreateObject("Word.Application")
Word.Visible = True
Doc = Word.Documents.Add
答案 1 :(得分:0)
花了一段时间,但不知怎的,我发现了MailMerge
,我根本不知道存在。长话短说,我可以有一个带变量的模板文档,我可以有一个输入excel文档。 excel文档将包含一个包含变量名称的标题行,excel doc的每个单独单元格将代表将进入文档的变量。当我执行MailMerge
时,模板将替换为n
个页面(其中n
是excel行的数量)。这解决了我在一个大的Excel文档中添加多个文档的问题。我在excel doc中测试了1000行,并且它完美无缺。
这是我最终得到的代码:
Dim wrdSelection As Word.Selection
Dim wrdMailMerge As Word.MailMerge
Dim wrdMergeFields As Word.MailMergeFields
' Create an instance of Word and make it visible.
wrdAppMailMrg = CreateObject("Word.Application")
wrdAppMailMrg.Visible = True
' Add a new document.
wrdDocMailMrg = wrdAppMailMrg.Documents.Open("Template.docx")
wrdDocMailMrg.Select()
wrdSelection = wrdAppMailMrg.Selection()
wrdMailMerge = wrdDocMailMrg.MailMerge()
'Open Data Source
wrdDocMailMrg.MailMerge.OpenDataSource("InputVariables.xlsx", SQLStatement:="SELECT * FROM [Sheet1$]")
' Perform mail merge.
wrdMailMerge.Destination = _
Word.WdMailMergeDestination.wdSendToNewDocument
wrdMailMerge.Execute(False)
' Close the original form document.
wrdDocMailMrg.Saved = True
wrdDocMailMrg.Close(False)
' Release References.
wrdSelection = Nothing
wrdMailMerge = Nothing
wrdMergeFields = Nothing
wrdDocMailMrg = Nothing
wrdAppMailMrg = Nothing
现在我只需要调整它以使其运行更快并清理UI,但功能完全存在。