是否可以通过脚本更新Word文档中的表单域

时间:2013-01-09 17:11:20

标签: powershell batch-file ms-word form-fields

这可能会提出很多问题,所以我会尝试尽可能具体。我负责支持我的工作使用的第三方应用程序。此应用程序执行的功能之一是从.dot文件中提取word文档,其中包含来自数据库的信息。它使用MERGEFIELD字段执行此操作。当这个数据被拉入时,它允许保留正常的日期字段和printdate字段,但是创建(我需要的那个)和保存的字段完全搞砸了。它将原始模板创建日期保留在那里,而不是像模板通常那样插入今天的日期作为文档创建日期,并使字段无效,使其为纯文本而不是创建字段,因此您无法更新它。当创建的字段与邮件合并一起使用时,我无法找到关于这是否是标准行为的确切答案。我会使用普通日期,但这些文件可以在几天内编辑,最后将其转换为PDF以获得“永久”副本。如果您从程序中创建文档,然后在第二天打开它,它会自动更新日期...而不是我们想要的,需要在第一天打开它。

我有一个顿悟,使用powershell脚本来更新模板本身的创建。使用以下三行进行管理:

$a = Get-Date
$b = Get-Item "Q:\CUSTOM\DATETEST.dot"
$b.CreationTime = $a

此脚本运行良好,文件信息已更新。但是,要获取文档中的实际单词以反映这一点,您必须进入Word,使用F9刷新表单中的字段,然后保存它。即使使用更新的创建日期,单词文档文本仍会显示在Word中或从其他应用程序中提取文档时的旧日期,直到您刷新并手动保存模板为止。这些表格不受保护,因此不是问题。我看到了一些用于编辑word文件的powershell脚本,但是无法找到一个用于刷新日期字段的脚本。我尝试使用修改日期和在表单中使用savedate字段的脚本,但这也需要进入并实际保存表单。有没有一种方法在powershell或批处理(或任何脚本语言,在这一点上不关心),这将使我能够刷新文档中的表单字段,然后保存它们,或者任何人都可以想到任何其他方式?我有几个文档需要这样做,所以每天早上手动操作也是不切实际的。

编辑:我发现了以下代码,如下所示。在这段代码中我还发现我需要将Documents.Add更改为Documents.Open。我会注意到这对于按照我需要的方式操作保存日期起作用,但创建仍然是一个谜。

$word=new-object -com Word.Application 
$doc=$word.Documents.Add($filename) 
$word.Visible=$False 
$word.ActiveDocument.Fields.Update() 
$doc.SaveAs([REF]$filename) 
$doc.Close() 
$word.Quit()

1 个答案:

答案 0 :(得分:2)

要将文档另存为模板,请使用以下代码:

 $word = new-object -com Word.Application 
 $doc = $word.Documents.add($filename)
 $word.Visible = $False 
 $saveFormat = [Enum]::Parse([Microsoft.Office.Interop.Word.WdSaveFormat],"wdFormatTemplate")
 $doc.SaveAs([ref]$filename2,[ref]$saveFormat)
 $doc.Close() 
 $word.Quit()

对于模板,这是未经测试的,但我已将其保存为.doc,而不是默认.docx。此外,如果文件与打开文件的名称相同,也不会保存文件。这就是我将其更改为$filename2的原因。您可能需要执行一些重命名技巧才能使其正常工作,但这可以解决您如何保存文件的问题。