[Python] [Word] [python-docx] Essayez de créer un modèle de phrase de mot en Python en utilisant python-docx

Je me demandais comment les informations de diff étaient visualisées. Je veux enfin rendre les informations de différence de couleur sous une forme raisonnable en pdf.

Quand je l'ai recherché de différentes manières, j'ai pensé que python-docx pouvait être utilisé et évalué, et j'ai obtenu quelques résultats, voici donc un mémorandum. Je vais le résumer dans. J'ai aussi pensé à MarkDown, mais la disposition d'un mauvais ingénieur à ce que la mise en page détaillée et l'apparence puissent être corrigées avec l'interface graphique de Word s'il s'agit d'une méthode de génération de doxx m'a fait choisir cette méthode (sourire amer). Si Word peut être créé, un PDF peut être créé.

J'espère que cela sera utile pour ceux qui souhaitent créer un modèle Word basé sur les résultats de diverses analyses avec Python.

Postscript

Quel genre de documentation créer

Cette fois, nous avons confirmé les fonctions suivantes.

Environnement d'exploitation, etc.

À l'origine, ce serait fluide si cela était fait avec Python sur Windows, mais cette fois, en raison de diverses circonstances, nous avons confirmé l'opération dans l'environnement suivant. Non, comme avec diff, je voulais traiter les données qui étaient gâchées sur cygwin, c'est donc devenu cet environnement.

Lorsque vous utilisez Cygwin, vérifiez le code de caractère de tous les fichiers python au format UTF-8 et les sauts de ligne au format \ n uniquement.

En outre, pour ** l'invite MS-DOS **, le saut de ligne est \ r \ n et le code de caractère est SJIS. Également dans ce chapitre

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

Une certaine description

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

Si c'est le cas, ça devrait être cool.

Installez python-docx

Python est déjà inclus.

L'installation est décrite ici [https://python-docx.readthedocs.io/en/latest/user/install.html#install). Les conditions sont les suivantes.

Habituellement, vous pouvez le faire avec pip install python-docx, peut-être. La version de l'invite MS-DOS s'est également déroulée sans problème dans mon environnement.

Précautions sur Cygwin

Tout d'abord, bien que ce soit la condition ci-dessus, les bibliothèques suivantes doivent être installées dans Cygwin. Si ceux-ci ne sont pas inclus, vous obtiendrez une erreur comme s'il n'y a pas d'en-tête, alors entrez-les. ** Peut ne pas être inclus en standard. ** **

De plus, si vous avez python dans Windows et Cygwin comme moi, vous devez faire attention, et si vous installez, ce sera dans Windows en fonction du paramètre de chemin, etc. Donc, je l'ai installé par la méthode suivante.

Cliquez ici pour configurer Cygwin (http://qiita.com/GDaigo/items/a80003684fc6ab7505fd#%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83] % 83% E3% 83% 97) peut également être utile

easy_install-2.7 python-docx

Comment utiliser python-docx

Voici une description de la famille principale.

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

Le tutoriel doit être facile à comprendre. Cependant, il est assez difficile de trouver ce que vous voulez faire. Dans mon cas, j'ai eu beaucoup de problèmes avec le système de modification de personnage, mais la relation a été résumée ci-dessous.

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

Il est difficile d'expliquer les spécifications de la bibliothèque en détail, j'ai donc essayé de l'exprimer dans le code ci-dessous.

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

#
# SimpleDocService
#  python-Nous fournissons un service simple lié à la dox.
#Eh bien, c'est le code pour comprendre la bibliothèque docx.
#

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):
        #Paramètres de police
        font = self.document.styles['Normal'].font
        font.name = name
        font.size = Pt(size)

    def add_head(self, text, lv):
        #Paramètres de cap
        self.document.add_heading(text, level=lv)

    def open_text(self):
        #Commencer à ajouter du texte
        self.paragraph = self.document.add_paragraph()

    def close_text(self):
        #Ajout de texte terminé
        return #Actuellement aucun traitement

    def get_unicode_text(self, text, src_code):
        # python-Convertir en Unicode pour qu'il puisse être géré par docx
        return unicode(text, src_code)

    def adjust_return_code(self, text):
        #Si vous ajoutez les données du fichier texte telles quelles, un saut de ligne se produira
        #Retirez-le car ce sera un problème
        text = text.replace("\n", "")
        text = text.replace("\r", "")
        return text

    def add_text(self, text):
        #Ajouter du texte
        self.latest_run = self.paragraph.add_run(text)

    def add_text_italic(self, text):
        #Ajouter du texte (en italique)
        self.paragraph.add_run(text).italic = True

    def add_text_bold(self, text):
        #Ajouter du texte (souligner)
        self.paragraph.add_run(text).bold = True

    def add_text_color(self, text, r, g, b):
        #Colorez les lettres
        self.paragraph.add_run(text).font.color.rgb = RGBColor(r, g, b)

    def add_picture(self, filename, inch):
        #Insérer une figure
        self.document.add_picture(filename, width=Inches(inch))

    def save(self, name):
        #Sortie sous forme de fichier docx.
        self.document.save(name)

SimpleDocxService est une classe qui rassemble les API de diverses fonctions évaluées cette fois. Il fournit les fonctions suivantes.

API mouvement
set_normal_font(name, size) Définissez la police de texte standard. nom est le nom et la taille à la taille
add_head(text, lv) Création de titres. text est le nom du titre. lv est de niveau(0=Titre, 1=Titre 1,...)
open_text() Zone de texte ouverte (*)
close_text() Fermer la zone de texte (*)
get_unicode_text(text, src_code) src_Génère et renvoie une chaîne de caractères Unicode à partir du code de caractère spécifié par code
adjust_return_code(text) Génère et renvoie du texte avec les sauts de ligne effacés
add_text(text) écrire des données texte dans un document Word
add_text_italic(text) Écrire des données de texte dans un document Word, mettre la police en italique
add_text_bold(text) Écrire des données textuelles dans un document Word, police en gras
add_text_color(text, r, g, b) texte Ecrit des données dans un document Word. Spécifiez la couleur avec rgb. Exemple: r=255, g=0, b=Rouge à 0
add_picture(filename, inch) Insérez les données d'image spécifiées par nom de fichier. pouce est la taille horizontale en pouces
save(name) Enregistrer en tant que fichier Word avec le nom de fichier spécifié par nom

Certains suppléments.

Ceci est lié au comportement de python-docx, je vais donc le compléter avec du code. Le code qui écrit réellement le texte est le suivant. C'est le code extrait de 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

Vous pouvez également voir comment il sera affiché dans Accueil. De cette façon, vous pouvez obtenir le paragraphe et y ajouter du texte. Il semble que la modification de texte puisse également être effectuée lors de cet add_run. Cela implique peut-être aussi la structure du fichier dox.

Ainsi, open_text est utilisé pour prendre un nouveau paragraphe. Ce n'est pas nécessaire pour python-docx, mais l'idée est d'utiliser close_text pour compléter la série de descriptions. pour cette raison, Le texte utilisant la classe SimpleDoxService est décrit comme suit.

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()

La raison pour laquelle je fais cela tient compte de la relation avec la figure. Si vous souhaitez inclure une image, utilisez add_picture comme vous pouvez le voir dans le code ci-dessus. À ce stade, supposons que vous écriviez ce qui suit (code qui utilise directement python-docx sans utiliser la classe SimpleDocxService).

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")

Dans ce cas, c'est naturel dans un sens,

text1
<<sample.diagramme png>>
text2

ne pas

text1
text2
<<sample.diagramme png>>

Il devient. Donc, je voulais clarifier cela dans le code de l'application, alors j'ai mis le concept d'ouverture et de fermeture. Cela sera indiqué plus tard dans le code de l'exemple d'application, j'espère donc que vous pourrez également y faire référence.

Dans le cas de Python, le code des caractères est plutôt gênant. Il est important de noter le code de caractère géré par la bibliothèque. Dans le cas de python-docx, il semble qu'il soit traité par unicode, donc dans le cas du japonais, il est nécessaire de le convertir en unicode. Il existe différentes méthodes de conversion ici, mais il semble qu'il soit nécessaire d'utiliser cette méthode de fonction get_unicode_text pour la rendre unicode (il semble que ce n'est pas SJIS car c'est Word ...).

C'est le code que j'ai mis en coupant et essayant. Il semble que si vous utilisez le texte avec des sauts de ligne tel quel, des sauts de ligne inutiles seront insérés. La façon dont je l'ai fait a été d'utiliser cette fonction Adjust_return_code pour l'empêcher.

Dans la section suivante, nous allons créer un fichier Word en utilisant le code de cette classe SimpleDocxService.

Je vais vraiment y arriver.

Cette fois, créez un fichier WORD avec la configuration suivante comme exemple.

  1. Titre
  2. Insérez une image
  3. Titre 1 (1er)
  4. Chaîne de fichier texte
  5. Insérez une autre image
  6. Chaîne qualifiée Python
  7. Titre 1 (2e)
  8. Chaîne spécifiée en Python

Matériel

Vous trouverez ci-dessous le matériau utilisé dans l'échantillon. Je suis à nouveau un étudiant professionnel. ..

Tout d'abord, l'image sous le titre est un fichier appelé ** report_top.png **, qui ressemble à ceci. report_top.png

Ensuite, le fichier texte est ** sample.txt **, qui ressemble à ceci. Eh bien, c'est un extrait de Mon blog ...

Je pense que le rôle fondamental d'un manager est de déplacer plusieurs personnes et d'obtenir des résultats.
Par conséquent, il est difficile d'ignorer les problèmes émotionnels et mentaux des gens. Je pense que c'est un peu différent d'accepter l'autre partie. Après avoir examiné un tel problème dans une certaine mesure, j'ai osé l'ignorer.

Une autre image est un fichier appelé ** sample_pic.png **, qui ressemble à ceci. sample_pic.png

L'échantillon publié ci-dessous a été créé à l'aide de cela. Bien sûr, l'image et le texte ne doivent pas nécessairement l'être. Cependant, veuillez noter que le texte est supposé être SJIS pour le japonais et \ r \ n pour Windows.

À propos, le matériel d'étudiant professionnel est obtenu à partir de ce qui suit, et la taille et l'insertion de caractères sont traitées. http://pronama.azurewebsites.net/pronama/

Exemple de code

Vous trouverez ci-dessous un exemple de code qui utilise la classe SimpleDocxService pour générer des mots.

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

import sys
from docx_simple_service import SimpleDocxService

if __name__ == "__main__":

    docx = SimpleDocxService()

    #Paramètres de police
    docx.set_normal_font("Courier New", 9)

    #Affichage du titre
    docx.add_head(u"Titre principal", 0)

    #Insérer une illustration
    docx.add_picture("report_top.png ", 3.0)

    #Affichage du titre de la phrase
    docx.add_head(u"Premier sujet", 1)

    # shift-Mettez le fichier texte jis dans le texte doxx
    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()

    #Insérer une illustration
    docx.add_picture("sample_pic.png ", 5.0)

    #Générez du texte dans le code et mettez-le dans dox.
    #Un exemple de modification est également ici.
    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()

    #Phrase suivante
    docx.add_head(u"Deuxième sujet", 1)

    #Générez du texte dans le code et mettez-le dans dox.
    docx.open_text()
    docx.add_text(u"\n Oui, c'est ça.")
    docx.close_text()

    #C'est une sauvegarde.
    docx.save("test.docx")

    print "complete."

Résultat d'exécution

Vous aurez un dox comme celui-ci. python_docx_sample.jpg

Je pense qu'il a la structure décrite ci-dessus.

Pour python-docx, le code lui-même n'est pas si difficile une fois que vous savez comment l'écrire. Vous pouvez le comprendre en comparant l'exemple de code ci-dessus avec le code de la classe SimpleDocxService. Donc, si c'est dans cette plage, je pense que vous pouvez faire diverses choses en changeant le code affiché ici.

Licence

Je l'ai utilisé ci-dessous. Merci d'avoir fourni le merveilleux logiciel.

c'est tout.

Recommended Posts

[Python] [Word] [python-docx] Essayez de créer un modèle de phrase de mot en Python en utilisant python-docx
Essayez d'obtenir la liste des fils du bulletin d'information (je n'aime pas) avec Python.
Comment créer une instance d'une classe particulière à partir de dict en utilisant __new__ () en python
Créer un fichier GIF en utilisant Pillow en Python
Calculons en fait le problème statistique avec Python
Je veux créer une fenêtre avec Python
Comment créer un fichier JSON en Python
Créez un fichier MIDI en Python en utilisant pretty_midi
Créer un bot de collecte de données en Python à l'aide de Selenium
Essayez de créer un module Python en langage C
[Python] [Word] [python-docx] Analyse simple des données de diff en utilisant python
Créer un plugin pour exécuter Python Doctest sur Vim (2)
Créez un plug-in pour exécuter Python Doctest avec Vim (1)
Comment exécuter une commande à l'aide d'un sous-processus en Python
Créer une fonction en Python
Créer un dictionnaire en Python
Comment développer dans un environnement virtuel Python [Memo]
Pour renvoyer char * dans une fonction de rappel à l'aide de ctypes en Python
Essayez de créer un réseau de neurones en Python sans utiliser de bibliothèque
J'ai fait un chronomètre en utilisant tkinter avec python
Essayez d'exécuter une fonction écrite en Python à l'aide de Fn Project
Essayez simplement de recevoir un webhook avec ngrok et Python
Créer une interface graphique python à l'aide de tkinter
Essayez d'utiliser LevelDB avec Python (plyvel)
Créer un fichier binaire en Python
Essayez de calculer Trace en Python
5 façons de créer un chatbot Python
Créer une chaîne aléatoire en Python
Essayez d'utiliser LeapMotion avec Python
Comment déterminer l'existence d'un élément sélénium en Python
J'ai essayé de créer une expression régulière de "montant" en utilisant Python
Comment vérifier la taille de la mémoire d'une variable en Python
Essayez de créer un environnement python avec Visual Studio Code et WSL
J'ai essayé de créer une liste de nombres premiers avec python
J'ai essayé de créer une expression régulière de "date" en utilisant Python
Comment vérifier la taille de la mémoire d'un dictionnaire en Python
Implémenter un automate fini déterministe en Python pour déterminer des multiples de 3
Essayez de vous connecter automatiquement à Netflix en utilisant python sur votre PC
Comment créer une grande quantité de données de test dans MySQL? ??
Différentes façons de créer un tableau de nombres de 1 à 10 en Python.
Créez une fonction pour obtenir le contenu de la base de données dans Go
Créez un outil de ligne de commande pour convertir des dollars en yens en utilisant Python
Essayez de vous connecter à qiita avec Python
Essayez d'utiliser l'API Wunderlist en Python
Pratique d'utilisation de ceci en Python (mauvais)
Essayez d'utiliser l'API Kraken avec Python
Faisons un noyau jupyter
Afficher une liste d'alphabets en Python 3
Essayez d'envoyer un paquet SYN en Python
Essayez de dessiner une animation simple en Python
Créer une application GUI simple en Python
[Python] Créer un environnement Batch à l'aide d'AWS-CDK
Connectez-vous à Slack à l'aide de requêtes en Python
Comment obtenir stacktrace en python
Essayez d'utiliser Excel en utilisant Python (Xlwings)
Scraping de sites Web à l'aide de JavaScript en Python