Powershell - praca z dokumentami ms word
<p dir="auto">Powershell jako dość uniwersalny język 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ąc z dnia na dzień te same dokumenty doszedłem do momentu gdzie miałem już tego dosyć. Postanowiłem wprowadzić w życie 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 powershell'a w domu, ale tu także brak konkretnych informacji, jak dany problem rozwiązać. Zapraszam do lektury.
<h2>Otwieranie i zamykanie dokumentu
<p dir="auto">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 wklejanie tekstu do edytora.<br />
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 mieć zainstalowanego w systemie word'a.
<p dir="auto"><code>$word = New-Object -ComObject word.application
<p dir="auto">Kolejne polecenie jakie będzie dla nas dosyć istotne przy tworzeniu naszego dokumentu to:
<p dir="auto"><code>$word.Visible = $true
<p dir="auto">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łączy możliwość edycji dokumentu podczas jego tworzenia.
<p dir="auto">Aby otworzyć nowy pusty dokument, należy wpisać w programie:
<p dir="auto"><code>$doc = $word.documents.add()
<p dir="auto">Zamknięcie dokumentu natomiast wygląda w ten sposób:
<p dir="auto"><code>$doc.SaveAs($outputPath)<br />
<code>$doc.Close()<br />
<code>$word.Quit()
<p dir="auto">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.
<h2>Dodawanie tekstu
<p dir="auto">Aby pracować na dokumencie, trzeba poinformować skrypt, że to właśnie na danym dokumencie będziemy pracować. Robimy to wpisując:
<p dir="auto"><code>$selection = $word.Selection
<p dir="auto">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.<br />
Dzięki powyższej właściwości mozna także wpisywać tekst do dokumentu. Wygląda to mniej więcej tak:
<p dir="auto"><code>$selection.TypeText("Ala ma kota.")
<p dir="auto">Nasz tekst jest jakąś częścią paragrafu. Aby zakończyć daną część tekstu zamieszczamy w naszym skrypcie linijkę:
<p dir="auto"><code>$selection.TypeParagraph()
<p dir="auto">Po uruchomieniu powyższych dwóch poleceń powinniśmy na ekranie zobaczyć tekst Ala ma kota.
<p dir="auto"><span><img src="https://images.hive.blog/768x0/https://it-ek.pl/img/programming/powershell/powershell_word_1.jpg" srcset="https://images.hive.blog/768x0/https://it-ek.pl/img/programming/powershell/powershell_word_1.jpg 1x, https://images.hive.blog/1536x0/https://it-ek.pl/img/programming/powershell/powershell_word_1.jpg 2x" />
<h2>Formatowanie tekstu
<p dir="auto">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 powershell'u 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 komendę:
<p dir="auto"><code>[Enum]::GetNames([Microsoft.Office.Interop.Word.WdBuiltinStyle]) | ForEach {[pscustomobject]@{Style=$_}}
<p dir="auto">Powinniśmy dostać podobny wynik do tego na obrazie:
<p dir="auto"><span><img src="https://images.hive.blog/768x0/https://it-ek.pl/img/programming/powershell/powershell_word_2.jpg" srcset="https://images.hive.blog/768x0/https://it-ek.pl/img/programming/powershell/powershell_word_2.jpg 1x, https://images.hive.blog/1536x0/https://it-ek.pl/img/programming/powershell/powershell_word_2.jpg 2x" />
<p dir="auto">Aktywujemy wybrany przez nas styl, wpisując np:
<p dir="auto"><code>$selection.Style = $word.ActiveDocument.Styles[[Microsoft.Office.Interop.Word.WdBuiltinStyle]::wdStyleHeading1]
<p dir="auto">Lub wpisując nazwę stylu widoczną w dokumencie word w graficznym interfejsie(wersja polska):
<p dir="auto"><code>$selection.Style = "Nagłówek 1"
<p dir="auto">i wersja angielska:
<p dir="auto"><code>$selection.Style = "Heading1"
<p dir="auto">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ć.<br />
Z dodatkowych rzeczy, które warto znać, to rozmiar czcionki. Używamy komendy z wartością będącą rozmiarem czcionki:
<p dir="auto"><code>$selection.Font.Size = <podany_przez_nas_rozmiar>
<p dir="auto">Pogrubienie tekstu w wartości 0 lub 1
<p dir="auto"><code>$selection.font.Bold = <podany_przez_nas_numer>
<p dir="auto">Analogicznie używamy pochylenia i podkreślenia stosując parametr Italic i Underline w obiekcie Font.<br />
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:
<ul>
<li>AllCaps
<li>Application
<li>Bold
<li>BoldBi
<li>Borders
<li>ColorIndex
<li>ColorIndexBi
<li>ContextualAlternates
<li>Creator
<li>DiacriticColor
<li>DisableCharacterSpaceGrid
<li>DoubleStrikeThrough
<li>Duplicate
<li>Emboss
<li>EmphasisMark
<li>Engrave
<li>Fill
<li>Glow
<li>Hidden
<li>Italic
<li>ItalicBi
<li>Kerning
<li>Ligatures
<li>Line
<li>Name
<li>NameAscii
<li>NameBi
<li>NameFarEast
<li>NameOther
<li>NumberForm
<li>NumberSpacing
<li>Outline
<li>Parent
<li>Position
<li>Reflection
<li>Scaling
<li>Shading
<li>Shadow
<li>Size
<li>SizeBi
<li>SmallCaps
<li>Spacing
<li>StrikeThrough
<li>StylisticSet
<li>Subscript
<li>Superscript
<li>TextColor
<li>TextShadow
<li>ThreeD
<li>Underline
<li>UnderlineColor
<p dir="auto">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.
<p dir="auto">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:<br />
0 - wyrównanie do lewej,<br />
1 - do środka,<br />
2 - do prawej.
<p dir="auto"><code>$selection.ParagraphFormat.Alignment = <podany_przez_nas_numer>
<p dir="auto">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.
<h2>Nagłówek i stopka
<p dir="auto">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ę
<p dir="auto"><code>$section = $doc.sections.item(1)
<p dir="auto">Następnie wykonujemy odwołanie do nagłówka lub stopki:
<p dir="auto"><code>$header = $section.Headers(1)
<p dir="auto"><code>$footer = $section.Footers(1)
<p dir="auto">Jedynka w nawiasie w uproszczeniu odnosi się do wszystkich stron dokumentu.<br />
Dodanie tekstu:
<p dir="auto"><code>$header.Range.Text = "TEKST"
<p dir="auto"><code>$footer.Range.Text = "TEKST"
<p dir="auto">Jeżeli zamiast tekstu w stopce chcielibyśmy dodać numery stron to możemy użyć polecenia:
<p dir="auto"><code>$footer.PageNumbers.Add(1)
<p dir="auto">Tutaj numer w nawiasie informuje nas o pozycji numeru strony - wyrównanie do lewej, do środka i do prawej.<br />
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.
<p dir="auto"><code>$footer.Range.Font.Size = 15<br />
<code>$footer.Range.ParagraphFormat.Alignment = 0
<p dir="auto">Jeżeli tematyka tego artykułu Cię zainteresowała, to daj znać w komentarzu pod filmem na DTube lub YouTube lub napisz do mnie wiadomość. Może znajdzie się temat na kolejny artykuł w tej tematyce.
<hr />
<p dir="auto"><center><a href="https://d.tube/#!/v/klapenhz/ktt1hibb" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link"><img src="https://images.hive.blog/768x0/https://ipfs.io/ipfs/QmZjDEywWHzUVb8cXrn3PmPXHC4jNBsB5oAusdDbnzyeT2" srcset="https://images.hive.blog/768x0/https://ipfs.io/ipfs/QmZjDEywWHzUVb8cXrn3PmPXHC4jNBsB5oAusdDbnzyeT2 1x, https://images.hive.blog/1536x0/https://ipfs.io/ipfs/QmZjDEywWHzUVb8cXrn3PmPXHC4jNBsB5oAusdDbnzyeT2 2x" /><hr /><p>
<p dir="auto">Praca z dokumentami MS Word z poziomu powershell'a, tworzenie i edycja dokumentów, użycie styli, odwołania do kontenera Microsoft.Office.Interop.Word, zapisanie dokumentu.<br />
Szczegóły pracy, polecenia i opis znajdziesz na<br /><br />
Jest to mój oryginalny artykuł.<span>
<a href="https://it-ek.pl/programming/powershell/powershell_with_word.html" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">https://it-ek.pl/programming/powershell/powershell_with_word.html
<hr />
<p dir="auto">Zachęcam do subskrypcji oraz pisania w komentarzach tematów jakie byście chcieli poruszyć w przyszłych filmach.<br />
Zapraszam także na moją stronę<br /><br />
oraz na fb:<br /><br />
a także na patronite:<br /><span>
<a href="https://it-ek.pl" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">https://it-ek.pl<span>
<a href="https://www.facebook.com/it.ek.przyszlosc.it?ref=aymt_homepage_panel" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">https://www.facebook.com/it.ek.przyszlosc.it?ref=aymt_homepage_panel<span>
<a href="https://patronite.pl/it-ek" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">https://patronite.pl/it-ek
<hr />
<p dir="auto">Subscribe and write in comments what else would you like to see on my channel.<br />
Visit my website:<br /><br />
and my page on fb:<br /><br />
and also on patronite:<br /><span>
<a href="https://it-ek.pl" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">https://it-ek.pl<span>
<a href="https://www.facebook.com/it.ek.przyszlosc.it?ref=aymt_homepage_panel" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">https://www.facebook.com/it.ek.przyszlosc.it?ref=aymt_homepage_panel<span>
<a href="https://patronite.pl/it-ek" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">https://patronite.pl/it-ek
<hr /><a href="https://d.tube/#!/v/klapenhz/ktt1hibb" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link"> ▶️ DTube<br /><a href="https://ipfs.io/ipfs/QmRsqQ82TtfoqN5Td68ysxetHEkDgg2EgLH8RzTxrYR8uK" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link"> ▶️ IPFS
nice
Congratulations @klapenhz! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :
<table><tr><td><span><img src="https://images.hive.blog/768x0/https://steemitimages.com/60x70/http://steemitboard.com/@klapenhz/voted.png?201901302312" srcset="https://images.hive.blog/768x0/https://steemitimages.com/60x70/http://steemitboard.com/@klapenhz/voted.png?201901302312 1x, https://images.hive.blog/1536x0/https://steemitimages.com/60x70/http://steemitboard.com/@klapenhz/voted.png?201901302312 2x" /><td>You received more than 50 upvotes. Your next target is to reach 100 upvotes. <p dir="auto"><sub><em><a href="https://steemitboard.com/@klapenhz" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Click here to view your Board<br /> <sub><em>If you no longer want to receive notifications, reply to this comment with the word <code>STOP <blockquote> <p dir="auto">Support <a href="https://steemit.com/@steemitboard" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">SteemitBoard's project! <strong><a href="https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Vote for its witness and <strong>get one more award!