Blog IT, Blog Marketing

Generowanie plików Worda w Pythonie

Generowanie plików Worda w Pythonie

Marcin Sarna , 30.03.2021 r.

Zautomatyzujmy powtarzalne zadania, na które nie powinniśmy niepotrzebnie tracić czasu.

Python-docx

Wszyscy mamy czasem poczucie, że spędziliśmy zbyt dużą część dnia na wykonywaniu wielu powtarzalnych i żmudnych czynności. Na przykład zajmując się data science masz potrzebę generowania okresowych raportów, co zapewne robisz ręcznie a co mogłoby być wykonywanie automatycznie. Nie wątpimy, że Twój czas jest znacznie cenniejszy niż zajmowanie się nieznośnym zadaniem polegającym na wypełnianiu tabel, pisaniu nagłówków, podtytułów i liczb. Wszystko byłoby lepsze od otwierania Worda po raz kolejny, mógłbyś na przykład podrasować z nami swój kod.

Na szczęście jest pakiet, który może zaradzić naszym kłopotom. Jeśli jeszcze nie przejrzałeś dokumentacji python-docx, zdecydowanie radzimy Ci to zrobić. Jest to chyba jeden z najbardziej intuicyjnych i łatwych do zrozumienia interfejsów API, z którymi można pracować. Pozwala zautomatyzować generowanie dokumentów poprzez wstawianie tekstu, wypełnianie tabel i renderowanie obrazów do raportu na żądanie. Bez zbędnych ceregieli - przejdźmy dalej i wygenerujmy własny automatyczny raport!

Generujemy templatkę

Zanim będziesz mógł kontynuować, musisz najpierw utworzyć swój własny dokument szablonu, który jest w zasadzie zwykłym dokumentem Microsoft Word (.docx). Szablon będzie stworzony dokładnie tak, jak chcesz, aby wyglądał Twój automatyczny raport. Musimy tu więc określić wszystkie szczegóły, takie jak kroje pisma, rozmiary czcionek, formatowanie i struktura strony. Jedyne, co musisz zrobić, to utworzyć symbole zastępcze w miejscach gdzie mają się pojawiać automatycznie wstawiane zawartości i zadeklarować je z unikalnymi zmiennymi. Na przykład:

{{title}}
{{day}} / {{month}} / {{year}}
{%tr for item in table_contents %}

Jak zapewne od razu się domyślasz, każdą zautomatyzowaną treść można zadeklarować w zestawie podwójnych nawiasów klamrowych {{nazwa_zmiennej}}. Obejmuje to tak tekst jak i obrazy. W przypadku tabel jest to trochę bardziej skomplikowane. Musisz utworzyć tabelę z wierszem szablonu zawierającym wszystkie kolumny, a następnie musisz dołączyć jeden wiersz powyżej i jeden poniżej z następującą notacją:

Pierwszy wiersz: {%tr for item in variable_name %}
Ostatni wiersz: {%tr endfor %}

Po zakończeniu zapisz dokument w swoim katalogu jako plik .docx i kontynuuj pisanie kodu, aby wywołać szablon i wygenerować zautomatyzowany dokument.

Instalujemy python-docx

Po utworzeniu szablonu uruchom Anacondę lub dowolne wybrane środowisko Python IDE i zainstaluj następujące pakiety:

pip install docx
pip install docxtpl

Zaimportuj następujące pakiety:

from docx.shared import Cm
from docxtpl import DocxTemplate, InlineImage
from docx.shared import Cm, Inches, Mm, Emu
import random
import datetime
import matplotlib.pyplot as plt

Sprawdź oferty pracy na TeamQuest

Działamy na szablonie

Zaimportuj utworzony szablon i utwórz instancję zmiennych:

#Import template document
template = DocxTemplate('automated_report_template.docx')

#Generate list of random values
table_contents = []
x = []
y = []

for i in range(0,12):
number = round(random.random(),3)

table_contents.append({
'Index': i,
'Value': number
})

x.append(i)
y.append(number)

#Plot random values and save figure
fig = plt.figure()
plt.plot(x, y)
fig.savefig('image.png', dpi=fig.dpi)

#Import saved figure
image = InlineImage(template,'image.png',Cm(10))

Na koniec zadeklaruj swoje zmienne w słowniku i użyj go do renderowania zautomatyzowanego dokumentu tekstowego:

#Declare template variables
context = {
'title': 'Automated Report',
'day': datetime.datetime.now().strftime('%d'),
'month': datetime.datetime.now().strftime('%b'),
'year': datetime.datetime.now().strftime('%Y'),
'table_contents': table_contents,
'image': image
}

#Render automated report
template.render(context)
template.save('generated_report.docx')

Właśnie otrzymałeś pierwszy automatycznie wygenerowany raport. Możesz oczywiście wygenerować dowolną liczbę wierszy i kolumn w tabeli, a także renderować dowolną liczbę stron w dokumencie.

Najnowsze oferty pracy:

Polecane wpisy na blogu IT:

Szukasz pracownika IT?

Dostarczymy Ci najlepszych specjalistów z branży IT. Wyślij zapytanie

Wyrażam zgodę TeamQuest Sp. z o.o. na przetwarzanie moich danych osobowych w celu marketingu produktów i usług własnych TeamQuest, w tym na kontaktowanie się ze mną w formie połączenia telefonicznego lub środkami elektronicznymi.
Administratorem podanych przez Ciebie danych osobowych jest TeamQuest Sp. z o.o., z siedzibą w Warszawie (00-814), ul. Miedziana 3a/21, zwana dalej „Administratorem".
Jeśli masz jakiekolwiek pytania odnośnie przetwarzania przez nas Twoich danych, skontaktuj się z naszym Inspektorem Ochrony Danych (IOD). Do Twojej dyspozycji jest pod adresem e-mail: office@teamquest.pl.
W jakim celu i na jakiej podstawie będziemy wykorzystywać Twoje dane? Dowiedz się więcej