Powershell - praca z dokumentami ms word



Powershell jako dość uniwersalny jezyk skryptowy pozwala na pracę z różnymi bibliotekami i aplikacjami. Jeżeli brakuje Wam dokumentacji do jakiegoś zagadnienia, które jest w C# lub Visual Basic, to nic straconego. Powershell nie odbiega daleko od tych języków, kwestia tylko składni, którą moglibyśmy dane zagadnienie ogarnąć. W tym artykule chciałbym przybliżyć zagadnienie dotyczące pracy z dokumentami ms word. Pracująć w biurze i wypełniająć z dnia na dzień te same dokumenty doszedłem do momentu gdzie miałem już tego dosyć. Postanowiłem wprowadzić w życię drobną automatyzację tego procesu. Niestety, okazało się, że jeżeli zaczynamy zgłębiać ten temat, prędzej czy później zaczyna brakować wiedzy w internecie. Mam także kilka książek do powershella w domu, ale tu także brak konkretnych informacji, jak dany problem rozwiązać. Zapraszam do lektury.


Otwieranie i zamykanie dokumentu

Od czegoś należy zacząć. Przy tworzeniu dokumentu word przy pomocy skryptu powershell dobrze jest móc projektować nasz docelowy dokument lub szablon dokumentu. W tym celu polecam wam pisanie skryptu w jakimś edytorze z możliwością uruchomienia kodu, np. Windows Powershell ISE lub pisanie bezpośrednio w konsoli, sprawdzanie jak dokument się zachowa i przeklejanie tekstu do edytora.
Poniższym poleceniem tworzymy nowy obiekt typu COM w powershell'u. Bardziej ludzkim językiem można napisać, że dajemy powershell'owi dostęp do pracy na dokumentach word. Taki klocek do zabawy. Aby pracować z word'em należy miec zainstalowanego w systemie word'a.

$word = New-Object -ComObject word.application

Kolejne polecenie jakie będzie dla nas dosyć istotne przy tworzeniu naszego dokumentu to:

$word.Visible = $true

Jest to właściwość, która pozwala na widoczność tego co robimy. Gdy skrypt mamy zakończony to warto zmienić to ustawienie na $false. Przyspieszy to znacząco działanie skryptu i wyłaczy możliwość edycji dokumentu podczas jego tworzenia.

Aby otworzyć nowy pusty dokument należy wpisać w programie:

$doc = $word.documents.add()

Zamknięcie dokumentu natomiast wygląda w ten sposób:

$doc.SaveAs($outputPath)
$doc.Close()
$word.Quit()

gdzie kolejno idąc od góry mamy zapis z ścieżką i nazwą pliku do zapisu, zamknięcie dokumentu i wyjście z aplikacji ms word.


Dodawanie tekstu

Aby pracować na dokumencie trzeba poinformować skrypt, że to właśnie na danym dokumencie będziemy pracować. Robimy to wpisująć:

$selection = $word.Selection

Właściwość Selection wybiera obszar do edycji. W tym przypadku jest to nasz dokument word. Na cały dokument możemy mieć tylko jeden obszar do edycji i tylko jeden aktywny na całą aplikacje word. Jest to istotne, gdy tworzymy kilka dokumentów w jednym czasie.
Dzięki powyższej właściwości mozna także wpisywać tekst do dokumentu. Wygląda to mniej więcej tak:

$selection.TypeText("Ala ma kota.")

Nasz tekst jest jakąś częścią paragrafu, aby zakończyć daną część tekstu zamieszczamy w naszym skrypcie linijkę:

$selection.TypeParagraph()

Po uruchomieniu powyższych dwóch poleceń powinniśmy na ekranie zobaczyć tekst Ala ma kota.


Formatowanie tekstu

Formatowanie tekstu może się odbywać przy użyciu już wbudowanych w word'a styli lub przez własne formatowanie tekstu. Można także użyć styli, a następnie zmienić niektóre właściwości tekstu. Style które mamy do dyspozycji będą się pokrywać z tymi, które widzimy z poziomu aplikacji word. Dlatego możemy albo w powershellu wylistować wszystkie style, albo odwołać się do nazwy, którą widzimy w menu style w edytorze graficznym. Sprawdzenie dostępnych stylów z poziomu powershell'a możemy wykonać dopiero po utworzeniu nowego obiektu COM i wpisując komende:

[Enum]::GetNames([Microsoft.Office.Interop.Word.WdBuiltinStyle]) | ForEach {[pscustomobject]@{Style=$_}}

Powinniśmy dostać podobny wynik do tego na obrazie:

Aktywujemy wybrany przez nas styl wpisując np:

$selection.Style = $word.ActiveDocument.Styles[[Microsoft.Office.Interop.Word.WdBuiltinStyle]::wdStyleHeading1]

Lub wpisując nazwę stylu widoczną w dokumencie word w graficznym interfejsie(wersja polska):

$selection.Style = "Nagłówek 1"

i wersja angielska:

$selection.Style = "Heading1"

Wersja językowa jest tu największą bolączką, gdyż ze względu na różne nazwy styli musimy zastosować adekwatne odwołanie. Co za tym idzie, pisząc skrypt należałoby uwzględnić sprawdzenie wersji językowej office'a, na której będziemy pracować.
Z dodatkowych rzeczy, które warto znać, to rozmiar czcionki. Używamy komendy z wartością będącą rozmiarem czcionki:

$selection.Font.Size = <podany_przez_nas_rozmiar>

Pogrubienie tekstu w wartości 0 lub 1

$selection.font.Bold = <podany_przez_nas_numer>

Analogicznie używamy pochylenia i podkreślenia używając parametru Italic i Underline w obiekcie Font.
Jako, że jest tu dużo użytecznych właściwości, to poniżej zamieszczam listę wszystkich właściwości w obiekcie Font:
- AllCaps
- Application
- Bold
- BoldBi
- Borders
- ColorIndex
- ColorIndexBi
- ContextualAlternates
- Creator
- DiacriticColor
- DisableCharacterSpaceGrid
- DoubleStrikeThrough
- Duplicate
- Emboss
- EmphasisMark
- Engrave
- Fill
- Glow
- Hidden
- Italic
- ItalicBi
- Kerning
- Ligatures
- Line
- Name
- NameAscii
- NameBi
- NameFarEast
- NameOther
- NumberForm
- NumberSpacing
- Outline
- Parent
- Position
- Reflection
- Scaling
- Shading
- Shadow
- Size
- SizeBi
- SmallCaps
- Spacing
- StrikeThrough
- StylisticSet
- Subscript
- Superscript
- TextColor
- TextShadow
- ThreeD
- Underline
- UnderlineColor

Jak widać, jest tego trochę. Niektóre właściwości mają na tyle logiczne nazwy, że można domyśleć się działania. Dlatego nie opisuję tych właściwości tutaj. Te właściwości, które mają mniej logiczne nazewnictwo zostawię Wam do rozgryzienia.

Kolejną często używaną rzeczą jest wyrównanie tekstu do lewej, do środka lub do prawej. Dana funkcjonalność zdefiniowana jest w obiekcie ParagraphFormat. Metoda Alignment przyjmuje wartości:
0 - wyrównanie do lewej,
1 - do środka,
2 - do prawej.

$selection.ParagraphFormat.Alignment = <podany_przez_nas_numer>

W obiekcie ParagraphFormat jest oczywiście dużo więcej właściwości, ale większość z nich odnosi się do specyficznych i rzadko używanych funkcji.


Nagłówek i stopka

Na koniec chciałbym Wam pokazać jak umieszczać nagłówek i stopkę w dokumencie. Obydwa elementy są bardzo podobne w użyciu. W pierwszej kolejności należy odwołać się do sekcji dokumentu. W tej sytuacji traktujemy nasz dokument jako jedną dużą sekcję

$section = $doc.sections.item(1)

Następnie wykonujemy odwołanie do nagłówka lub stopki:

$header = $section.Headers(1)
$footer = $section.Footers(1)

Jedynka w nawiasie w uproszczeniu odnosi się do wszystkich stron dokumentu.
Dodanie tekstu:

$header.Range.Text = "TEKST"
$footer.Range.Text = "TEKST"

Jeżeli zamiest tekstu w stopce chcielibyśmy dodać numery stron to możemy użyć polecenia:

$footer.PageNumbers.Add(1)

Tutaj numer w nawiasie informuje nas o pozycji numeru strony - wyrównanie do lewej, do środka i do prawej.
Zmiana formatowania tekstu w nagłówku i stopce odbywa się poprzez odwołanie do obiektu Range.Font, właściwości są podobne do tych używanych w formatowaniu zwykłego tekstu. Poniżej przykłady już z nadanymi wartościami.

$footer.Range.Font.Size = 15
$footer.Range.ParagraphFormat.Alignment = 0

Jeżeli tematyka tego artykułu Cię zainteresowała, to daj znać w komentarzu pod filmem lub napisz do mnie maila. Może znajdzie się temat na kolejny artykuł w tej tematyce.