Доброго времени суток друзья. Я уже рассказывал, как можно работать с Microsoft Excel средствами PowerShell. В данной статье мы рассмотрим работу
PowerShell
с
Microsoft Word
. Как и для Excel, чтобы получить доступ к MS Word нужно использовать COM объект. Для этого используем командлет
New-Object
с параметром
–ComObject
далее сам объект к которому хотим получить доступ, в нашем случае это
Word.Application
.
#Создаем новый объект WORD
$word = New-Object -ComObject Word.Application
После создания объекта обращаемся к свойству
Visible
и переключаем его в
TRUE
чтобы видеть работу скрипта непосредственно в самом
MS Word
а не в фоновом режиме.
#Видимый режим вставки, по умолчанию FALSE
$word.Visible = $True
Далее необходимо создать сам документ для этого обращаемся к свойству
Documents
и его методу
Add()
.
#Создаем новый документ
$doc = $word.Documents.Add()
Обратимся к свойству
Selection
для работы с текущим документом, далее мы будем использовать его для форматирования нашего документа.
#Выбираем открывшийся документ для работы
$Selection = $word.Selection
Задаем начальные настройки для документа допустим отступы со всех сторон.
#Устанавливаем отступы для документа
$Selection.Pagesetup.TopMargin = 50
$Selection.Pagesetup.LeftMargin = 50
$Selection.Pagesetup.RightMargin = 50
$Selection.Pagesetup.BottomMargin = 50
Установим строчный интервал сверху и снизу.
#Интервал отступов сверху и снизу
$Selection.ParagraphFormat.SpaceBefore = 0
$Selection.ParagraphFormat.SpaceAfter = 0
Подготовительные работы закончены, теперь можем заполнять наш документ. Укажем что наш первый абзац будет по центру для этого воспользуемся свойством ParagraphFormat и его свойством
Aligment
.
#Выравнивание по центру
$Selection.ParagraphFormat.Alignment = 1
Далее создаем таблицу с одной строкой и одной ячейкой которую зальем черным цветом и разместим пользовательскую картинку.
#Добавляем таблицу
$Table = $Word.ActiveDocument.Tables.Add($Word.Selection.Range, 1, 1)
#Устанавливаем черный цвет заливки ячейки
$Table.Cell(1,1).Shading.BackgroundPatternColor = 0
#Вставляем картинку в ячейку таблицы
$Table.Cell(1,1).Range.InlineShapes.AddPicture("D:Tempbezramok-tlt.png")
#Конец таблицы, начать новую строку
$Selection.EndKey(6, 0)
Далее переходим на новую строчку документа воспользовавшись методом
TypeParagraph()
.
#Новый параграф
$Selection.TypeParagraph()
Далее установим нужные настройки для нашего заголовка.
#Шрифт написания
$Selection.Font.Name = "Times New Roman"
#Размер шрифта
$Selection.Font.Size = 18
Как видно из примера мы установили шрифт
Time New Roman
и размер шрифта
18
, далее вставляем текст.
#Текст заголовка
$Selection.TypeText("Работаем с Microsoft Word при помощи PowerShell")
Для следующего текста поменяем настройки шрифта и размер и вид, а также выровняем текст по ширине документа.
#Выравнивание по ширине листа
$Selection.ParagraphFormat.Alignment = 3
#Устанавливаем новые значения размера шрифта
$Selection.Font.Name = "Arial"
$Selection.Font.Size = 12
#Пишем курсивом
$Selection.Font.Italic = $true
Далее добавляем новый текст в наш документ.
#Добавляем следующий текст
$Selection.TypeText("Windows PowerShell — расширяемое средство автоматизации от Microsoft с открытым исходным кодом")
Так как для следующего текста нам не нужен курсив, то отключаем его.
#отключаем курсив
$Selection.Font.Italic = $false
Далее создаем настройки для следующего текста, выправным его по центру и изменим цвет на темно-зеленый, а также выделим жирным.
#Вставляем заголовок по центру
$Selection.ParagraphFormat.Alignment = 1
#Устанавливаем новые значения размера шрифта
$Selection.Font.Name = "Arial"
$Selection.Font.Size = 18
#Делаем цвет текста темно-зеленым
$Selection.Font.Color = "wdColorDarkGreen"
#Выделяем жирным
$Selection.Font.Bold = $True
#Следующий текст в нашем документе
$Selection.TypeText("Добавляем картинку из файла ")
Далее вставляем картинку в документ по центру, для этого используем свойство
InlineShapes
и его метод
AddPicture()
передав путь до картинки.
#Вставляем картинку из файла
$Selection.InlineShapes.AddPicture("D:Tempword.jpg")
Далее отменяем центрирование и меняем цвет текста на черный.
#Делаем цвет текста черным
$Selection.Font.Color = 0
#Отменяем жирный
$Selection.Font.Bold = $False
Устанавливаем новые настройки для следующего текста.
#Настройки размера шрифта для нового текста
$Selection.Font.Name="Times New Roman"
$Selection.Font.Size=12
Далее создадим таблицу с тремя столбцами в которую заполним с помощью
PowerShell
.
#Добавляем таблицу
$Table = $Word.ActiveDocument.Tables.Add($Word.Selection.Range, 1, 3)
#Ручной вариант форматирования таблицы
# $Table.Range.Style = "Table Grid"
# $Table.Borders.InsideLineStyle = 1
# $Table.Borders.OutsideLineStyle = 1
#Заполняем шапку таблицы
$Table.Cell(1,1).Range.Text = "№"
$Table.Cell(1,2).Range.Text = "Name"
$Table.Cell(1,3).Range.Text = "DysplayName"
#Счетчики для генерации таблицы
$i = 2
$counter = 1
#Получаем список всех процессов на компьютере
$srv = Get-Service a*
#Записываем полученые данные в ячейки таблицы
foreach ($arr in $srv)
{
$Table.Rows.Add()
$Table.Cell($i,1).Range.Text = $counter
$Table.Cell($i,2).Range.Text = $arr.Name
$Table.Cell($i,3).Range.Text = $arr.DisplayName
#инкрементируем счетчики
$i = $i + 1
$counter = $counter + 1
}
#Автоформатирование таблицы
$Table.AutoFormat(20)
#Конец таблицы, начать новую строку
$Selection.EndKey(6, 0)
Здесь нужно отметить, что ячейки таблицы начинаются с
1
. Для генерации новой строки нужно использовать свойство Rows и его метод
Add()
. Для удобства форматирования таблицы используем метод
AutoFormat()
передав число (это идентификатор шаблона форматирования таблицы). Для перехода от таблицы к обычному документу используем метод
EndKey(6, 0)
.
Далее создаем настройки для нового текста, выровняем все по левому краю и добавим гиперссылок в наш документ.
#Вставляем заголовок по центру
$Selection.paragraphFormat.Alignment = 0
#Размер шрифта
$Selection.Font.Size=14
#Текст
$Selection.TypeText("Урок создал")
#Новый параграф
$Selection.TypeParagraph()
#Размер шрифта
$Selection.Font.Size=12
#Гиперссылка сайта
$Selection.Hyperlinks.Add($Selection.Range,"http:#bezramok-tlt.ru")
#Новый параграф
$Selection.TypeParagraph()
#Гиперссылка почты
$Selection.Hyperlinks.Add($Selection.Range,"mailto:bezramok-tlt@mail.ru")
#Новый параграф
$Selection.TypeParagraph()
#Текст
$Selection.TypeText("Админ")
#Новый параграф
$Selection.TypeParagraph()
#Размер шрифта
$Selection.Font.Size=10
#Текст
$Selection.TypeText("Дата: " + $date)
Как вы заметили мы использовали свойство
Hyperlinks
и его метод
Add()
в который передали
URL
для гиперссылки.
Далее сохраняем документ (СохранитьКак) указываем путь куда будем сохранять наш файл, закрываем сам документ, закрываем само приложение MS Word.
#СохранитьКак указываем путь куда и имя файла
$doc.SaveAs([ref]"D:tempPsWord.docx")
#Закрываем документ
$doc.Close()
#Закрываем приложение
$word.Quit()
Я постарался собрать на мой взгляд основные действия для заполнения документа – это форматирование текста, изменение размера текста, шрифта, цвета. Создание таблиц, заполнение таблицы графически и текстовым материалом, а также заливка ячейки цветом.
Вот таким способом можно создавать документы
MS Word
с помощью
PowerShell
.
Скрипт PowerShell работа с MS Word целиком
#Получаем текущую дату
$date = Get-Date
#Создаем новый объект WORD
$word = New-Object -ComObject Word.Application
#Видимый режим вставки, по умолчанию FALSE
$word.Visible = $True
#Создаем новый документ
$doc = $word.Documents.Add()
#Выбираем открывшийся документ для работы
$Selection = $word.Selection
#Устанавливаем отступы для документа
$Selection.Pagesetup.TopMargin = 50
$Selection.Pagesetup.LeftMargin = 50
$Selection.Pagesetup.RightMargin = 50
$Selection.Pagesetup.BottomMargin = 50
#Интервал отступов сверху и снизу
$Selection.ParagraphFormat.SpaceBefore = 0
$Selection.ParagraphFormat.SpaceAfter = 0
#Выравнивание по центру
$Selection.ParagraphFormat.Alignment = 1
#Добавляем таблицу
$Table = $Word.ActiveDocument.Tables.Add($Word.Selection.Range, 1, 1)
#Устанавливаем черный цвет заливки ячейки
$Table.Cell(1,1).Shading.BackgroundPatternColor = 0
#Вставляем картинку в ячейку таблицы
$Table.Cell(1,1).Range.InlineShapes.AddPicture("D:Tempbezramok-tlt.png")
#Конец таблицы, начать новую строку
$Selection.EndKey(6, 0)
#Новый параграф
$Selection.TypeParagraph()
#Шрифт написания
$Selection.Font.Name = "Times New Roman"
#Размер шрифта
$Selection.Font.Size = 18
#Текст заголовка
$Selection.TypeText("Работаем с Microsoft Word при помощи PowerShell")
#Переходим на новую строку
$Selection.TypeParagraph()
#Выравнивание по ширине листа
$Selection.ParagraphFormat.Alignment = 3
#Устанавливаем новые значения размера шрифта
$Selection.Font.Name = "Arial"
$Selection.Font.Size = 12
#Пишем курсивом
$Selection.Font.Italic = $true
#Добавляем следующий текст
$Selection.TypeText("Windows PowerShell — расширяемое средство автоматизации от Microsoft с открытым исходным кодом")
#отключаем курсив
$Selection.Font.Italic = $false
#Новый параграф
$Selection.TypeParagraph()
#Новый параграф
$Selection.TypeParagraph()
#Вставляем заголовок по центру
$Selection.ParagraphFormat.Alignment = 1
#Устанавливаем новые значения размера шрифта
$Selection.Font.Name = "Arial"
$Selection.Font.Size = 18
#Делаем цвет текста темно-зеленым
$Selection.Font.Color = "wdColorDarkGreen"
#Выделяем жирным
$Selection.Font.Bold = $True
#Следующий текст в нашем документе
$Selection.TypeText("Добавляем картинку из файла ")
#Вставляем картинку из файла
$Selection.InlineShapes.AddPicture("D:Tempword.jpg")
#Делаем цвет текста черным
$Selection.Font.Color = 0
#Отменяем жирный
$Selection.Font.Bold = $False
#Новый параграф двойной отступ
$Selection.TypeParagraph()
$Selection.TypeParagraph()
#Настройки размера шрифта для нового текста
$Selection.Font.Name = "Times New Roman"
$Selection.Font.Size = 14
$Selection.TypeText("Создание таблицы в Microsoft Word средствами PowerShell")
#Новый параграф
$Selection.TypeParagraph()
#Новый параграф
$Selection.TypeParagraph()
#Настройки размера шрифта для нового текста
$Selection.Font.Name="Times New Roman"
$Selection.Font.Size=12
#Добавляем таблицу
$Table = $Word.ActiveDocument.Tables.Add($Word.Selection.Range, 1, 3)
#Ручной вариант форматирования таблицы
# $Table.Range.Style = "Table Grid"
# $Table.Borders.InsideLineStyle = 1
# $Table.Borders.OutsideLineStyle = 1
#Заполняем шапку таблицы
$Table.Cell(1,1).Range.Text = "№"
$Table.Cell(1,2).Range.Text = "Name"
$Table.Cell(1,3).Range.Text = "DysplayName"
#Счетчики для генерации таблицы
$i = 2
$counter = 1
#Получаем список всех процессов на компьютере
$srv = Get-Service a*
#Записываем полученые данные в ячейки таблицы
foreach ($arr in $srv)
{
$Table.Rows.Add()
$Table.Cell($i,1).Range.Text = $counter
$Table.Cell($i,2).Range.Text = $arr.Name
$Table.Cell($i,3).Range.Text = $arr.DisplayName
#инкрементируем счетчики
$i = $i + 1
$counter = $counter + 1
}
#Автоформатирование таблицы
$Table.AutoFormat(20)
#Конец таблицы, начать новую строку
$Selection.EndKey(6, 0)
#Новый параграф
$Selection.TypeParagraph()
#Вставляем заголовок по центру
$Selection.paragraphFormat.Alignment = 0
#Размер шрифта
$Selection.Font.Size=14
#Текст
$Selection.TypeText("Урок создал")
#Новый параграф
$Selection.TypeParagraph()
#Размер шрифта
$Selection.Font.Size=12
#Гиперссылка сайта
$Selection.Hyperlinks.Add($Selection.Range,"http:#bezramok-tlt.ru")
#Новый параграф
$Selection.TypeParagraph()
#Гиперссылка почты
$Selection.Hyperlinks.Add($Selection.Range,"mailto:bezramok-tlt@mail.ru")
#Новый параграф
$Selection.TypeParagraph()
#Текст
$Selection.TypeText("Админ")
#Новый параграф
$Selection.TypeParagraph()
#Размер шрифта
$Selection.Font.Size=10
#Текст
$Selection.TypeText("Дата: " + $date)
#Новый параграф
$Selection.TypeParagraph()
#СохранитьКак указываем путь куда и имя файла
$doc.SaveAs([ref]"D:tempPsWord.docx")
#Закрываем документ
$doc.Close()
#Закрываем приложение
$word.Quit()
Permalink
main
{{ refName }}
default
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
-
Go to file
-
Copy path
-
Copy permalink
Cannot retrieve contributors at this time
Application object (Word)
Remarks
Events
Methods
Properties
See also
274 lines (254 sloc)
13.8 KB
Raw
Blame
Open in GitHub Desktop
-
Open with Desktop
-
View raw
-
Copy raw contents
-
View blame
title | keywords | f1_keywords | ms.prod | api_name | ms.assetid | ms.date | ms.localizationpriority | description |
---|---|---|---|---|---|---|---|---|
Application object (Word) |
vbawd10.chm2416 |
vbawd10.chm2416 |
word |
Word.Application |
d1cf6f8f-4e88-bf01-93b4-90a83f79cb44 |
06/08/2017 |
medium |
Application object (Word) |
Application object (Word)
Represents the Microsoft Word application. The Application object includes properties and methods that return top-level objects. For example, the ActiveDocument property returns a Document object.
Remarks
Use the Application property to return the Application object. The following example displays the user name for Word.
MsgBox Application.UserName
Many of the properties and methods that return the most common user-interface objects—such as the active document (ActiveDocument property)—can be used without the Application object qualifier. For example, instead of writing Application.ActiveDocument.PrintOut
, you can write ActiveDocument.PrintOut
. Properties and methods that can be used without the Application object qualifier are considered «global.» To view the global properties and methods in the Object Browser, click <globals>
at the top of the list in the Classes box. (Also see the Global object.)
Remarks
To use Automation (formerly OLE Automation) to control Word from another application, use the Microsoft Visual Basic CreateObject or GetObject function to return a Word Application object. The following Microsoft Excel example starts Word (if it is not already running) and opens an existing document.
Set wrd = GetObject(, "Word.Application") wrd.Visible = True wrd.Documents.Open "C:My DocumentsTemp.doc" Set wrd = Nothing
Events
- DocumentBeforeClose
- DocumentBeforePrint
- DocumentBeforeSave
- DocumentChange
- DocumentOpen
- DocumentSync
- EPostageInsert
- EPostageInsertEx
- EPostagePropertyDialog
- MailMergeAfterMerge
- MailMergeAfterRecordMerge
- MailMergeBeforeMerge
- MailMergeBeforeRecordMerge
- MailMergeDataSourceLoad
- MailMergeDataSourceValidate
- MailMergeDataSourceValidate2
- MailMergeWizardSendToCustom
- MailMergeWizardStateChange
- NewDocument
- ProtectedViewWindowActivate
- ProtectedViewWindowBeforeClose
- ProtectedViewWindowBeforeEdit
- ProtectedViewWindowDeactivate
- ProtectedViewWindowOpen
- ProtectedViewWindowSize
- Quit
- WindowActivate
- WindowBeforeDoubleClick
- WindowBeforeRightClick
- WindowDeactivate
- WindowSelectionChange
- WindowSize
- XMLSelectionChange
- XMLValidationError
Methods
- Activate
- AddAddress
- AutomaticChange
- BuildKeyCode
- CentimetersToPoints
- ChangeFileOpenDirectory
- CheckGrammar
- CheckSpelling
- CleanString
- CompareDocuments
- DDEExecute
- DDEInitiate
- DDEPoke
- DDERequest
- DDETerminate
- DDETerminateAll
- DefaultWebOptions
- GetAddress
- GetDefaultTheme
- GetSpellingSuggestions
- GoBack
- GoForward
- Help
- HelpTool
- InchesToPoints
- Keyboard
- KeyboardBidi
- KeyboardLatin
- KeyString
- LinesToPoints
- ListCommands
- LoadMasterList
- LookupNameProperties
- MergeDocuments
- MillimetersToPoints
- Move
- NewWindow
- NextLetter
- OnTime
- OrganizerCopy
- OrganizerDelete
- OrganizerRename
- PicasToPoints
- PixelsToPoints
- PointsToCentimeters
- PointsToInches
- PointsToLines
- PointsToMillimeters
- PointsToPicas
- PointsToPixels
- PrintOut
- ProductCode
- PutFocusInMailHeader
- Quit
- Repeat
- ResetIgnoreAll
- Resize
- Run
- ScreenRefresh
- SetDefaultTheme
- ShowClipboard
- ShowMe
- SubstituteFont
- ToggleKeyboard
Properties
- ActiveDocument
- ActiveEncryptionSession
- ActivePrinter
- ActiveProtectedViewWindow
- ActiveWindow
- AddIns
- Application
- ArbitraryXMLSupportAvailable
- Assistance
- AutoCaptions
- AutoCorrect
- AutoCorrectEmail
- AutomationSecurity
- BackgroundPrintingStatus
- BackgroundSavingStatus
- Bibliography
- BrowseExtraFileTypes
- Browser
- Build
- CapsLock
- Caption
- CaptionLabels
- ChartDataPointTrack
- CheckLanguage
- COMAddIns
- CommandBars
- Creator
- CustomDictionaries
- CustomizationContext
- DefaultLegalBlackline
- DefaultSaveFormat
- DefaultTableSeparator
- Dialogs
- DisplayAlerts
- DisplayAutoCompleteTips
- DisplayDocumentInformationPanel
- DisplayRecentFiles
- DisplayScreenTips
- DisplayScrollBars
- Documents
- DontResetInsertionPointProperties
- EmailOptions
- EmailTemplate
- EnableCancelKey
- FeatureInstall
- FileConverters
- FileDialog
- FileValidation
- FindKey
- FocusInMailHeader
- FontNames
- HangulHanjaDictionaries
- Height
- International
- IsObjectValid
- IsSandboxed
- KeyBindings
- KeysBoundTo
- LandscapeFontNames
- Language
- Languages
- LanguageSettings
- Left
- ListGalleries
- MacroContainer
- MailingLabel
- MailMessage
- MailSystem
- MAPIAvailable
- MathCoprocessorAvailable
- MouseAvailable
- Name
- NewDocument
- NormalTemplate
- NumLock
- OMathAutoCorrect
- OpenAttachmentsInFullScreen
- Options
- Parent
- Path
- PathSeparator
- PickerDialog
- PortraitFontNames
- PrintPreview
- ProtectedViewWindows
- RecentFiles
- RestrictLinkedStyles
- ScreenUpdating
- Selection
- SensitivityLabelPolicy
- ShowAnimation
- ShowStartupDialog
- ShowStylePreviews
- ShowVisualBasicEditor
- SmartArtColors
- SmartArtLayouts
- SmartArtQuickStyles
- SpecialMode
- StartupPath
- StatusBar
- SynonymInfo
- System
- TaskPanes
- Tasks
- Templates
- Top
- UndoRecord
- UsableHeight
- UsableWidth
- UserAddress
- UserControl
- UserInitials
- UserName
- VBE
- Version
- Visible
- Width
- Windows
- WindowState
- WordBasic
- XMLNamespaces
See also
- Word Object Model Reference
[!includeSupport and feedback]
Опубликовано:
17 октября 2012 в 10:10
11
1
История вопроса
Необходимо печатать конверты по заданному макету. Задача довольно простая, когда мы заранее знаем, что необходимо печатать. Был создан интегрированный RTF-отчет. Посмотрев на него, пришли к выводу, что такой вариант будет недостаточно гибким, ведь почтовые
конверты бывают разные, при условии, что наши организации закупают их не централизовано, с печатью могут возникнуть проблемы.
Часть I. Индекс.
Был выбран путь формирование отчета из макета. Все текстовые поля замечательно проставляются с помощью макропеременных, но появляется загвоздка в формировании индекса. В RTF-отчете он формировался с помощью таблицы. Выбирая разные стили границ, мы можем
рисовать цифры. Можно было бы найти какой-нибудь подходящий шрифт, но его надо было бы устанавливать на все компьютеры, с которых возможна печать конвертов.
Посмотрели на готовый результат RTF-отчета с пустым индексом, сохранили его как docx, занесли в систему и обозвали макетом. Лишнее убрали, нужное добавили и сделали генерацию документа. И вот отчет уже почти готов.
Осталось нарисовать такие цифры:
В справке по VBA можно найти значения перечисления типа границы (wdBorderType). В соответствии с этими значениями создаем список соответствий, именем которого является цифра, значением – массив границ, формирующих число.
// Верхняя часть цифры
UpperPartOfNumber = CreateList()
UpperPartOfNumber.Add(0; ArrayOf(-1; -2; -4))
UpperPartOfNumber.Add(1; ArrayOf(-4; -8))
UpperPartOfNumber.Add(2; ArrayOf(-1; -4))
UpperPartOfNumber.Add(3; ArrayOf(-1; -8))
UpperPartOfNumber.Add(4; ArrayOf(-2; -4))
UpperPartOfNumber.Add(5; ArrayOf(-1; -2))
UpperPartOfNumber.Add(6; ArrayOf(-8))
UpperPartOfNumber.Add(7; ArrayOf(-1; -8))
UpperPartOfNumber.Add(8; ArrayOf(-1; -2; -4))
UpperPartOfNumber.Add(9; ArrayOf(-1; -2; -4))
// Нижняя часть цифры
LowerPartOfNumber = CreateList()
LowerPartOfNumber.Add(0; ArrayOf(-2; -3; -4))
LowerPartOfNumber.Add(1; ArrayOf(-4))
LowerPartOfNumber.Add(2; ArrayOf(-3; -8))
LowerPartOfNumber.Add(3; ArrayOf(-1; -8))
LowerPartOfNumber.Add(4; ArrayOf(-1; -4))
LowerPartOfNumber.Add(5; ArrayOf(-1; -3; -4))
LowerPartOfNumber.Add(6; ArrayOf(-1; -2; -3; -4))
LowerPartOfNumber.Add(7; ArrayOf(-2))
LowerPartOfNumber.Add(8; ArrayOf(-1; -2; -3; -4))
LowerPartOfNumber.Add(9; ArrayOf(-1; -8))
Приступаем к заполнению.
VBDocApp = CreateObject('Word.Application')
VBDoc = VBDocApp.Documents.Open(FileName)
PositionOfIndexNumber = 1
while PositionOfIndexNumber <= Length(OrgIndex)
// Получаем цифру индекса
IndexNumber = Copy(OrgIndex; PositionOfIndexNumber; 1)
// Заполняем вернюю часть цифры
UpperPart = UpperPartOfNumber.FindItem(IndexNumber)
UpperPartTable = VBDoc.Tables(INDEX_TABLE_NUMBER).Rows(UPPER_PART_POINTER).Cells((PositionOfIndexNumber*2)-1)
// x*2-1 нужно, потому что между цифрами так же есть столбцы без отображаемых границ
CyclePointer = 0
CycleCount = ArrayHighBound(UpperPart)
// Отрисовка верхней части цифры
while CyclePointer <= CycleCount
UpperPartTable.Borders.Item(UpperPart[CyclePointer]).LineStyle = INDEX_LINE_STYLE
UpperPartTable.Borders.Item(UpperPart[CyclePointer]).LineWidth = INDEX_LINE_WIDTH
CyclePointer = CyclePointer + 1
endwhile
// Заполняем нижнюю часть цифры
LowerPart = LowerPartOfNumber.FindItem(IndexNumber)
LowerPartTable = VBDoc.Tables(INDEX_TABLE_NUMBER).Rows(LOWER_PART_POINTER).Cells((PositionOfIndexNumber*2)-1)
CyclePointer = 0
CycleCount = ArrayHighBound(LowerPart)
// Отрисовка нижней части цифры
while CyclePointer <= CycleCount
LowerPartTable.Borders.Item(LowerPart[CyclePointer]).LineStyle = INDEX_LINE_STYLE
LowerPartTable.Borders.Item(LowerPart[CyclePointer]).LineWidth = INDEX_LINE_WIDTH
CyclePointer = CyclePointer + 1
endwhile
PositionOfIndexNumber = PositionOfIndexNumber + 1
endwhile
Часть II. Сборка единого документа.
Пожалуй, более полезная и распространенная, при этом, значительно более короткая часть изысканий в объектной модели Word.Application.
Рисование в таблице, как оказалось, не единственное действие, для которого нам понадобился данный COM-объект. В RTF-отчете, с помощью тегов, можно разбивать документ на страницы. При генерации документов из макета, их придется склеивать средствами, предоставляемыми
COM.
// Берем текущее содержимое документа
Content = MainDoc.Content
Content.Collapse(END_COLLAPSE_DIRECTION)
// Вставляем разделитель страницы
Content.InsertBreak(PAGE_BREAKE)
// Переходим на вновь получившуюся страницу
NewPageContent = Report.GoTo(GOTO_PAGE_ITEM; GOTO_LAST_PAGE_DIRECTION)
// Вставляем содержимое другого документа в главный
// DocPath – путь до документа в файловой системе
NewPageContent.InsertFile(DocPath)
GOTO_PAGE_ITEM – перечисление wdGoToItem. Определяет тип элемента для перехода. В нашем случае указываем, что перемещаемся по страницам.
GOTO_LAST_PAGE_DIRECTION – перечисление wdGoToDirection. Указывает направление перемещения. Для нас это последний элемент.
Эти перечисления указывают, что надо взять содержимое, находящееся на последней странице. Туда мы и вставляем новую информацию. Если бы эта страница имела бы какой-нибудь контент, он был бы заменен новой информацией. Если бы надо было добавить только подготовленную
текстовую информацию, то можно было бы использовать метод InsertAfter для всего содержимого документа, но у нас во втором документе находится несколько более комплексная информация.
Для справки.
Более подробную информацию по данному объекту можно найти в MSDN и справке по VBA.
This first article will dip our toes into creating the Word Com object, looking at sending text to Word and adjusting some of the various fonts and styles to give you a stepping stone on what you can do. I will be using Word 2013 in this article, so your mileage may vary if using older versions.
Creating the Word Object
Like any COM object, we must use New-Object with the –ComObject parameter to tell PowerShell that we are loading up a Com object.
$Word = New-Object -ComObject Word.Application
Now I have created my object as shown in the image below.
One thing that you might note is that we can’t see Word opened up, even though the process is actually active.
To make Word visible, we have to set the Visibility of the object to $True.
$Word.Visible = $True
Now you should see that Word is visible. But we don’t actually have a document loaded yet to start writing. We need to fix that first. We do this by calling the Documents.Add() method. I am keeping the output of this saved to another variable that will be used later on. I then want to select the current pane in Word so I can begin writing data to it.
$Document = $Word.Documents.Add() $Selection = $Word.Selection
Writing to Word
Writing to word is as simple as calling TypeText() and supplying a parameter which is text.
$Selection.TypeText("Hello")
Ok, nothing really mind blowing here, but this is how we can write in word using PowerShell. If I attempt to do this again, it will not actually start on the next line but append to the existing line.
We work around this by calling TypeParagraph().
$Selection.TypeParagraph() $Selection.TypeText("Hello1") $Selection.TypeParagraph() $Selection.TypeParagraph() $Selection.TypeText("Hello2") $Selection.TypeParagraph() $Selection.TypeParagraph() $Selection.TypeText("Hello3") $Selection.TypeParagraph()
Working with Styles
So lets start with a fresh slate (actually I am just going to delete all of the words here instead of rebuilding the object) and look at some of the Styles that we can use.
First off, we should see what kind of styles are available to use.
[Enum]::GetNames([Microsoft.Office.Interop.Word.WdBuiltinStyle]) | ForEach { [pscustomobject]@{Style=$_} } | Format-Wide -Property Style -Column 4
This is just one of the possible options to set a style that also includes using an integer or a string value that matches the names of what you would see in the toolbar for styles.
Whatever approach you are comfortable with will be just fine. Just make sure if it the setting isn’t that readable (such as using an integer) that you comment what the style is supposed to be for whoever might be looking at the code later on.
Moving on from that, we will set a couple of styles to show off what we can do. I think we at least need a Title and perhaps some sort of Header to show off what we are doing.
$Selection.Style = 'Title' $Selection.TypeText("Hello") $Selection.TypeParagraph() $Selection.Style = 'Heading 1' $Selection.TypeText("Report compiled at $(Get-Date).") $Selection.TypeParagraph()
Feel free to explore and find some styles that will work with what you are trying to do!
Exploring Fonts
The last item that I will cover today is working with Fonts such as changing the color and going with Bold or Italics.
We can locate the fonts using $Selection.Font
$Selection.Font
Ok, there is obviously a lot of stuff available here that we can manipulate, but I just focus on the basics. Notice that the Bold and Italic are specified by an integer. Currently, a 0 means that this is turned off. If we want to turn it on, we specify something other than a 0, such as a 1.
$Selection.Font.Bold = 1 $Selection.TypeText('This is Bold') $Selection.Font.Bold = 0 $Selection.TypeParagraph() $Selection.Font.Italic = 1 $Selection.TypeText('This is Italic')
Lastly, we will check out adjusting the colors of the text in word and we can find out the available colors using the following code:
[Enum]::GetNames([Microsoft.Office.Interop.Word.WdColor]) | ForEach { [pscustomobject]@{Color=$_} } | Format-Wide -Property Color -Column 4
Now we can write some code to take a look at some of these colors.
[Enum]::GetNames([Microsoft.Office.Interop.Word.WdColor]) | ForEach { $Selection.Font.Color = $_ $Selection.TypeText("This is $($_)") $Selection.TypeParagraph() } $Selection.Font.Color = 'wdColorBlack' $Selection.TypeText('This is back to normal')
Actually, I decided to just go through all of the colors so we can see each and every one!
One last thing! It may be a good idea to save our good work so we can view it later, right? So with that we can use the following code to save the document. We do this using the SaveAs method in the $Document object that we had created earlier. Aren’t you glad we saved that output earlier?
We do need to specify a reference variable which is the path and name of the file as well as a second parameter specifying the save format of the document. as…you guest it…another reference variable! We can find the possible format types using this code.
[Enum]::GetNames([microsoft.office.interop.word.WdSaveFormat])
And now I can save this document using the following code:
$Report = 'C:UsersproxbDesktopADocument.doc' $Document.SaveAs([ref]$Report,[ref]$SaveFormat::wdFormatDocument) $word.Quit()
I am calling the Quit() method to actually quit the application. Unfortunately, this doesn’t actually mean that the memory used to create this object has been freed up. Com objects play a little differently than .Net objects that we create. So with that in mind, I am going to do the following to free up that memory:
$null = [System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$word) [gc]::Collect() [gc]::WaitForPendingFinalizers() Remove-Variable word
There you go! That was a little dip into the pool of PowerShell and Word to get you going on building out something cool!
- Author
- Recent Posts
Alex Chaika is a Microsoft Certified Solution Expert (MCSE) with more than 15 years of experience in IT systems engineering. He currently focuses on PowerShell and VMware PowerCLI.
To manipulate Word documents with PowerShell, you first have to create a Word Application COM object.
Creating Word Application COM object
As you can see below there are a lot of options to work with:
Word COM methods and properties
To create a new Word document with PowerShell, you can use the commands below:
$word = New-Object -ComObject "Word.application" $word.Visible = $true $document = $word.documents.Add()
I assign $true to the $word.Visible property, so I can see the document I’m working on in Word.
Now let’s add a «nice» title to the document:
$word = New-Object -ComObject "Word.application" $word.Visible = $true $document = $word.documents.Add() $selection = $word.selection $selection.font.size = 14 $selection.font.bold = 1 $selection.Style ="Title" $selection.typeText("Nice Title") $selection.ParagraphFormat.Alignment = "wdAlignParagraphCenter"
I used the selection property and its font, typetext, and ParagraphFormat methods to put text into the newly created Word document, set the font size, set the text in bold, change its style, and center the title. Below you can see the result of these PowerShell commands:
The title of a Word document created with PowerShell
Next, I’ll add a little calendar in the form of a table to our document:
$selection.TypeParagraph() $Range = $selection.Range $Table = $document.Tables.Add($Range,6,7) $Table.AutoFormat(11) $Table.Borders.InsideLineStyle = 1
I added a new paragraph to my document using the Selection object and read the Range property of the selection, so I know where I’m adding the table. Then I use the Table method of the Word COM application object to add new table.
I am using the AutoFormat property to choose the table format. I just played with the format numbers till I found something I like. Then I’m using the InsideLineStyle property to make the inside borders of my table visible. Finally, I add column captions to my table:
$Column = 1 $Row = 1 $SysDateObject = new-object system.globalization.datetimeformatinfo $DayNames = $SysDateObject.Daynames $DayNames | %{ $Table.Cell($Column,$Row).Range.Text = $_ $Table.Cell($Column,$Row).Range.Font.Name = "Forte" $Row++ }
Since I’m working with a table, I need to establish cell coordinates so I can manipulate the cells. Thus, I add $Row and $Column variables and assign 1 to each of them. Then I get the weekday names from the PowerShell system.globalization.datetimeformatinfo object and assign them to the top cells of my table. To make them look a little better, I change the font. And this is how my Word document looks now:
A Word table created with PowerShell
I have weekday names, but it would be nice to add dates to my little calendar:
$i = 1 $Column = 2 $Row = 2 for($i -eq 1; $i -le [datetime]::DaysInMonth(17,5); $i++){ $Table.Cell($Row,$Column).Range.Text = $i $Table.Cell($Row,$Column).Range.ParagraphFormat.Alignment = "wdAlignParagraphRight" $Column++ if($Column -gt 7){ $Row++ $Column = 1 } }
Firstly, I set up some variables: $i will be my day index, and you already know $Row and $Column. I get the number of days in May from the datetime PowerShell object and then loop from 1 to 31, because May has 31 days. Then I assign the value of $i to the corresponding cell. Because I have only seven columns, I reset the $Column value to 1 every time it becomes greater than 7.
And this is my calendar:
The Word calendar with dates
Here is the entire script that adds a title and table to a Word document using PowerShell:
$word = New-Object -ComObject "Word.application" $word.Visible = $true $document = $word.documents.Add() $selection = $word.selection $selection.font.size = 14 $selection.font.bold = 1 $selection.Style ="Title" $selection.typeText("Nice Title") $selection.ParagraphFormat.Alignment = "wdAlignParagraphCenter" $selection.TypeParagraph() $Range = $selection.Range $Table = $document.Tables.Add($Range,6,7) $Table.AutoFormat(11) $Table.Borders.InsideLineStyle = 1 $Column = 1 $Row = 1 $SysDateObject = new-object system.globalization.datetimeformatinfo $DayNames = $SysDateObject.Daynames $DayNames | %{ $Table.Cell($Row,$Column).Range.Text = $_ $Table.Cell($Row,$Column).Range.Font.Name = "Forte" $Column++ } $i = 1 $Column = 2 $Row = 2 for($i -eq 1; $i -le [datetime]::DaysInMonth(17,5); $i++){ $Table.Cell($Row,$Column).Range.Text = $i $Table.Cell($Row,$Column).Range.ParagraphFormat.Alignment = "wdAlignParagraphRight" $Column++ if($Column -gt 7){ $Row++ $Column = 1 } } $word = New-Object -ComObject "Word.application" $word.Visible = $true $document = $word.documents.Add() $selection = $word.selection $selection.font.size = 14 $selection.font.bold = 1 $selection.Style ="Title" $selection.typeText("Nice Title") $selection.ParagraphFormat.Alignment = "wdAlignParagraphCenter" $selection.TypeParagraph() $Range = $selection.Range $Table = $document.Tables.Add($Range,6,7) $Table.AutoFormat(11) $Table.Borders.InsideLineStyle = 1 $Column = 1 $Row = 1 $SysDateObject = new-object system.globalization.datetimeformatinfo $DayNames = $SysDateObject.Daynames $DayNames | %{ $Table.Cell($Row,$Column).Range.Text = $_ $Table.Cell($Row,$Column).Range.Font.Name = "Forte" $Column++ } $i = 1 $Column = 2 $Row = 2 for($i -eq 1; $i -le [datetime]::DaysInMonth(17,5); $i++){ $Table.Cell($Row,$Column).Range.Text = $i $Table.Cell($Row,$Column).Range.ParagraphFormat.Alignment = "wdAlignParagraphRight" $Column++ if($Column -gt 7){ $Row++ $Column = 1 } }
Now let’s do something a bit more complicated. Let’s create a calendar for 2018 using PowerShell and Word.
Let’s start from the title. There is nothing new here except the $END_OF_STORY variable, which represents the end of the Word document.
$word = New-Object -ComObject "Word.application" $END_OF_STORY = 6 $word.Visible = $true $document = $word.documents.Add() $SysDateObject = new-object system.globalization.datetimeformatinfo $DayNames = $SysDateObject.Daynames $selection = $word.selection $selection.font.size = 14 $selection.font.bold = 1 $selection.Style ="Title" $selection.typeText("2018 Calendar") $selection.ParagraphFormat.Alignment = "wdAlignParagraphCenter"
To add a calendar for each month, I will use a loop that iterates through the months from 1 to 12. I’m using the get-date PowerShell function to get the first weekday for each month.
$y = 1 for($y -eq 1; $y -le 12; $y++){ $CURRENTDATE=GET-DATE "$y/1/2018" $FirstDayofMonth = ($CURRENTDATE).DayOfWeek.value__ +1 if($FirstDayofMonth -gt 7){ $FirstDayofMonth = 1 $FirstDayofMonth }
Next I add a new page to the document and create a title for it. Because I’m still inside the for loop, the title will be the name of the current month, which the $CMonth variable represents. Then I’m adding the weekday names to the calendar:
$selection.InsertNewPage() $selection.font.size = 14 $selection.font.bold = 1 $selection.Style ="Title" $CMonth = (Get-Culture).DateTimeFormat.GetMonthName($CURRENTDATE.Month) $selection.typeText("$CMonth 2018") $selection.ParagraphFormat.Alignment = "wdAlignParagraphCenter" $selection.TypeParagraph() $Range = $selection.Range $Table = $document.Tables.Add($Range,7,7) $Table.AutoFormat(11) $Table.Borders.InsideLineStyle = 1 $Column = 1 $Row = 1 $DayNames | %{ $Table.Cell($Row,$Column).Range.Text = $_ $Table.Cell($Row,$Column).Range.Font.Name = "Forte" $Column++ }
Now I’m putting days into my table starting at the $FirstDayOfMonth column number, which I calculated before. And when all days are in place, I need to move the cursor to the end of the document, so it will add a new page in the cycle’s next iteration at the end of the document.
$i = 1 $Column = $FirstDayofMonth $Row = 2 $DMonth = $CURRENTDATE.Month for($i -eq 1; $i -le [datetime]::DaysInMonth(18,$DMonth); $i++){ $Table.Cell($Row,$Column).Range.Text = $i $Table.Cell($Row,$Column).Range.ParagraphFormat.Alignment = "wdAlignParagraphRight" $Column++ if($Column -gt 7){ $Row++ $Column = 1 } } $selection.EndKey($END_OF_STORY) }
And here is how my calendar for 2018 looks:
Word document calendar page created by PowerShell
Below is the entire script to create a calendar in Word with PowerShell:
Subscribe to 4sysops newsletter!
$word = New-Object -ComObject "Word.application" $END_OF_STORY = 6 $word.Visible = $true $document = $word.documents.Add() $SysDateObject = new-object system.globalization.datetimeformatinfo $DayNames = $SysDateObject.Daynames $selection = $word.selection $selection.font.size = 14 $selection.font.bold = 1 $selection.Style ="Title" $selection.typeText("2018 Calendar") $selection.ParagraphFormat.Alignment = "wdAlignParagraphCenter" $y = 1 for($y -eq 1; $y -le 12; $y++){ $CURRENTDATE=GET-DATE "$y/1/2018" $FirstDayofMonth = ($CURRENTDATE).DayOfWeek.value__ +1 if($FirstDayofMonth -gt 7){ $FirstDayofMonth = 1 $FirstDayofMonth } $selection.InsertNewPage() $selection.font.size = 14 $selection.font.bold = 1 $selection.Style ="Title" $CMonth = (Get-Culture).DateTimeFormat.GetMonthName($CURRENTDATE.Month) $selection.typeText("$CMonth 2018") $selection.ParagraphFormat.Alignment = "wdAlignParagraphCenter" $selection.TypeParagraph() $Range = $selection.Range $Table = $document.Tables.Add($Range,7,7) $Table.AutoFormat(11) $Table.Borders.InsideLineStyle = 1 $Column = 1 $Row = 1 $DayNames | %{ $Table.Cell($Row,$Column).Range.Text = $_ $Table.Cell($Row,$Column).Range.Font.Name = "Forte" $Column++ } $i = 1 $Column = $FirstDayofMonth $Row = 2 $DMonth = $CURRENTDATE.Month for($i -eq 1; $i -le [datetime]::DaysInMonth(18,$DMonth); $i++){ $Table.Cell($Row,$Column).Range.Text = $i $Table.Cell($Row,$Column).Range.ParagraphFormat.Alignment = "wdAlignParagraphRight" $Column++ if($Column -gt 7){ $Row++ $Column = 1 } } $selection.EndKey($END_OF_STORY) }
Объектная модель MS Word, объект Application
9.1. Объектная модель MS Word
Microsoft Word 2007, как, впрочем, и другие приложения Office, имеет большую объектную модель , в которую входят множество объектов и коллекций. Однако на практике чаще всего используются лишь некоторые из них.
В частности, это следующие:
- Word (Microsoft Word) — чтобы вызывать объекты Microsoft Office Word из других приложений используется объект Word.
- Application (Приложение) — объект, который включает в себя все остальные объекты и коллекции. Сам объект Application включается в объект Word .
- Documents (Документы) — коллекция, которая включает в себя объекты Document (Документ). Объект Document представляет собой документ, с которым вы работаете в редакторе.
- Bookmarks (Закладки) — c помощью объектов этой коллекции можно задавать места в документе, в которые, при автоматическом создании, можно вставлять изменяемые части.
- Paragraphs (Абзацы), Sentences (Предложения), Words (Слова), Characters (Символы), Tables (Таблицы), OMath (Математические формулы), Эти коллекции, содержащие объекты, соответствующие их названиям, могут использоваться для обработки слов документа ( Words ), предложений ( Sentences ), отдельных символов ( Characters ) и т.д.
- Selection (Выделенная область) — представляет собой выделенную область документа или позицию, в которую будет осуществляться вставка очередного символа . Этот объект часто используют при создании простых документов. Однако у него есть существенные недостатки, что делает предпочтительнее использование объекта Range в большинстве случаев.
- Range (Диапазон) — входит в Document и другие объекты, представляет собой диапазон документа, ограниченный начальным и конечным символом.
Работая с объектной моделью MS Word следует понимать, что, например, объекты Document и Selection могут содержать одинаковые коллекции объектов, например, и там и там есть коллекция Characters , в которую входят объекты Character — то есть — символы. Однако в случае с объектом Document мы можем работать с любым символом документа, а в случае с Selection — лишь с символами в пределах выделенной области. Однако, несмотря на различия, и там и там коллекция Characters имеет одинаковые свойства и методы. То же самое касается и других коллекций и объектов.
Давайте начнем с объекта Application и здесь же поговорим об использовании объектных переменных .
9.2. Работа с объектными переменными
Объектные переменные — это переменные, которые хранят ссылки на объекты . Чтобы инициализировать объектную переменную , нужно использовать ключевое слово Set . Например, так (листинг 9.1.):
Здесь вы можете видеть присваивание переменной ссылки на объект Word.Application . Код, подобный этому, нужен в других приложениях Microsoft Office для запуска нового экземпляра MS Word .
Для того чтобы вы могли работать с Microsoft Word из других приложений — подключите библиотеку Microsoft Word 12.0 Object Library . Сделать это можно, открыв в редакторе окно References командой Tools o References .
Немного ниже мы поговорим о том, что можно делать с объектными переменными , а пока сосредоточимся на их объявлении и инициализации.
Как видите, в листинге 9.1 мы не объявляли переменную — мы сразу присвоили ей ссылку на объект . При последующей работе с такой необъявленной объектной переменной , мы не сможем пользоваться подсказкой по свойствам и методам. Вспомните — когда вы набираете в редакторе имя элемента управления и ставите после него точку — вы видите подсказку. Это очень удобно, так как позволяет избежать ошибок и излишних «походов» в справочную систему VBA .
Для того чтобы справка по свойствам и методам работала, объектную переменную надо сначала объявить, а потом присвоить ей ссылку на объект . Например, так (листинг 9.2.):
Ссылку на объект можно присвоить в процессе объявления переменной. Для этого нужно воспользоваться ключевым словом New (листинг 9.3.):
Переменную, объявленную таким образом, мы можем сразу же использовать по назначению. Новый экземпляр объекта будет создан при первом обращении к нему.
О том, как же пользоваться объектными переменными , скорее даже не ими, а объектами, на которые они ссылаются, мы поговорим ниже.
9.3. Объект Application — приложение
Объект Application можно представить в виде приложения Microsoft Word .
Такой код позволит вывести в окно сообщения информацию об имени приложения:
Как видите, здесь мы обратились к свойству Name (Имя) объекта Application . Вот, что будет выведено при его исполнении (рис. 9.1.).
Здесь мы обходимся без объектных переменных , работая с уже существующим объектом. Ведь если этот код исполняется в Microsoft Word , это значит, что сам Microsoft Word уже запущен.
Чтобы упростить обращение к нескольким свойствам объекта, можно воспользоваться оператором With-End With . Этот оператор позволяет обращаться к нескольким свойствам или методам объекта в упрощенной форме. Например, чтобы вывести имя приложения и узнать номер сборки программы нужно воспользоваться таким построением (листинг 9.4.):
Здесь мы использовали объект Application — вместо него может быть любой другой объект или объектная переменная .
Еще один оператор, которым удобно пользоваться при работе с объектами и коллекциями — это For Each…Next .
Например, для вывода в окнах сообщений имен всех открытых документов, можно написать такой код (листинг 9.5.):
Var_Doc — это переменная типа Variant . Коллекция Application.Documents содержит все открытые документы. При каждом проходе цикла в переменную var_Doc записывается ссылка на очередной объект в коллекции.
Чтобы выйти из цикла , можно воспользоваться оператором Exit For .
Сейчас мы кратко опишем важнейшие методы , свойства и события объекта Application .
9.4. Методы объекта Application
9.4.1. BuildKeyCode, KeyString — горячие клавиши
BuildKeyCode возвращает уникальный цифровой код для заданной комбинации клавиш. Используется при назначении «горячих клавиш» для выполнения различных операций.
KeyString возвращает комбинацию клавиш для переданного кода.
Ниже мы рассмотрим пример программного назначения клавиатурной комбинации для вызова макроса.
9.4.2. ChangeFileOpenDirectorу — путь для работы с файлами
ChangeFileOpenDirectory позволяет установить директорию, в которой Microsoft Word ищет файлы для открытия. В установленной папке программа будет искать файлы при программном открытии файлов и при вызове окна открытия файлов.
Выбранная директория будет использоваться для открытия файлов по умолчанию лишь до тех пор, пока Word не будет перезапущен.
Например, чтобы установить папку » C:Новые документы » в качестве папки по умолчанию, можно использовать такой код (листинг 9.6.):
Следует отметить, что если мы вызываем метод или свойство объекта Application из макроса Microsoft Word, мы можем опускать вызов Application — то есть, в вышеприведенном примере можно написать так:
9.4.3. CleanString — очистка строк
CleanString очищает переданную строку от непечатаемых и специальных символов, превратив ее в обычный текст. Такой же текст можно получить, если скопировать текст из Microsoft Word в Блокнот, а потом — обратно. Например, с помощью такого кода можно получить очищенную строку из выделенной области документа (листинг 9.7.).
9.4.4. Keyboard — программное переключение раскладки
Keyboard позволяет программно переключать раскладку клавиатуры. При переключении используется идентификатор языковых и клавиатурных установок. Чтобы включить русскую раскладку, можно воспользоваться таким кодом (листинг 9.8.):
Очевидно, что 1049 — это код русского языка. Для включения английской раскладки используйте этот метод с идентификатором 1033.
9.4.5. ListCommands — справка по горячим клавишам
ListCommands это необычный метод — если вызвать его с параметром True (листинг 9.9.) — он создаст новый документ, содержащий таблицу со списком клавиатурных сочетаний, назначенных командам MS Word. Таблица содержит несколько десятков страниц.
9.4.6. NewWindow — копия окна активного документа
NewWindow создает копию окна активного документа. Это может быть полезным например, для того, чтобы вывести один и тот же документ на два монитора при работе с расширенным рабочим столом и т.д. Например, метод можно вызвать так:
При необходимости можно задать, для какого именно документа вы хотите создать копию окна. Однако, это потребует использования других объектов. Например — коллекции Windows , содержащей окна документов. Такой код (листинг 9.11.) создаст одну копию для каждого открытого окна:
Мы не случайно запустили цикл обхода открытых окон в обратном порядке. Дело в том, что иначе будет создано несколько копий одного и того же документа.
В этом примере вам встретились неизвестные ранее свойства Count и Item . Первое обычно содержит количество элементов в коллекции, второе позволяет обращаться к элементам по индексам или именам.
При создании копии после имени документа появляется двоеточие с номером окна, например, «:1» для первого, «:2» для второго и т.д.
9.4.7. OnTime — запуск макросов по расписанию
OnTime позволяет устанавливать таймер, по которому можно запустить макрос в определенное время. Например, чтобы выполнить макрос MyMacros , который хранится в том же документе, что и исполняемый макрос, достаточно выполнить такой код (листинг 9.12.).
Параметр When указывает на время запуска, параметр Name — на имя макроса. Важно, чтобы макрос был доступен как в момент запуска таймера, так и в момент запуска самого макроса. Для того чтобы это условие соблюдалось, желательно хранить макросы, запускаемые по таймеру, в Normal.dotm , в другом глобальном шаблоне, или в том же документе, в котором произошел запуск таймера.
Как видите, мы привели пример лишь для запуска макроса в строго определенное время. А как же быть, если нужно запустить макрос, например, через пятнадцать секунд после выполнения какой-либо процедуры? Ответ прост (листинг 9.13.)
Здесь мы запускаем тот же самый макрос, но уже через 15 секунд после установки таймера. Функция Now имеет тип Date и возвращает текущую дату и время, а функция TimeValue преобразует переданное ей время в формат Date .
Если вы хотите, чтобы какой-то макрос запускался с некоторой периодичностью — установку таймера на запуск этого макроса можно установить в нем. Первый запуск макроса можно произвести вручную или каким-то другим способом (например — по событию приложения, с помощью автоматически выполняемого макроса), а последующие запуски этот макрос будет инициировать самостоятельно.
Благин Константин
Программирование как созидательный процесс.
Использование шаблонов Word в 1С
Использование шаблонов Word в 1С
В работе программиста 1С, данный функционал требуется крайне редко, хотя благодаря нему можно решать довольно сложные задачи с динамическими и не постоянными печатными формами. При реализации данной задачи, работа по созданию шаблонов Word и расстановке закладок в шаблоне Word возлагается на пользователей 1C.
В данном примере будет показано, как используя механизмы 1С и документа Word в качестве шаблона, можно создать печатную форму для вывода данных, пользователям программы 1С.
Создадим шаблон на основе документа Word для 1С. Сначала необходимо включить показ закладок для более удобной работы с документом:
Использование шаблонов Word в 1С
Использование шаблонов Word в 1С
Далее необходимо в файл шаблона для 1С, добавить текст и пару закладок. Закладка добавляется через меню «Вставка» — «Закладка». Нужно выделить текст закладки, скопировать его, открыть меню «Вставка — Закладка», вставить скопированный текст закладки и нажать «Добавить»:
Установка закладки, шаблон Word для 1С
В результат запуска внешней обработки 1С по формированию печатной формы на основе шаблона в виде файла Word, мы получим следующий результат:
Результат использования шаблонов Word в 1С
Информацию по методам COM объекта Word, а так же дополнительные данные можно узнать из MSDN.
Дополнение к заметке Использование шаблонов Word в 1С
Выражаю благодарность, всем тем, кто комментирует запись, благодаря вам, материал дополняется новыми данными и будет полезен более широкому кругу посетителей.
1. А как поменять размер шрифта во вставляемом тексте?
Достаточно изменить размер шрифта закладки, в шаблоне. А вот, если необходимо динамически менять размерность, тогда:
2. Картинки есть возможность выгружать в шаблон?
Да, конечно. Примеры для C# и VB описаны по ссылке: https://msdn.microsoft.com/ru-ru/library/ms178792.aspx, а для 1С код будет следующий:
3. При выполнении кода: ОбъектВорд.Documents.Add(«C:/Шаблон.docx») (туда я поместил Ваш документ) получаю ошибку : «Ошибка при вызове метода контекста (Add)» в чем может быть причина?
Может попробовать изменить путь на: «C:Шаблон.docx».
4. Подскажите пожалуйста еще почему при сохранении макета типа active document в файл word кодом:
Я получаю вместо нормального документа вот такой http://prntscr.com/eshgjk
Предполагаю, что метод Записать( , ) по умолчанию, записывает файл в формате MXL. Попробуйте вторым параметром установить значение: ТипФайлаТабличногоДокумента.DOCX, более подробно описано в «Синтакс-помощнике».
5. У меня в документе есть ссылки на файлы которые расположены на сетевом диске. Как в шаблоне сделать гиперссылку на эти файлы?
Интересный вопрос, если попробовать сделать запись макроса и посмотреть результат, то в Visual Basic добавление гиперссылки будет выглядеть следующим образом:
Соответственно код для 1С следующий:
Навигация по записям
Использование шаблонов Word в 1С : 29 комментариев
А как поменять размер шрифта во вставляемом тексте?
- Благин Константин Автор записи 27.11.2016 в 16:02
Достаточно изменить размер шрифта закладки, в шаблоне. А вот, если необходимо динамически менять размерность, тогда:
Добрый день, подскажите, пожалуйста, картинки есть возможность выгружать в шаблон?
- Благин Константин Автор записи 30.11.2016 в 15:03
Да, конечно. Примеры для C# и VB описаны по ссылке: https://msdn.microsoft.com/ru-ru/library/ms178792.aspx, а для 1С код будет следующий:
Спасибо, будем пробовать.
Снова, здравствуйте.
Вопрос по шаблонам. Попросили перенести шаблоны, написанные в Word из ЗиК 1.0 в ЗиК 3.0.
Как я понял — не перенесутся, нужно новые писать. Поскольку, учусь, то это даже на руку. За образец решил взять Ваш и начать разбираться. Но Ваш НЕ ГРУЗИТСЯ. Пишет:
Невозможно подключить дополнительную обработку из файла.
Возможно, она не подходит для этой версии программы.
Метод объекта не обнаружен (СведенияОВнешнейОбработке)
Кстати, когда пытаюсь загрузить шаблоны из 1.0, то пишет тоже самое.
Можете что-нибудь посоветовать?
- Благин Константин Автор записи 04.12.2016 в 15:29
Данная ошибка, появляется, потому что обработка создана просто как внешняя, без возможности подключения к 1С. Если вы хотите подключить какую либо обработку, в режиме «1С:Предприятие», тогда в модуле обработки необходимо вставить определенный код, более подробно описано по следующим ссылкам:
Добавление дополнительных отчетов и обработок в тонком клиенте.
Создание нового отчета или обработки
youtube: Создание внешней обработки
А насчет переноса могу посоветовать, проанализировать, как в ЗиК 1.0 производилось заполнение шаблона. Найти участки кода, которые за это отвечают, попробовать сначала перенести их во внешнюю обработку, для тестирования. Как вариант, сам шаблон можно положить в макеты (тип макета «Active document») этой обработки и уже оттуда загружать его.
Здесь есть несколько нюансов, механизм заполнения шаблонов и сами шаблоны, типовые, доработанные или самописные? Объекты которые используются для заполнения в ЗиК 1.0 могут отсутствовать в ЗиК 3.0 или иметь другое наименование. Плюс ко всему, необходимо еще учесть, что ЗиК 1.0 это обычное приложение, использующее толстый клиент, а ЗиК 3.0 управляемое приложение, использующее тонкий клиент, соответственно здесь тоже присутствует своя специфика работы.
Да и еще, в ЗиК 3.0 как мне кажется должен быть свой механизм шаблонов, к сожалению, не работал с этими конфигурациями, но вероятно там уже есть механизм аналогичный ЗиК 1.0. Так что может, будет достаточно только добавить шаблон.
Спасибо за быстрый и подробный ответ.
Попробую разобраться.
Шаблоны у нас самописные.
Про собственный механизм шаблонов, даже не слышал. Попробую поискать в сети.
Ваша ссылка помогла.
Добавил две функции и одну процедуру, и Ваша обработка заработала.
Свою, похоже , придётся рисовать с нуля.
При выполнении кода: ОбъектВорд.Documents.Add(«C:/Шаблон.docx») (туда я поместил Ваш документ) получаю ошибку : «Ошибка при вызове метода контекста (Add)» в чем может быть причина?
- Благин Константин Автор записи 05.04.2017 в 07:59
Может попробовать изменить путь на: «C:Шаблон.docx»
Помогло. Спасибо.
Подскажите пожалуйста еще почему при сохранении макета типа active document в файл word кодом:
ОбработкаОбъект = РеквизитФормыВЗначение(«Объект»);
Макет = ОбработкаОбъект.ПолучитьМакет(«ШаблонПисьмаПросрочка»);
ИмяФайла = КаталогВременныхФайлов() + «»файл.doc»;
Макет.Записать(ИмяФайла);
Я получаю вместо нормального документа вот такой http://prntscr.com/eshgjk
- Благин Константин Автор записи 05.04.2017 в 19:56
Предполагаю, что метод Записать( , ) по умолчанию, записывает файл в формате MXL. Попробуйте вторым параметром установить значение: ТипФайлаТабличногоДокумента.DOCX, более подробно описано в «Синтакс-помощнике».
Константин,
У меня в документе есть ссылки на файлы которые расположены на сетевом диске.
Как в шаблоне сделать гиперссылку на эти файлы?
- Благин Константин Автор записи 31.07.2017 в 21:27
Здравствуйте, Руслан.
Интересный вопрос, если попробовать сделать запись макроса и посмотреть результат, то в Visual Basic добавление гиперссылки будет выглядеть следующим образом:
Соответственно код для 1С следующий:
я хочу заполнить шаблон с помощью заполнения пользовательской формы. как получить значение,выбранное из списка, если тип поля СправочникСсылка.НазваниеСправочника?
- Благин Константин Автор записи 07.06.2018 в 19:03
Предполагаю заполнение производите на стороне клиента, тогда можете сразу обратиться к элементу формы или объекта.
Здравствуйте. Попросили обновить шаблоны договоров для печати. Обновила, но теперь при печати выводит ошибку, что не удалось сформировать элемент управления ActiveX. С чем это может быть связано?
- Благин Константин Автор записи 28.06.2018 в 11:30
Ирина, для ответа необходима дополнительная информация:
1. Какая конфигурация используется?
2. Каким образом происходило обновление шаблонов?
3. Ошибка выходит при формировании документа на основе данных и шаблона или при отправке на печать?
Доброго дня. Прошу помочь с задачей вставки в документ Word, ранее записанного файла HTML (из 1С сохранил на диск, браузером файл открывается нормально — отображается НЕ как текст)., а в документе Word формируется как текст не конвертированный.
Вставляю так
Word = ПечатнаяФорма.COMСоединение;
Select = Word.Selection;
Docum = Word.Application.Documents(1);
Select.InsertFile(«C:Temp1.html»);
- Благин Константин Автор записи 19.07.2019 в 13:32
В данный момент не пользуюсь Office, попробуйте использовать Selection.PasteAndFormat как было подсказано здесь: https://toster.ru/q/164995
Добрый день. Все бы хорошо, но, как сделать не обработку а печатную форму?
Я сделал внешнюю печатную форму с шаблоном типа Active Document, добавил пока одну закладку на пробу, подключил, чтобы при нажатии кнопки «Печать» из справочника «договоры» выполнялось. Открывается Word, все работает, но, в базе возникает окно где написано : Печать. Печатная форма недоступна. Как сделать чтобы окно не вылезало? Обработка не подходит потому что она не падает в меню кнопки «Печать»
- Благин Константин Автор записи 08.09.2019 в 11:48
1. Конфигурация какая?
2. Нужен скриншот ошибки.
3. Нужен код модуля для анализа.
Скажите пожалуйста а можно шаблон word в обработку вставить, чтобы он в конфигурации был
- Благин Константин Автор записи 02.12.2019 в 20:54
Добрый день, подскажите, пожалуйста, как сделать так, чтобы подобный документ создавался при нажатии на кнопку на форме . Я создала команду «Документ», но не понимаю, что нужно вписать в ее обработчик. У меня имеется документ «ПриемНаРаботу» в виде списка, я заполняю форму (фио, паспорт, должность, оклад). А после могу нажать на кнопку «Документ», чтобы увидеть тот самый шаблон word.Как это можно сделать?
- Благин Константин Автор записи 15.12.2019 в 14:07
Ирина, вы можете воспользоватся примером из обработки, ссылку на которую находится внизу заметки.
1. Подготовить шаблон Word, расставив в нем закладки;
2. В код команды добавить заполнение файла и его вывод.
Добрый день, а как можно вставить в колонтитул на разных листах в ворде номера бланков взятых из 1С( 1 лист бланк — №0089 ,2 лист бланк — №0090 и …)
- Благин Константин Автор записи 02.02.2020 в 14:46
https://infostart.ru/public/488556/
Цитата:
Каждая страница Word разделена на несколько областей:
Верхний колонтитул
Основной текст
Нижний колонтитул
Нужно заметить, что в каждом разделе может быть уникальный колонтитул для первой страницы.
Использование COM-объекта Word.Application для программной отрисовки таблиц и сборки документа
Опубликовано:
17 октября 2012 в 10:10
История вопроса
Необходимо печатать конверты по заданному макету. Задача довольно простая, когда мы заранее знаем, что необходимо печатать. Был создан интегрированный RTF-отчет. Посмотрев на него, пришли к выводу, что такой вариант будет недостаточно гибким, ведь почтовые конверты бывают разные, при условии, что наши организации закупают их не централизовано, с печатью могут возникнуть проблемы.
Часть I. Индекс.
Был выбран путь формирование отчета из макета. Все текстовые поля замечательно проставляются с помощью макропеременных, но появляется загвоздка в формировании индекса. В RTF-отчете он формировался с помощью таблицы. Выбирая разные стили границ, мы можем рисовать цифры. Можно было бы найти какой-нибудь подходящий шрифт, но его надо было бы устанавливать на все компьютеры, с которых возможна печать конвертов.
Посмотрели на готовый результат RTF-отчета с пустым индексом, сохранили его как docx, занесли в систему и обозвали макетом. Лишнее убрали, нужное добавили и сделали генерацию документа. И вот отчет уже почти готов.
Осталось нарисовать такие цифры:
В справке по VBA можно найти значения перечисления типа границы (wdBorderType). В соответствии с этими значениями создаем список соответствий, именем которого является цифра, значением – массив границ, формирующих число.
Приступаем к заполнению.
Часть II. Сборка единого документа.
Пожалуй, более полезная и распространенная, при этом, значительно более короткая часть изысканий в объектной модели Word.Application.
Рисование в таблице, как оказалось, не единственное действие, для которого нам понадобился данный COM-объект. В RTF-отчете, с помощью тегов, можно разбивать документ на страницы. При генерации документов из макета, их придется склеивать средствами, предоставляемыми COM.
GOTO_PAGE_ITEM – перечисление wdGoToItem. Определяет тип элемента для перехода. В нашем случае указываем, что перемещаемся по страницам.
GOTO_LAST_PAGE_DIRECTION – перечисление wdGoToDirection. Указывает направление перемещения. Для нас это последний элемент.
Эти перечисления указывают, что надо взять содержимое, находящееся на последней странице. Туда мы и вставляем новую информацию. Если бы эта страница имела бы какой-нибудь контент, он был бы заменен новой информацией. Если бы надо было добавить только подготовленную текстовую информацию, то можно было бы использовать метод InsertAfter для всего содержимого документа, но у нас во втором документе находится несколько более комплексная информация.
Для справки.
Более подробную информацию по данному объекту можно найти в MSDN и справке по VBA.
Объект Word Application — методы
В этой статье мы рассмотрим методы объекта Word Application, методов довольно много. В большинстве случаев данные методы представляют только теоретический интерес, так как не дают возможности создавать сам документ Word.
В статье я не буду приводить примеров кода, так как по сути, нечего показывать, вы и сами с легкостью сможете написть небольшой скрипт на языке VBScript или JScript, или просто добавить макрос в редактор VBA, и просмотреть, как работают Word Application методы.
Объект Word Application — Методы
Activate () — Активизирует указанный объект.
BuildKeyCode (Arg1, Arg2, Arg3, Arg4) — Возвращает уникальный номер для указанной комбинации клавиш. Обязательнм является только первый параметр (Arg1). Все параметры содержат значение константы WdKey.
KeyString (KeyCode, KeyCode2) — Возвращает строку комбинаций клавиш для указанных ключей, которые содержат значения константы WdKey (например, Ctrl + Shift + A). Обязательным является только первый параметр.
ChangeFileOpenDirectory (Path) — Устанавливает каталог, к которому Word будет обращаться при работе с документами. По умолчанию таким каталогом является “Мои документы”.
CheckGrammar (Str) — Проверяет строку на предмет грамматических ошибок. Вернет True, если строка не содержит ошибок. Word Application методы.
CheckSpelling (Str) — Проверяет строку на предмет орфографических ошибок. Вернет True, если строка не содержит ошибок.
CleanString (Str) — Удаляет непечатаемые символы (коды символов 1 — 29) и специальные символы из заданной строки или заменяет их пробелами (символ кода 32). Возвращает результат в виде обработанной строки.
GoBack () — Перемещение курсора назад по последним трем позициям, в которых происходило редактирование (аналогично нажатию Shift + F5), Word Application методы
GoForward () — Перемещение курсора вперед по последним трем позициям, в которых происходило редактирование.
Help (HelpType) – Метод Word Application отображает установленную информацию справки.
HelpType – Определяет параметры показа, содержит значение константы WdHelpType:
- WdHelp — 0 — Отображает диалоговое окно справки.
- wdHelpAbout — 1 — Отображает диалоговое окно «О программе Microsoft Word».
- wdHelpActiveWindow — 2 — Отображение справку, описывающую команду, связанную с активным просмотром или панелью.
- wdHelpContents — 3 — Отображает диалоговое окно справки.
- wdHelpExamplesAndDemos — 4 — Отображает «Примеры и демонстрации».
- wdHelpIndex — 5 — Отображает диалоговое окно справки.
- wdHelpKeyboard — 6 — Отображает справку по сочитаниям клавиш.
- wdHelpPSSHelp — 7 — Отображает информацию о поддержке продукта.
- wdHelpQuickPreview — 8 — Отображает быстрый просмотр.
- wdHelpSearch — 9 — Отображает диалоговое окно справки.
- wdHelpUsingHelp — 10 — Отображение список разделов справки, которые описывают, как использовать Справку.
- wdHelpIchitaro — 11 — Открывает файл справки для пользователей Ichitaro.
- wdHelpPE2 — 12 — Показывает справку по IBM Personal Editor 2.
- wdHelpHWP — 13 — Открывает файл справки для пользователей AreA хангыль.
ListCommands (ListAllCommands) — Создает новый документ, а затем вставляет в него таблицу, содержащую сочетания клавиш и описания методов.
ListAllCommands – Параметр содержит логическое значение, true – все команды, false – только основные команды.
Move (Left, Top) – Позиция окна задач или активного документа. Параметры определяют горизонтальную и вертикальную позицию. Word Application методы
NewWindow () — Открывает новое окно для текущего документа. Возвращает объект Window.
ShowClipboard () — Отображает Буфер обмена.
SubstituteFont (UnavailableFont, SubstituteFont) — Устанавливает варианты отображения шрифта.
UnavailableFont — Название шрифта, недоступного на вашем компьютере, который вы хотите сопоставить с другим шрифтом для отображения и печати.
SubstituteFont — Название шрифта, доступного на вашем компьютере, который вы хотите заменить недоступным шрифтом.
Quit (SaveChanges, OriginalFormat, RouteDocument) — выход Microsoft Word и, возможно, сохраняет или маршруты открытые документы.
SaveChanges — Определяет, сохранять ли сделанные изменения в документе. Значение константы WdSaveOptions:
- wdDoNotSaveChanges — 0 — Не сохранять сделанные изменения.
- wdPromptToSaveChanges — 2 — Запросить у пользователя, чтобы сохранить внесенные изменения.
- wdSaveChanges — 1 — Сохранить сделанные изменения автоматически без запроса пользователя.
OriginalFormat – Определяет параметры сохранения. Значения константы WdOriginalFormat:
- wdOriginalDocumentFormat — 1 — Оригинальный формат документа.
- wdPromptUser — 2 – Пользователю будет предложено выбрать формат документа.
- wdWordDocument — 0 – Формат документа Microsoft Word.
RouteDocument — True, чтобы направить документ на следующего получателя. Если документ не имеет маршрутизации, то аргумент игнорируется, Word Application методы.
ResetIgnoreAll () – снимает метку со всех фрагментов текста, которые помечены как «без проверки» в процессе проверки орфографии.
Resize (Width, Height) — Размеры окна приложения Word или указанного окна задач. Параметры определяют ширину и высоту окна.
Run (MacroName, varg1, … , varg30) – запуск указанного макроса Visual Basic. Обязательный только первый параметр.
MacroName — Имя макроса.
varg1 . varg30 – До 30 параметров, передаваемых макросу.
ScreenRefresh () – Метод включает обновление экрана в течении одной команды
KeyBoard (code) – Переключение раскладки клавиатуры, в качестве параметра (code) передается целое значение (например, 1033 – для русского языка, 1049 – для английского языка). Если вызвать метод без параметров, то будет возвращено текущее значение раскладки клавиатуры. Word Application метод.
OnTime (When, Name, Tolerance) – Устанавливает таймер для запуска макроса в указанное время.
When — Время, в которое нужно запустить макрос. Можно прописать строкой (“15:30”) или использовать функции работы со временем.
Name — Имя макроса.
Tolerance – Дополнительный параметр. Задает максимальное время в секундах, которое может пройти, прежде чем мкрос, который не успел запуститься будет отменен.
Следующие Word Application методы отвечают за преобразование измерительных величин.
CentimetersToPoints (Centimeters) — Преобразует сантиметры в пункты (1 см = 28,35 пункта).
InchesToPoints (Inches) — Преобразует дюймы в пункты (1 дюйм = 72 пункта).
LinesToPoints (Lines) — Преобразует линии в пункты (1 линия = 12 пунктов).
MillimetersToPoints (Millimeters) — Преобразует миллиметры в пункты (1 мм = 2,85 пункта).
PicasToPoints (Picas) — Преобразует пики в пункты (1 пик = 12 пунктов).
PixelsToPoints (Pixels, fVertical) — Преобразует пиксели в пункты.
fVertical – Дополнительный параметр, True – по вертикали, False – по горизонтали.
PointsToCentimeters (Points) — Преобразует пункты в сантиметры.
PointsToInches (Points) — Преобразует пункты в дюймы.
PointsToLines (Points) — Преобразует пункты в линии.
PointsToMillimeters (Points) — Преобразует пункты в миллиметры.
PointsToPicas (Points) — Преобразует пункты в пики.
PointsToPixels (Points, fVertical) — Преобразует пункты в пиксели.
События для Word Application — VBA
Объект Word Application предоставляет в распоряжение довольно много событий, но… изначально к ним нет доступа в редакторе VBA. Второй проблемой является то, что события Word Application VBA нельзя использовать в сценариях Windows Script Host, ну я такой лазейки не нашел.
Что бы появилась возможность работать с событиями данного класса в редакторе VBA, надо выполнить следующие действия:
- Создаем новый модуль класса, для этого в меню Insert выберите пункт Class Module.
- В окне редактора для созданного модуля пишем код:
Все, теперь в редакторе кода в окне объектов появится объект App, который и предоставляет возможность работать с событиями Word Application в VBA.
Знаю, знаю, статья получилась довольно сухая – практически нет примеров Но ничего, в следующей статье мы быстренько пробежимся по некоторым свойствам, а потом еще попытаемся осилить коллекцию Documents и класс Document, без которых просто невозможно двигаться дальше.
Спасибо за внимание. Автор блога Владимир Баталий
Работа с Word — Создание, открытие, форматирование, закрытие и сохранение
Использование Word в приложениях на Visual Basic 6 открывает широчайшие возможности для создания профессионально оформленных документов (например отчетов). Это часто необходимо при работе в фирме или на предприятии для обеспечения документооборота. Основным преимуществом использования Wordа в этом случае является то, что практически на всех компьютерах, используемых в фирмах и на предприятиях установлены Windows и пакет Microsoft Office. Поэтому подготовленные документы Word не требуют каких-либо дополнительных усилий для их просмотра, печати и редактирования. Единственное что нужно помнить, это то что работа через автоматизацию OLE (связывание и внедрение объектов) на деле оказывается довольно медленной технологией, хотя и очень полезной.
Чтобы использовать объекты Word в Visual Basic , необходимо инсталлировать сам Word. После этого вы получаете в своё распоряжение библиотеку Microsoft Word Object Library, которую нужно подключить к текущему проекту через диалоговое окно «Разработать»>>»Ссылки» (References) и указать Microsoft Word 9.0 Object Library (для Word 2000).
Два самых важных объекта Word это Word.Application и Word.Document. Они обеспечивают доступ к экземпляру приложения и документам Word.
Поэтому в раздел Generals «Общее» формы введите следующий код для объявления объектных переменных приложения Word и документа Word.
Чтобы создать новый экземпляр Word, введите такой код кнопки;
Для форматирования печатной области документа используйте данный код:
(вообще-то Word использует для всех размеров своих элементов пункты, поэтому для использования других единиц измерения, необходимо использовать встроенные функции форматирования.)
- CentimetersToPoints(Х.ХХ) — переводит сантиметры в пункты.
- MillimetersToPoints(X.XX) — переводит миллиметры в пункты
Для того чтобы в своём приложении не писать постоянно одно и тоже имя объекта, можно использовать оператор With.
Например код находящейся выше можно переписать так:
Если вам необходимо создать документ Word с нестандартным размером листа, то используйте данный код:
Данный код меняет ориентацию страницы (практически меняет местами значения ширины и высоты листа):
- wdOrientLandscape — альбомная ориентация ( число 1)
- wdOrientPortrait — книжная ориентация ( число 0)
Для сохранения документа под новым именем и в определенное место используйте данный код код:
После такого сохранения вы можете про ходу работы с документом сохранять его.
Или проверить, были ли сохранены внесенные изменения свойством Saved и если изменения не были сохранены — сохранить их;
Завершив работу с документом, вы можете закрыть сам документ методом Close и сам Word методом Quit.
Если в методах Close и Quit не использовать необязательный параметр True то Word запросит согласие пользователя (если документ не был перед этим сохранён) на закрытие документа.
Если вам необходимо оставить Word открытым, просто не используйте методы Close и Quit.
Если вам необходимо поставить пароль на документ, то используйте код: