Что нового

[Автоматизация] Редактирование документов Word

igorit

Новичок
Сообщения
25
Репутация
0
Всем привет!
В Autoit я довольно слаб, потому нуждаюсь в вашей помощи.
Имеется огромное количество документов WORD (docx) в которые нужно добавить простую правку: добавить колонтитул (определенный текст) весь текст документа вделать Times New Roman 14.
По одному открывать - уйдут недели... Можно как-то автоматизировать?
Перебор документов сделаю сам без проблем. Я не знаю как редактировать.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Привет, нужно начать запись макроса, выполнить все действия, остановить. Посмотреть код макроса и адаптировать его к autoit, обычно это достаточно просто.
 

pvnn

Осваивающий
Сообщения
305
Репутация
32
Можно так:
Код:
#include <Word.au3>
#include <Array.au3>

Local $oWord = _Word_Create()
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_Create", _
        "Error creating a new Word application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended)

Local $sPath = @ScriptDir & "\Test.docx"
$oDoc=_Word_DocOpen($oWord, $sPath, Default, Default,False)
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocOpen", "Error opening "&$sPath & _
        @CRLF & "@error = " & @error & ", @extended = " & @extended)

; Установка колонтитулов
    $oDoc.ActiveWindow.ActivePane.View.SeekView = 9 ;	 wdSeekCurrentPageHeader=9 верхний колонтитул (https://msdn.microsoft.com/en-us/library/office/aa211923(v=office.11).aspx)
    $oWord.Selection.Range.Text = 'Колонтитул верхний'
    $oDoc.ActiveWindow.ActivePane.View.SeekView = 0 	; wdSeekMainDocument - выход в основной текст

    $oDoc.ActiveWindow.ActivePane.View.SeekView = 10	 ; wdSeekCurrentPageFooter=10 нижний колонтитул
    $oWord.Selection.Range.Text = 'Колонтитул нижний'
    $oDoc.ActiveWindow.ActivePane.View.SeekView = 0 	; wdSeekMainDocument - выход в основной текст

; Текст
	$oDoc.Range().Font.Size=14
	;$oDoc.Range(0,21).Font.Bold=0
	$oDoc.Range().Font.Name = "Times New Roman"

; Выход

 _Word_DocSaveAs($oDoc,$sPath,$WdFormatDocumentDefault)
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocSaveAs Example", _
        "Error saving the Word document." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
_Word_DocClose($oDoc)
_Word_Quit($oWord)
 
Автор
I

igorit

Новичок
Сообщения
25
Репутация
0
В общем, попробовал записать макрос. Последовательность:
- Вставка текста из буфера
- выделение всего текста
- Times New Roman
- 14
- Жирный шрифт
- Жирный шрифт (делается для того что бы убрать все жирные выделения в тексте)

Код макроса:

Код:
Sub Макрос1()
'
' Макрос1 Макрос
'
'
    Selection.PasteAndFormat (wdUseDestinationStylesRecovery)
    Selection.WholeStory
    Selection.Font.Name = "Times New Roman"
    Selection.Font.Size = 14
    ActiveWindow.ActivePane.VerticalPercentScrolled = 0
    Selection.Font.Bold = wdToggle
End Sub

НО! Макрос не может записать редактирование колонтитула. Если включить запить макроса, то колонтитул не редактируется. Если же начать редактировать колонтитул, и включить запись макроса, то колонтитул закрывается...
А это одна из самых сложных работ (колонтитул) так как его нужно открыть, вставить туда текст, подогнать колонтитул под определенные размеры... на все это уходит на много больше времени чем на все остальные действия.
Решил это так: Создал документ Колонтитул.docx открываю документ который надо отредактировать (на пример Doc1.docx), копирую оттуда содержимое в Колонтитул.docx, редактирую и сохраняю под именем Doc1.docx....
Как это все можно автоматизировать? Точнее как это можно прописать в Autoit?
- Открыть Doc1.docx
- Скопировать содержимое
- закрыть
- открыть Колонтитул.docx
- Вставка текста из буфера
- выделение всего текста
- Times New Roman
- 14
- Жирный шрифт
- Жирный шрифт (делается для того что бы убрать все жирные выделения в тексте)
- сохранить под именем Doc1.docx

Можете помочь с кодом? Если еще с открытием/закрытием документов можно разобраться из справки, то макрос я точно не переделаю....


Добавлено:
Сообщение автоматически объединено:

pvnn сказал(а):

pvnn, не сразу увидел ваше сообщение. Сейчас посмотрю
 

pvnn

Осваивающий
Сообщения
305
Репутация
32
Еще вариант, через VBS
Код:
$oWord = ObjCreate("Word.Application")
 $oWord.Visible = 1
 $oDoc = $oWord.Documents.Open(@ScriptDir&"\test.docx")

; Колонтитул
   $oWord.Documents(1).Sections(1).Headers(1).Range.Text = "Колонтитул верхний"
   $oWord.Documents(1).Sections(1).Footers(1).Range.Text = "Колонтитул нижний"

; Текст
	$oDoc.Range().Font.Size=14
	$oDoc.Range().Font.Name = "Times New Roman"


Добавлено:
Сообщение автоматически объединено:

Исправил 2 ответ, теперь Word-файл перезаписывается
 
Автор
I

igorit

Новичок
Сообщения
25
Репутация
0
Спасибо большое! Начал понемногу разбираться в функции. К сожалению оба примера подошли лишь частично: текст форматируют на ура! Но колонтитул только вставляется, и его всеравно нужно редактировать в ручную (шрифт/размер/положение/цвет..) так как ни одна команда форматирования шрифта не срабатывает в колонтитуле :(
Ну, вполне возможно что я все делаю не так.
Есть ли вообще справка по Word.au3?
Я попробовал переделать код под мой вариант работы но получаю ошибку: "error: wdUseDestinationStylesRecovery(): undefined function"
код:
Код:
#include <Word.au3>
#include <Array.au3>

Local $oWord = _Word_Create()
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_Create", _
        "Error creating a new Word application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended)

Local $sPath = @ScriptDir & "\41.docx"
$oDoc1=_Word_DocOpen($oWord, $sPath, Default, Default,False)
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocOpen", "Error opening "&$sPath & _
        @CRLF & "@error = " & @error & ", @extended = " & @extended)

	$oWord.Selection.WholeStory
    $oWord.Selection.Copy

If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocSaveAs Example", _
        "Error saving the Word document." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
_Word_DocClose($oDoc1)


Local $sPath = @ScriptDir & "\КОЛОНТИТУЛ.docx"
$oDoc2=_Word_DocOpen($oWord, $sPath, Default, Default,False)
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocOpen", "Error opening "&$sPath & _
        @CRLF & "@error = " & @error & ", @extended = " & @extended)

; Текст
	$oWord.Selection.PasteAndFormat (wdUseDestinationStylesRecovery)
    $oWord.Selection.WholeStory
    $oDoc2.Range().Font.Size=14
    $oDoc2.Range().Font.Bold=0
    $oDoc2.Range().Font.Name = "Times New Roman"

; Выход

 _Word_DocSaveAs($oDoc1,$sPath,$WdFormatDocumentDefault)
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocSaveAs Example", _
        "Error saving the Word document." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
_Word_DocClose($oDoc2)
_Word_Quit($oWord)


Добавлено:
Сообщение автоматически объединено:

Сейчас не могу разобраться как вставлять из буфера то что скопировано. На $oWord.Selection.PasteAndFormat (wdUseDestinationStylesRecovery) ругается. Не знаю как правильно записать в Autoit-e команду из макроса Selection.PasteAndFormat (wdUseDestinationStylesRecovery)
Код:
Код:
#include <Word.au3>
#include <Array.au3>

Local $oWord1 = _Word_Create()
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_Create", _
        "Error creating a new Word application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended)

Local $sPath1 = @ScriptDir & "\allref_6441.docx"
$oDoc1=_Word_DocOpen($oWord1, $sPath1, Default, Default,False)
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocOpen", "Error opening "&$sPath1 & _
        @CRLF & "@error = " & @error & ", @extended = " & @extended)

	$oWord1.Selection.WholeStory
    $oWord1.Selection.Copy

If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocSaveAs Example", _
        "Error saving the Word document." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
_Word_DocClose($oDoc1)


Local $oWord = _Word_Create()
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_Create", _
        "Error creating a new Word application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended)

Local $sPath = @ScriptDir & "\1.docx"
$oDoc2=_Word_DocOpen($oWord, $sPath, Default, Default,False)
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocOpen", "Error opening "&$sPath & _
        @CRLF & "@error = " & @error & ", @extended = " & @extended)

; Текст
	;$oWord.Selection.PasteAndFormat (wdUseDestinationStylesRecovery)
    $oWord.Selection.WholeStory
    $oDoc2.Range().Font.Size=14
    $oDoc2.Range().Font.Bold=0
    $oDoc2.Range().Font.Name = "Times New Roman"

; Выход
MsgBox($MB_SYSTEMMODAL, "1", "texst")
 _Word_DocSaveAs($oDoc2,$sPath1,$WdFormatDocumentDefault)
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocSaveAs Example", _
        "Error saving the Word document." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
_Word_DocClose($oDoc2)
_Word_Quit($oWord1)
_Word_Quit($oWord)



Добавлено:
Сообщение автоматически объединено:

Все! Работает!
Заменил $oWord.Selection.PasteAndFormat (wdUseDestinationStylesRecovery) на $oDoc2.Range.Paste и все заработало!
Всем спасибо!
Конечный результат:
Код:
#include <Word.au3>
#include <Array.au3>

Local $oWord1 = _Word_Create()
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_Create", _
        "Error creating a new Word application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended)

Local $sPath1 = @ScriptDir & "\allref_6441.docx"
$oDoc1=_Word_DocOpen($oWord1, $sPath1, Default, Default,False)
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocOpen", "Error opening "&$sPath1 & _
        @CRLF & "@error = " & @error & ", @extended = " & @extended)

	$oWord1.Selection.WholeStory
    $oWord1.Selection.Copy

If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocSaveAs Example", _
        "Error saving the Word document." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
_Word_DocClose($oDoc1)


Local $oWord = _Word_Create()
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_Create", _
        "Error creating a new Word application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended)

Local $sPath = @ScriptDir & "\1.docx"
$oDoc2=_Word_DocOpen($oWord, $sPath, Default, Default,False)
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocOpen", "Error opening "&$sPath & _
        @CRLF & "@error = " & @error & ", @extended = " & @extended)

; Текст
	;$oDoc2.Range().PasteAndFormat (wdUseDestinationStylesRecovery)
	$oDoc2.Range.Paste
    $oWord.Selection.WholeStory
    $oDoc2.Range().Font.Size=14
    $oDoc2.Range().Font.Bold=0
    $oDoc2.Range().Font.Name = "Times New Roman"

; Выход
 _Word_DocSaveAs($oDoc2,$sPath1,$WdFormatDocumentDefault)
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocSaveAs Example", _
        "Error saving the Word document." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
_Word_DocClose($oDoc2)
_Word_Quit($oWord1)
_Word_Quit($oWord)
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
wdUseDestinationStylesRecovery - это константа, она равна 19, это находится в гугле за 1 минуту. Вот ссылка https://msdn.microsoft.com/en-us/library/office/ff844915.aspx
 
Верх