Word.Application

Czegóż nie zrobi się dla ukochanej osoby. Jakiś czas temu przerabiałem zarządzanie dokumentami Excela z poziomu PowerShella, natomiast dziś zaprezentuję jak pomocne może się okazać to narzędzie podczas pisania prac w Wordzie. Wiele osób może powiedzieć od czego są przecież makra, niemniej jednak z racji mojego kaprysu nie przepadam za ich wykorzystywaniem.

Zanim jednak przejdę do meritum przedstawię przypadek z jakim przyszło mi się dziś zmierzyć. Polegał on na tym, aby znaleźć sposób na stworzenie zagregowanej listy indeksów dla poszczególnego autora przy wykorzystaniu listy dostępnych artykułów.

Aby bardziej zobrazować problem:

  1. Autor1
    Opis artykułu
  2. Autor2
    Opis kolejnego artykułu
  3. Autor1
    etc…

Natomiast wynik końcowy powinien wyglądać następująco

Autor1 1, 3
Autor2 2, etc…

Zanim jednak rozpoczniemy pracę nad grupowaniem danych, konieczne jest wydobycie ich z pliku docx. Do tego celu posłużymy się analogicznie jak w przypadku Excela, klasą Microsoft COM (Component Object Model) Word.Application.

Zaczynamy więc od zdefiniowania podstawowych zmiennych z używanych z dalszej części skryptu, mianowicie wskazanie pliku docx oraz wskazanie wykorzystywanego stylu.

$docFile = "p:\bibliografia.docx"
$styleName = "1_Autor"

Następnie możemy przystąpić do utworzenia instancji klasy Word.Application wraz z załadowaniem do niego naszego pliku docx.

$objWord = New-Object -ComObject Word.Application
$objWord.Visible = $true
$objDoc = $objWord.documents.open($docFile)

Z racji, iż poszczególne pozycje autorów są w poszczególnych akapitach (paragrafach), możemy wykorzystać właściwość Paragraphs naszego obietku.

$Paragraphs = $objDoc.Paragraphs

A następnie przeszukać ją pod kątem naszego stylu, aby wyłuskać interesujące nas dane. Do tego celu stworzymy sobie tablicę wielowymiarową zawierającą dwa pola Autor oraz interesujące nas Indeksy. Dodatkowo dla sprawdzenia poprawności danych pozwólmy by zostały one wyświetlane na ekranie w momencie sczytywania z pliku Doc.

$authorsList = @()
ForEach ($Paragraph in $Paragraphs)
{
 if($Paragraph.Style.NameLocal -eq $styleName)
 {
  $row = "" | Select-Object Autor, Indeksy
  $row.Autor = $Paragraph.Range.Text.Trim()
  $row.Indeksy = [String] $Paragraph.Range.ListFormat.ListValue
  $authorsList += $row
  $row
 }
}

Główne dane na temat interesujących nas informacji są już wyciągnięte z pliku Worda dlatego możemy już zamknąć tą instancję.

$objWord.Quit()

Posiadając tablicę ze wszystkimi potrzebnymi danymi możemy przystąpić do agregacji danych. Do tego celu wykorzystamy polecenie Group-Object:

$authorsList | Group-Object Autor

Dane zostały poprawnie zagregowane niemniej jak widzimy na załączonym zrzucie forma w jakiej zostały przedstawione nie jest zbyt zadowalająca. Do tego celu Wykorzystamy polecenie Select-Object wraz z wyrażeniem [string]::join() w celu zgrupowania indeksów danego autora w jednej linii. Ostatecznie również sortując dane po autorze by uporządkować dane.

$authorsList | Group-Object Autor | Select-Object Name, @{Expression={[string]::join(", ",($_.group | Select-Object -ExpandProperty Indeksy))};Name="Indeksy"} | Sort-Object Name

Źródła:
http://msdn.microsoft.com/en-us/library/kw65a0we(v=vs.80).aspx

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s