Можно ли обновить поля формы в документе Word через скрипт

Вероятно, это может вызвать много вопросов, поэтому я постараюсь быть как можно более конкретным. Я отвечаю за поддержку стороннего приложения, которое использует моя работа. Одна из функций этого приложения - извлечение текстовых документов из файлов .dot с использованием информации из базы данных. Для этого оно использует поля MERGEFIELD. Когда эти данные втягиваются, это позволяет сохранить обычные поля даты и поля печати, но поля createdate (тот, который мне нужен) и поля saveate полностью испорчены. Он сохраняет исходную дату создания шаблона вместо того, чтобы вставлять сегодняшнюю дату в качестве даты создания документа, как обычно делают шаблоны, и делает поле недействительным, так что это обычный текст вместо поля createdate, поэтому вы не можете его обновить. Я не смог найти точного ответа на вопрос, является ли это стандартным поведением, когда поля createdate используются при слиянии писем. Я бы использовал обычные даты, но эти документы можно было редактировать в течение нескольких дней, и в конечном итоге они были преобразованы в PDF для «постоянной» копии. Если вы создадите документ из программы, а затем откроете его на следующий день, он автоматически обновит дату ... не то, что мы хотим, это должен быть тот первый день, когда он был открыт.

У меня было прозрение, когда я использовал сценарий PowerShell для обновления созданного элемента самого шаблона. Сделать это удалось в трех строках с помощью:

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

Этот скрипт отлично работает, и информация о файлах обновляется. Однако, чтобы слова в документе отразили это, вам нужно войти в Word, обновить поля формы с помощью F9, а затем сохранить его. Даже с обновленной датой создания текст документа Word по-прежнему показывает старую дату, когда вы загружаете документ в Word или из другого приложения, пока вы не обновите и не сохраните шаблоны вручную. Эти формы не защищены, так что это не проблема. Я видел несколько скриптов PowerShell для редактирования файлов Word, но не смог найти ни одного для обновления полей даты. Я попробовал этот скрипт с датой изменения и использованием сохраненных полей в форме, но для этого также потребовалось войти и фактически сохранить форму. Есть ли способ в 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()

person SausageBuscuit    schedule 09.01.2013    source источник
comment
После поиска моего точного названия вопроса в 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. Все еще открыт для предложений.   -  person SausageBuscuit    schedule 09.01.2013
comment
Добро пожаловать в SO! Чтобы сделать его более читабельным, отредактируйте исходное сообщение найденным кодом, а не помещайте его в комментарий.   -  person Nick    schedule 10.01.2013
comment
Спасибо за предложение ... не был уверен, какой метод был предпочтительнее для добавления вновь найденного кода. У меня есть все, но я понял ... Я все равно предпочел бы использовать дату создания, но она просто не будет обновляться даже с Fields.Update. Savedates как бы делает то, что мне нужно, с приведенным выше кодом, хотя я не собирался этого делать.   -  person SausageBuscuit    schedule 10.01.2013


Ответы (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. Возможно, вам придется проделать некоторые уловки с переименованием, чтобы это заработало, но это должно решить проблему с сохранением файла.

person Nick    schedule 09.01.2013
comment
$ doc = $ Word.Document.open ($ filename) вместо Document.Add работает для шаблонов. Однако, как я уже говорил, по какой-то причине даты создания не обновляются. Я просто использую сохраненные данные (поскольку исходное приложение все равно преобразует оба текста в текст) и прекращаю работу. Спасибо! - person SausageBuscuit; 10.01.2013