[Python] [Word] [python-docx] Versuchen Sie, mit python-docx eine Vorlage für einen Wortsatz in Python zu erstellen

Ich habe mich gefragt, wie die Diff-Informationen visualisiert wurden. Ich möchte endlich die farbigen Differenzinformationen im PDF-Format in eine vernünftige Form bringen.

Als ich es auf verschiedene Arten nachgeschlagen habe, habe ich mich gefragt, ob python-docx verwendet und ausgewertet werden kann, und ich habe einige Ergebnisse erhalten. Hier ist ein Memorandum. Ich werde es in zusammenfassen. Ich habe auch über MarkDown nachgedacht, aber die Disposition eines schlechten Ingenieurs, dass das detaillierte Layout und Erscheinungsbild mit der Word-GUI korrigiert werden kann, wenn es sich um eine Methode zum Generieren von Doxx handelt, hat mich dazu veranlasst, diese Methode zu wählen (bitteres Lächeln). Wenn Word erstellt werden kann, kann PDF erstellt werden.

Ich hoffe, es ist hilfreich für diejenigen, die eine Word-Vorlage basierend auf den Ergebnissen verschiedener Analysen mit Python erstellen möchten.

Nachtrag

Welche Art von Dokumenten zu machen

Dieses Mal haben wir die folgenden Funktionen bestätigt.

Betriebsumgebung usw.

Ursprünglich wäre es reibungslos, wenn es mit Python of Windows durchgeführt würde, aber dieses Mal haben wir aufgrund verschiedener Umstände den Vorgang in der folgenden Umgebung bestätigt. Nein, wie bei diff wollte ich die Daten verarbeiten, die auf cygwin durcheinander gebracht wurden, also wurde es diese Umgebung.

Überprüfen Sie bei Verwendung von Cygwin den Zeichencode aller Python-Dateien im UTF-8-Format und die Zeilenumbrüche nur im Format \ n.

Bei ** MS-DOS-Eingabeaufforderung ** lautet der Zeilenumbruch \ r \ n und der Zeichencode SJIS. Auch in diesem Kapitel

# -*- coding: utf-8 -*-

Eine bestimmte Beschreibung

# -*- coding: shift-jis -*-

Wenn ja, sollte es cool sein.

Installieren Sie python-docx

Python ist bereits enthalten.

Die Installation wird hier beschrieben [https://python-docx.readthedocs.io/en/latest/user/install.html#install]. Die Bedingungen sind wie folgt.

Normalerweise können Sie dies mit pip install python-docx tun. Die MS-DOS-Eingabeaufforderungsversion verlief auch in meiner Umgebung reibungslos.

Vorsichtsmaßnahmen für Cygwin

Obwohl dies die oben genannte Bedingung ist, müssen zunächst die folgenden Bibliotheken in Cygwin installiert werden. Wenn diese nicht enthalten sind, wird eine Fehlermeldung angezeigt, da kein Header vorhanden ist. Geben Sie sie daher ein. ** Kann nicht als Standard enthalten sein. ** **.

Wenn Sie Python in Windows und Cygwin wie ich haben, müssen Sie außerdem vorsichtig sein. Wenn Sie eine Pip-Installation durchführen, wird dies in Windows abhängig von der Pfadeinstellung usw. geschehen. Also habe ich es mit der folgenden Methode installiert.

Klicken Sie hier, um Cygwin einzurichten (http://qiita.com/GDaigo/items/a80003684fc6ab7505fd#%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83] % 83% E3% 83% 97) kann ebenfalls hilfreich sein

easy_install-2.7 python-docx

Verwendung von Python-Docx

Unten finden Sie eine Beschreibung der Hauptfamilie.

https://python-docx.readthedocs.io/en/latest/index.html

Das Tutorial sollte leicht verständlich sein. Es ist jedoch ziemlich schwierig zu finden, was Sie tun möchten. In meinem Fall hatte ich große Probleme mit dem Charaktermodifikationssystem, aber die Beziehung wurde unten zusammengefasst.

http://python-docx.readthedocs.io/en/latest/user/text.html

Es ist mühsam, die Spezifikationen der Bibliothek im Detail zu erklären, deshalb habe ich versucht, sie im folgenden Code auszudrücken.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#
# SimpleDocService
#  python-Wir bieten einen einfachen Service in Bezug auf dox.
#Nun, es ist der Code, um die docx-Bibliothek zu verstehen.
#

from docx import Document
from docx.shared import RGBColor
from docx.shared import Inches
from docx.shared import Pt

class SimpleDocxService:

    def __init__(self):
        self.document = Document()
        self.latest_run = None

    def set_normal_font(self, name, size):
        #Schriftarteinstellungen
        font = self.document.styles['Normal'].font
        font.name = name
        font.size = Pt(size)

    def add_head(self, text, lv):
        #Überschrifteneinstellungen
        self.document.add_heading(text, level=lv)

    def open_text(self):
        #Beginnen Sie mit dem Hinzufügen von Text
        self.paragraph = self.document.add_paragraph()

    def close_text(self):
        #Textaddition abgeschlossen
        return #Derzeit keine Bearbeitung

    def get_unicode_text(self, text, src_code):
        # python-In Unicode konvertieren, damit es von docx verarbeitet werden kann
        return unicode(text, src_code)

    def adjust_return_code(self, text):
        #Wenn Sie die Daten der Textdatei unverändert hinzufügen, tritt ein Zeilenumbruch auf
        #Entfernen Sie es, da es ein Ärger sein wird
        text = text.replace("\n", "")
        text = text.replace("\r", "")
        return text

    def add_text(self, text):
        #Text hinzufügen
        self.latest_run = self.paragraph.add_run(text)

    def add_text_italic(self, text):
        #Text hinzufügen (kursiv)
        self.paragraph.add_run(text).italic = True

    def add_text_bold(self, text):
        #Text hinzufügen (hervorheben)
        self.paragraph.add_run(text).bold = True

    def add_text_color(self, text, r, g, b):
        #Färben Sie die Buchstaben
        self.paragraph.add_run(text).font.color.rgb = RGBColor(r, g, b)

    def add_picture(self, filename, inch):
        #Abbildung einfügen
        self.document.add_picture(filename, width=Inches(inch))

    def save(self, name):
        #Ausgabe als docx-Datei.
        self.document.save(name)

SimpleDocxService ist eine Klasse, die APIs verschiedener Funktionen sammelt, die dieses Mal ausgewertet werden. Es bietet die folgenden Funktionen.

API Bewegung
set_normal_font(name, size) Legen Sie die Standardtextschrift fest. Name ist der Name und Größe zu Größe
add_head(text, lv) Überschriften erstellen. Text ist der Überschriftenname. lv ist eben(0=Titel, 1=Überschrift 1,...)
open_text() Textbereich öffnen (*)
close_text() Textbereich schließen (*)
get_unicode_text(text, src_code) src_Erzeugt und gibt eine Unicode-Zeichenfolge aus dem durch den Code angegebenen Zeichencode zurück
adjust_return_code(text) Erzeugt Text und gibt ihn zurück, wobei die Zeilenumbrüche gelöscht werden
add_text(text) Schreiben Sie Textdaten in ein Word-Dokument
add_text_italic(text) Schreiben Sie Textdaten in ein Word-Dokument und machen Sie die Schrift kursiv
add_text_bold(text) Schreiben Sie Textdaten in ein Word-Dokument in Fettdruck
add_text_color(text, r, g, b) Text Schreiben Sie Daten in ein Word-Dokument. Geben Sie die Farbe mit rgb an. Beispiel: r=255, g=0, b=Rot bei 0
add_picture(filename, inch) Fügen Sie die durch den Dateinamen angegebenen Bilddaten ein. Zoll ist die horizontale Zollgröße
save(name) Speichern Sie als Word-Datei mit dem durch den Namen angegebenen Dateinamen

Einige Ergänzungen.

Dies hängt mit dem Verhalten von Python-Docx zusammen, daher werde ich es mit Code ergänzen. Der Code, der den Text tatsächlich schreibt, lautet wie folgt. Dies ist der Code aus Honke.

p = document.add_paragraph('A plain paragraph having some ')
p.add_run('bold').bold = True
p.add_run(' and some ')
p.add_run('italic.').italic = True

Sie können auch sehen, wie es in [Home] angezeigt wird (https://python-docx.readthedocs.io/en/latest/index.html). Auf diese Weise können Sie den Absatz abrufen und Text hinzufügen. Es scheint, dass die Textänderung auch zum Zeitpunkt dieses add_run durchgeführt werden kann. Möglicherweise betrifft dies auch die Struktur der dox-Datei.

Open_text wird also verwendet, um einen neuen Absatz aufzunehmen. Für python-docx ist es nicht erforderlich, aber die Idee ist, close_text zu verwenden, um die Reihe von Beschreibungen zu vervollständigen. aus diesem Grund, Der Text, der die SimpleDoxService-Klasse verwendet, wird wie folgt beschrieben.

docx  = SimpleDoxService()
docx.open_text()
docx.add_text("This is a my best book.\n")
docx.add_text("Do you know this?")
docx.close_text()

Der Grund, warum ich das tue, ist die Betrachtung der Beziehung zur Figur. Wenn Sie ein Bild einfügen möchten, verwenden Sie add_picture, wie Sie im obigen Code sehen können. Angenommen, Sie schreiben zu diesem Zeitpunkt Folgendes (Code, der Python-Docx direkt verwendet, ohne die SimpleDocxService-Klasse zu verwenden).

p = document.add_paragraph('A plain paragraph having some ')
p.add_run("text1\n")
document.add_picture("sample.png ", width=Inches(1.25))
p.add_run("text2\n")

In diesem Fall ist es in gewissem Sinne natürlich,

text1
<<sample.PNG-Diagramm>>
text2

nicht

text1
text2
<<sample.PNG-Diagramm>>

Es wird. Also wollte ich das im App-Code klarstellen, also habe ich das Konzept von Öffnen und Schließen eingeführt. Dies wird später im Code der Beispiel-App gezeigt, daher hoffe ich, dass Sie auch darauf verweisen können.

Im Fall von Python ist der Zeichencode ziemlich mühsam. Es ist wichtig zu beachten, welchen Zeichencode die Bibliothek verarbeitet. Im Fall von Python-Docx scheint es, dass es von Unicode verarbeitet wird. Im Fall von Japanisch ist es daher erforderlich, es in Unicode zu konvertieren. Es gibt hier verschiedene Konvertierungsmethoden, aber es scheint notwendig zu sein, diese Funktionsmethode get_unicode_text zu verwenden, um sie unicode zu machen (es scheint, dass es nicht SJIS ist, weil es Word ist ...).

Dies ist der Code, den ich durch Ausschneiden und Ausprobieren eingegeben habe. Entschuldigung. Es scheint, dass unnötige Zeilenumbrüche eingefügt werden, wenn Sie den Text so wie er ist mit Zeilenumbrüchen verwenden. Ich habe diese Funktion "adjust_return_code" verwendet, um dies zu verhindern.

Im nächsten Abschnitt erstellen wir tatsächlich eine Word-Datei mit dem Code dieser SimpleDocxService-Klasse.

Ich werde es tatsächlich schaffen.

Erstellen Sie dieses Mal eine WORD-Datei mit der folgenden Konfiguration als Beispiel.

  1. Titel
  2. Fügen Sie ein Bild ein
  3. Überschrift 1 (1.)
  4. Textdatei-Zeichenfolge
  5. Fügen Sie ein weiteres Bild ein
  6. Python-qualifizierter String
  7. Überschrift 1 (2.)
  8. In Python angegebene Zeichenfolge

Material

Unten finden Sie das in der Probe verwendete Material. Ich bin wieder ein professioneller Student. ..

Zunächst ist das Bild unter dem Titel eine Datei namens ** report_top.png **, die so aussieht. report_top.png

Als nächstes lautet die Textdatei ** sample.txt **, was so aussieht. Nun, es ist ein Auszug aus Mein Blog ...

Ich denke, dass die grundlegende Rolle eines Managers darin besteht, mehrere Personen zu bewegen und Ergebnisse zu erzielen.
Daher ist es schwierig, die emotionalen und mentalen Probleme der Menschen zu ignorieren. Ich denke, das ist ein bisschen anders als die andere Partei zu akzeptieren. Nachdem ich ein solches Problem bis zu einem gewissen Grad in Betracht gezogen hatte, wagte ich es, es zu ignorieren.

Ein anderes Bild ist eine Datei namens ** sample_pic.png **, die so aussieht. sample_pic.png

Das unten angegebene Beispiel wurde damit erstellt. Natürlich müssen Bild und Text nicht so sein. Beachten Sie jedoch, dass der Text in Japanisch SJIS und in Windows \ r \ n für Zeilenumbrüche lautet.

Übrigens wird das Material eines professionellen Studenten aus dem Folgenden erhalten, und die Größe und die Zeicheneinfügung werden verarbeitet. http://pronama.azurewebsites.net/pronama/

Beispielcode

Unten finden Sie Beispielcode, der die SimpleDocxService-Klasse zum Generieren von Wörtern verwendet.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
from docx_simple_service import SimpleDocxService

if __name__ == "__main__":

    docx = SimpleDocxService()

    #Schriftarteinstellungen
    docx.set_normal_font("Courier New", 9)

    #Titelanzeige
    docx.add_head(u"Überschrift", 0)

    #Abbildung einfügen
    docx.add_picture("report_top.png ", 3.0)

    #Anzeige des Phrasentitels
    docx.add_head(u"Erstes Thema", 1)

    # shift-Fügen Sie die jis-Textdatei in den doxx-Text ein
    f = open("sample.txt")
    text = f.read()
    f.close()
    docx.open_text()
    docx.add_text("\n")
    text = docx.get_unicode_text(text, 'shift-jis')
    text = docx.adjust_return_code(text)
    docx.add_text(text)
    docx.close_text()

    #Abbildung einfügen
    docx.add_picture("sample_pic.png ", 5.0)

    #Generieren Sie Text in Code und fügen Sie ihn in dox ein.
    #Ein Beispiel für eine Änderung ist auch hier.
    docx.open_text()
    docx.add_text("\nThis is a my best book.")
    docx.add_text("\nThis is ")
    docx.add_text_bold("a my best")
    docx.add_text(" book.")
    docx.add_text("\nThis is ")
    docx.add_text_italic("a my best")
    docx.add_text(" book.")
    docx.add_text_color("\nThis is a my best book.", 0xff, 0x00, 0x00)
    docx.close_text()

    #Nächster Satz
    docx.add_head(u"Zweites Thema", 1)

    #Generieren Sie Text in Code und fügen Sie ihn in dox ein.
    docx.open_text()
    docx.add_text(u"\n Ja, das ist es.")
    docx.close_text()

    #Es ist eine Rettung.
    docx.save("test.docx")

    print "complete."

Ausführungsergebnis

Sie werden einen solchen Dox haben. python_docx_sample.jpg

Ich denke, es hat die oben beschriebene Struktur.

Für Python-Docx ist der Code selbst nicht so schwierig, wenn Sie erst einmal wissen, wie man ihn schreibt. Sie können dies verstehen, indem Sie den obigen Beispielcode mit dem Code der SimpleDocxService-Klasse vergleichen. Wenn es also innerhalb dieses Bereichs liegt, können Sie meiner Meinung nach verschiedene Dinge tun, indem Sie den hier veröffentlichten Code ändern.

Lizenz

Ich habe es unten benutzt. Vielen Dank für die Bereitstellung der wunderbaren Software.

das ist alles.

Recommended Posts

[Python] [Word] [python-docx] Versuchen Sie, mit python-docx eine Vorlage für einen Wortsatz in Python zu erstellen
Versuchen Sie, die Thread-Liste der Nachrichten (Abneigung) mit Python zu erhalten.
So erstellen Sie eine Instanz einer bestimmten Klasse aus dict mit __new__ () in Python
Erstellen Sie eine GIF-Datei mit Pillow in Python
Berechnen wir das statistische Problem mit Python
Ich möchte mit Python ein Fenster erstellen
So erstellen Sie eine JSON-Datei in Python
Erstellen Sie eine MIDI-Datei in Python mit pretty_midi
Erstellen Sie mit Selenium einen Datenerfassungsbot in Python
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
[Python] [Word] [python-docx] Einfache Analyse von Diff-Daten mit Python
Erstellen Sie ein Plug-In, das Python Doctest auf Vim ausführt (2)
Erstellen Sie ein Plug-In, um Python Doctest mit Vim (1) auszuführen.
So führen Sie einen Befehl mit einem Unterprozess in Python aus
Erstellen Sie eine Funktion in Python
Erstellen Sie ein Wörterbuch in Python
So entwickeln Sie in einer virtuellen Python-Umgebung [Memo]
So geben Sie char * in einer Rückruffunktion mit ctypes in Python zurück
Versuchen Sie, ein neuronales Netzwerk in Python aufzubauen, ohne eine Bibliothek zu verwenden
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Versuchen Sie, eine in Python geschriebene Funktion mit Fn Project auszuführen
Versuchen Sie einfach, einen Webhook mit ngrok und Python zu erhalten
Erstellen Sie mit tkinter eine Python-GUI
Versuchen Sie es mit LevelDB mit Python (plyvel)
Erstellen Sie eine Binärdatei in Python
Versuchen Sie, Trace in Python zu berechnen
5 Möglichkeiten zum Erstellen eines Python-Chatbots
Erstellen Sie eine zufällige Zeichenfolge in Python
Versuchen Sie es mit LeapMotion mit Python
So bestimmen Sie die Existenz eines Selenelements in Python
Ich habe versucht, mit Python einen regulären Ausdruck für "Betrag" zu erstellen
So überprüfen Sie die Speichergröße einer Variablen in Python
Versuchen Sie, eine Python-Umgebung mit Visual Studio Code & WSL zu erstellen
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
Ich habe versucht, mit Python einen regulären Ausdruck von "Datum" zu erstellen
So überprüfen Sie die Speichergröße eines Wörterbuchs in Python
Implementieren Sie einen deterministischen endlichen Automaten in Python, um Vielfache von 3 zu bestimmen
Versuchen Sie, sich mit Python auf Ihrem PC automatisch bei Netflix anzumelden
Wie erstelle ich eine große Menge an Testdaten in MySQL? ??
Verschiedene Möglichkeiten, um in Python ein Array von Zahlen von 1 bis 10 zu erstellen.
Erstellen Sie eine Funktion, um den Inhalt der Datenbank in Go abzurufen
Erstellen Sie ein Befehlszeilenprogramm, um mit Python Dollar in Yen umzurechnen
Versuchen Sie, sich mit Python bei qiita anzumelden
Versuchen Sie es mit der Wunderlist-API in Python
Übung, dies in Python zu verwenden (schlecht)
Versuchen Sie, die Kraken-API mit Python zu verwenden
Machen wir einen Jupyter-Kernel
Zeigen Sie eine Liste der Alphabete in Python 3 an
Versuchen Sie, ein SYN-Paket in Python zu senden
Versuchen Sie, eine einfache Animation in Python zu zeichnen
Erstellen Sie eine einfache GUI-App in Python
[Python] Erstellen Sie eine Stapelumgebung mit AWS-CDK
Melden Sie sich mit Anforderungen in Python bei Slack an
Wie bekomme ich Stacktrace in Python?
Versuchen Sie, Excel mit Python (Xlwings) zu betreiben.
Scraping von Websites mit JavaScript in Python