使用Powershell使用Word模板

时间:2014-06-24 21:06:31

标签: powershell

我正在编写一个函数,它是一个更大的脚本的一部分,它将从Web表单中获取输入,检查该用户是否存在于我们的AD或Linux系统中,如果不存在则创建该帐户,发送电子邮件用户完成后,然后创建一个Word文档,我们可以打印出来并提供他们的凭据(没有临时密码),电子邮件地址和有关我们IT服务的基本信息。我一直在用Word集成打我的头。在线集成了几乎零的ZERO Powershell文档。我一直在用C#和VB翻译我能做的事情,甚至有一半甚至都不能翻译。我现在大部分时间都在使用它,但是我在将PS放入Word模板中的正确位置时遇到问题。我有一个带有4个书签的Word模板,我在其中插入用户的姓名,用户名,电子邮件地址和帐户到期日期。问题是,PS将所有文本放在同一个书签上。我发现如果我静态地将信息放入脚本中它将起作用(即$ FillName.Text ='John Doe')但是如果我使用变量它只会将它们全部粘贴在第一个书签上。这是我的代码:

Function createWordDocument($fullname,$sam,$mailaddress,$Expiration)
{
     $word = New-Object -ComObject "Word.application"

     $doc = $word.Documents.add("C:\Users\smiths\Documents\Powershell Scripts\webformCreateUsers\welcome2.dotx")         
     $FillName=$doc.Bookmarks.Item("Name").Range
     $FillName.Text="$fullname "         
     $FillUser=$doc.Bookmarks.Item("Username").Range
     $FillUser.Text="$sam"       
     $FillMail=$doc.Bookmarks.Item("Email").Range
     $FillMail.Text="$mailaddress"       
     $FillExpiration=$doc.Bookmarks.Item("Expiration").Range
     $FillExpiration.Text="$Expiration"          
     $file = "C:\Users\smiths\Documents\Powershell Scripts\webformCreateUsers\test1.docx"
     $doc.SaveAs([ref]$file)

     $Word.Quit()


}

该函数正在接收源自import-csv的参数。 $ fullname,$ sam和可能$ mailaddress都已从原始输入中修改。 #Expiration来自import-csv raw。任何帮助,将不胜感激。 This似乎是我能找到的最相关的信息,据我所知,我有相同的代码,但它不适用于多个书签。

2 个答案:

答案 0 :(得分:1)

好的,就像我建议您可以设置一个邮件合并基础,您可以使用它来为人们创建文档。这确实意味着您需要将数据输出到CSV文件,但这非常简单。

首先使用您要包含的数据设置测试CSV。为简单起见,您可能希望将其与引用它的单词doc放在一起。我们现在称它为mailmerge.csv,但你可以随心所欲地命名它。看起来像Name,UserName,Email和Expiration是您想要的字段。您可以暂时在这些字段中使用虚拟数据。

然后在Word中设置邮件合并,并将其保存到某个位置。我们将其称为Welcome3.docx,并将其存放在与上一个文档相同的位置。然后,一旦设置为引用您的CSV文件并保存,您就可以启动Word,打开主文档,然后执行合并,然后只保存文件,然后离开。

我将使用您的函数的修改版本,它将根据提供的参数创建CSV,打开合并文档,执行合并,保存新文件和关闭单词。然后它将传回一个FileInfo对象,以便您可以使用它来发送电子邮件,或者其他任何内容。

Function createWordDocument($fullname,$sam,$mailaddress,$Expiration)
{
     [PSCustomObject]@{Name=$fullname;Username=$sam;Email=$mailaddress;Expiration=$Expiration}|Export-Csv "C:\Users\smiths\Documents\Powershell Scripts\webformCreateUsers\mailmerge.csv" -NoTypeInformation -Force
     $word = New-Object -ComObject "Word.application"

     $doc = $word.Documents.Open("C:\Users\smiths\Documents\Powershell Scripts\webformCreateUsers\welcome3.dotx")
     $doc.MailMerge.Execute()
     $file = "C:\Users\smiths\Documents\Powershell Scripts\webformCreateUsers\$fullname.docx"
     ($word.documents | ?{$_.Name -Match "Letters1"}).SaveAs([ref]$file)

     $Word.Quit()

     [System.IO.FileInfo]$file
}

答案 1 :(得分:0)

TheMadTechnician让我走上正轨,但我不得不做一些调整。以下是我的结论:

Function createWordDocument($fullname)
{
     $word = New-Object -ComObject "Word.application"        
     $doc = $word.Documents.Add("C:\Users\smiths\Documents\Powershell Scripts\webformCreateUsers\welcome_letter.docx")       
     $doc.MailMerge.Execute()    
     $file = "C:\Users\smiths\Documents\Powershell Scripts\webformCreateUsers\$fullname.docx"
     ($word.documents | ?{$_.Name -Match "Letters1"}).SaveAs([ref]$file)
     $quitFormat = [Enum]::Parse([Microsoft.Office.Interop.Word.WdSaveOptions],"wdDoNotSaveChanges")
     $Word.Quit([ref]$quitformat)        
}

我没有将参数传递给函数,而是让main函数为我创建mailmerge.csv文件,并让Word模板连接到它。我还在传递$ fullname,因为那是我最后命名文件的原因。最后的两个主要问题是,每次打开mailmerge文档文件时,Word都会询问您是否要回溯到源数据。这意味着当Powershell试图打开它时,Word正在等待交互,然后PS会在它认为完成时关闭它。当然,这意味着什么也没做完。我发现您必须创建一个注册表项才能使Word跳过SQL安全检查。为了后人,你必须在这里创建一个关键: HKCU \ Software \ Microsoft \ Office \ 14.0 \ Word \ Options \称为SQLSecurityCheck,DWORD值为0.这允许Word正确打开模板并操作文件。我遇到的最后一点麻烦是,Word每次运行时都想重新保存原始文件,并且会打开一个对话框,让Word打开并留在内存中。最后两行迫使单词关闭而不保存。