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

Posted

技术标签:

【中文标题】是否可以通过脚本更新 Word 文档中的表单字段【英文标题】:Is it possible to update form fields in Word Document via script 【发布时间】:2012-12-23 22:31:07 【问题描述】:

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

我有一个顿悟,使用 powershell 脚本来更新模板本身的 createdate。设法通过以下三行来做到这一点:

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

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

编辑:我找到了以下代码,如下所述。在这段代码中,我还发现我需要将 Documents.Add 更改为 Documents.Open。我会注意到,这有助于以我需要的方式操纵保存日期,但 createdate 仍然是一个谜。

$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()

【问题讨论】:

在 Google 中搜索了我的确切问题标题后找到了以下内容...不知道为什么我之前的搜索结果相似:code $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() 这仍然不太正确因为它不会打开并保存模板,而是打开并尝试保存 .docx。仍然愿意接受建议。 欢迎来到 SO!为了使文章更具可读性,请使用您找到的代码编辑您的原始帖子,而不是将其放在评论中。 感谢您的建议...不确定附加新发现代码的首选方法是什么。我已经了解了这一切,但我想通了...我仍然宁愿使用创建日期,但即使使用 Fields.Update 也不会更新。 Savedates 有点像上面的代码做我需要的,虽然这不是我的意图。 【参考方案1】:

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

 $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 的原因。您可能需要做一些重命名技巧才能使其正常工作,但这应该可以解决如何保存文件的问题。

【讨论】:

$doc = $Word.Document.open($filename) 而不是 Document.Add 适用于模板。但是,正如我之前所说,由于某种原因,创建日期不会更新。我将只使用 savedates(因为原始应用程序无论如何都将两者都转换为文本)并称之为一天。谢谢!

以上是关于是否可以通过脚本更新 Word 文档中的表单字段的主要内容,如果未能解决你的问题,请参考以下文章

更新word文档中的字段时防止重新打开同一文档

使用 MS Access 和 VBA 更新 Ms Word 文档中的(字段代码:数据库)字段

在 Word 中自动运行宏 OnSave

替换 Word 文档 QAxObject QT / C++ 中的字段值

如何在没有表单字段的情况下从表单传递数据? (PHP)

使用脚本对文档进行部分更新,并添加缺失的字段。