[Python] [Excel] Exploiter des feuilles Excel à partir de Python en utilisant openpyxl (en utilisant une feuille de test comme exemple)

Je pense qu'il existe divers tests logiciels, mais d'après mon expérience, la méthode d'extraction des journaux du terminal (tels que série pour réseau ou intégré) et de les examiner pour faire un jugement était courante. Ainsi, les résultats des tests sont comme Excel. C'est comme un Excel sûr ...

Il semble que tout langage de script est bon pour analyser et juger les journaux. Après cela, je vais remplir le résultat, mais quand je me demande ce qui est arrivé à cela, il existe une bibliothèque appelée openpyxl en Python, et je peux l'utiliser avec cela. De plus, dans mon cas, il n'est pas nécessaire de tout générer avec openpyxl. Je pense que je vais faire le format et la conception avec l'interface graphique, et demander à un scripteur d'écrire les données nécessaires.

Cette fois, j'ai légèrement recherché comment faire une telle chose et ai fait un échantillon, donc je vais l'exposer, y compris le sens du mémorandum. J'espère que cela sera utile à ceux qui essaient d'utiliser Excel.

Environnement etc.

J'utiliserai Excel, j'ai donc utilisé Windows cette fois. J'ai confirmé l'opération dans l'environnement suivant.

Fonctionnement de base d'Openpyxl

Pour le fonctionnement de base, il peut être très utile de simplement regarder la formule suivante. https://openpyxl.readthedocs.io/en/default/

En outre, l'article suivant de Qiita a été très utile. Merci beaucoup. http://qiita.com/tftf/items/07e4332293c2c59799d1

En guise d'évaluation grossière, j'ai pu le faire fonctionner sans aucune gêne, du moment qu'il s'agissait de sélectionner une feuille, d'acquérir des informations sur Row et Colomn, et d'écrire une chaîne de caractères au contraire.

L'installation peut être effectuée avec le standard pip install openpyxl tant que vous faites une chaîne de caractères comme celle-ci. Si vous souhaitez également gérer les fichiers image, la méthode d'installation semble changer, je pense donc que vous devriez vous référer à l'URL officielle publiée ci-dessus.

De plus, lorsqu'il s'agit de chaînes de caractères, il peut être préférable d'utiliser correctement u "chaîne de caractères" et "char" du côté utilisateur (je pense que cela peut différer en fonction de la situation, etc., mais cette fois, nous allons procéder sur cette base J'ai).

Exemple-je l'ai essayé avec cet Excel

Cette fois, j'ai essayé d'utiliser une telle feuille comme exemple. excel1.JPG

Sur cette base, je souhaite analyser le journal, juger le résultat du test et saisir le résultat. Le point est __ "Ajoutez le résultat à l'endroit approprié dans ColumnG" __. J'exposerai l'exemple de code plus tard, mais lorsque j'exécuterai l'exemple de code,

excel2.JPG

(Bien qu'il y ait un tsukkomi que le système normal de fermeture échoue ou est caché, w)

Bien sûr, si vous spécifiez directement Row et Column, cela se terminera par deux lignes, mais le code est (seulement) un peu plus ingénieux.

J'ai fait une classe d'opération Excel (test_excel)

Cette fois, j'ai essayé de coder l'idée de décider quel résultat inclure dans "API et contenu de test". Pour ce faire, j'ai écrit un code appelé la classe test_excel qui fournit l'API suivante. C'est moins que.

#!/usr/bin/env python
# -*- coding: shift-jis -*-

#API d'exploitation liée à Excel

import sys
import openpyxl as px

#
#Veuillez modifier ces paramètres de manière appropriée en fonction du matériau.
#

#COLONNE Combien lécher en léchant
EXCEL_END_OF_COLUMN   = "Z"

#À quelle distance regardez-vous du haut lorsque vous recherchez TITLE?
EXCEL_END_OF_ROW_TITLE = 20

#À quelle distance regardez-vous du haut lorsque vous recherchez des articles?
EXCEL_END_OF_ROW_ITEM = 30

class TestExcel:

    #Spécifiez le nom du fichier Excel lors de la génération de la classe.
    def __init__(self, filename):
        self.filename = filename
        self.workbook = px.load_workbook(filename)
        self.sheet = None

    def err_print(self, text):
        print "\r\nERROR!:", text, "\r\n"

    # select_Sélectionnez la feuille de nom comme cible de traitement.
    def select_sheet(self, select_name):
        sheetnames = self.workbook.get_sheet_names()
        for name in sheetnames:
            sheet_name = name
            if select_name == sheet_name:
                self.sheet = self.workbook[name]
                print "%s selected." % select_name
                return True
        self.err_print("%s not found." % select_name)
        return False

    #Colonne avec le nom spécifié par nom(A,B,...)Retour.
    def get_column(self, name):
        row_list =  [int(i) for i in range(1, EXCEL_END_OF_ROW_TITLE)]
        column_list = [chr(i) for i in range(ord('A'), ord(EXCEL_END_OF_COLUMN)+1)]
        for row in row_list:
            for column in column_list:
                pos = column + str(row)
                value = self.sheet[pos].value
                if value == name:
                    return column
        self.err_print( "%s not found." % name)
        return None

    #Plusieurs lignes(1,2,3...)Obtient la plage d'éléments créés par combinaison.
    #Les valeurs de retour sont minimales et maximales+C'est 1.
    def get_multi_row_data(self, row_title, row_name):
        hit = False
        column = self.get_column(row_title)
        if column == None:
            self.err_print( "%s not found." % row_name)
            return None, None
        row_list =  [int(i) for i in range(1, EXCEL_END_OF_ROW_ITEM)]
        for row in row_list:
            pos = column + str(row)
            value = self.sheet[pos].value
            if value != None:
                if hit == True:
                    api_max = row
                    return api_min, api_max
            if value == row_name and hit == False:
                hit = True
                api_min = row
        if hit == True:
            api_max = row
            return api_min, api_max
        else:
            self.err_print( "%s not found." % row_name)
            return None, None

    #Ligne spécifiée,Écrivez les données de valeur dans la colonne.
    def write(self, colomn, row, value):
        self.sheet[colomn + str(row)] = value

    #Le fichier Excel d'origine sera mis à jour par Genji A.
    def save(self):
        self.workbook.save(self.filename)

#EOF

Le comportement de chaque API est le suivant.

API mouvement
err_print Afficher un message d'erreur. En supposant une utilisation interne
select_sheet Sélectionnez la feuille à traiter
get_column Colonne avec le nom spécifié (A,B,...) Est retourné. Ceci est conscient de l'obtention de la colonne du nom de l'élément au-dessus du tableau.
get_multi_row_data Si plusieurs lignes sont combinées, calculez la plage. Dans l'exemple, l'API s'applique à cela
write Ligne spécifiée,Écrivez une chaîne dans Column.
save Mettez à jour le fichier Excel (sinon les modifications ne seront pas reflétées dans Excel)

Les paramètres ont les rôles suivants: Eh bien, je suis désolé de le faire correctement. Je pense que EXCEL_END_OF_ROW_ITEM est censé être fait plus bas.

Paramètres rôle
EXCEL_END_OF_COLUMN Colonne En d'autres termes, spécifiez la distance à suivre lors du léchage latéral
EXCEL_END_OF_ROW_TITLE get_À quelle distance rechercher du haut lors de la recherche dans la colonne
EXCEL_END_OF_ROW_ITEM get_multi_row_À quelle distance rechercher du haut lors de la recherche par données

Même si je ne suis pas doué pour le codage, c'est un processus simple, donc si vous comparez l'URL et le code de l'article officiel ou cité, vous pouvez comprendre le processus dans une certaine mesure. Parmi eux, get_multi_row_data est assez terrible, mais le fait est que l'endroit où vous avez frappé est le plus petit, marquez-le avec, puis tournez-le jusqu'à ce qu'il ne soit pas None (ou il était None jusqu'à la fin) Cela ressemble au maximum.

Je me demande si cette zone peut être utilisée sans trop dépendre de la feuille.

J'ai écrit une application d'exploitation Excel

Le code pour faire fonctionner l'exemple Excel à l'aide de test_excel est le suivant.

#!/usr/bin/env python
# -*- coding: shift-jis -*-

# test_excel.Application qui utilise py pour remplir les résultats de l'Excel pertinent

from datetime import datetime
from test_excel import TestExcel

#Nom de l'élément de table, nom de l'API de test, nom du test et colonne(A,B,C,..)Quand tu mets
#Ligne de l'élément correspondant (1,2,3..) Est retourné.
def get_test_row(excel, test_koumokumei, test_apiname, siken_naiyou_column, siken_naiyou_name):
    api_min, api_max = excel.get_multi_row_data(test_koumokumei, test_apiname)
    if api_min == None:
        return None
    for row in range(api_min, api_max):
        pos = siken_naiyou_column + str(row)
        value = excel.sheet[pos].value
        if value == siken_naiyou_name:
            return row
    print("\r\nerror::%s found. but %s not found.\n\n" % (test_apiname, siken_naiyou_name))
    return None

#
#Exemple d'opération Excel
#Lorsqu'il est accompagné d'une manipulation de cordes"ascii"、u"tester"On suppose que l'appelant l'utilisera correctement.
#
if __name__ == "__main__":

    filename = "Exemple de test API.xlsx"

    #excel initialisation
    excel = TestExcel(filename)

    #Sélection de feuilles
    excel.select_sheet(u"Examen API")

    #Détecte la colonne correspondant à l'élément
    naiyou_column = excel.get_column(u"contenu du test")
    print "Colonne de contenu de test=", naiyou_column
    kekka_column = excel.get_column(u"résultat")
    print "Colonne de résultat=", kekka_column

    #Extraire les informations de test et décrire les résultats(1)
    test_koumokumei = "API"
    test_api = "sample_open(char *name)"
    test_name = u"Rouvrir"
    test_row = get_test_row(excel, test_koumokumei, test_api, naiyou_column, test_name)
    result = u"Succès"
    excel.write(kekka_column, test_row, result)
    print "API:", test_api, "contenu du test:", test_name, " =", test_row, "résultat:", result

    #Extraire les informations de test et décrire les résultats(2)
    test_api = "sample_close(void)"
    test_name = u"Système normal"
    test_row = get_test_row(excel,test_koumokumei, test_api, naiyou_column, test_name)
    result = u"Échec"
    excel.write(kekka_column, test_row, result)
    print "API:", test_api, "contenu du test:", test_name, " =", test_row, "résultat:", result

    #mise à jour
    excel.save()

    print "complete."

#EOF

Dans ce cas, il est nécessaire de rechercher l'emplacement pertinent à partir du nom de l'API et du contenu de test. La colonne peut être importée immédiatement avec get_column de test_excel, mais Row nécessite AND du nom d'API et du nom du test. Il est traité par la fonction __get_test_row __. Le processus est le suivant.

Ensuite, l'idée est que vous devez spécifier Row et Column et écrire.

Dans l'ensemble, il est décrit de traiter la feuille "API test" de "API test sample.xlsx". On suppose que le tableau présenté dans la figure ci-dessus y est écrit. Ainsi, le traitement suivant est effectué.

Lorsque vous exécutez réellement ce python, le message suivant apparaîtra et le résultat sera reflété dans Excel.

Examen API sélectionné.
Colonne de contenu de test= D
Colonne de résultat= G
API: sample_open(char *name)contenu du test:Rouvrir=4 résultats:Succès
API: sample_close(void)contenu du test:Système normal=7 résultats:Échec
complete.

Ainsi, si vous spécifiez le nom de l'API et le contenu du test, vous pouvez trouver l'emplacement cible. Je le cherche en le léchant, donc je sens que je peux le gérer même si je change un peu la disposition d'Excel. Comme pour les autres scripts, le jugement de journal est une spécialité de Python, donc en le combinant avec la classe test_excel cette fois, il pourra se remplir sans permission (devrait).

À propos de la licence

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

c'est tout.

Recommended Posts

[Python] [Excel] Exploiter des feuilles Excel à partir de Python en utilisant openpyxl (en utilisant une feuille de test comme exemple)
Exécutez des scripts Python à partir d'Excel (en utilisant xlwings)
Exploitez Excel avec Python open pyxl
Essayez d'exploiter un fichier Excel en utilisant Python (Pandas / XlsxWriter) ①
Essayez d'exploiter un fichier Excel en utilisant Python (Pandas / XlsxWriter) ②
Utiliser un écran connecté I2C à partir de Python
Obtenez la formule dans le fichier Excel sous forme de chaîne en Python
Essayez d'utiliser Excel en utilisant Python (Xlwings)
Créer un bloc de données à partir d'Excel à l'aide de pandas
Exécutez des fichiers Python à partir de HTML en utilisant Django
Résumé des opérations Excel utilisant OpenPyXL en Python
J'ai essayé de fonctionner à partir de Postman en utilisant Cisco Guest Shell comme serveur API
Manipuler Redmine à l'aide de Python Redmine
Exécutez Python à partir d'Excel
Faites fonctionner le neutron de Python!
Faire fonctionner LXC depuis Python
Utiliser Excel avec Python (1)
Utiliser Excel avec Python (2)
Comment créer une instance d'une classe particulière à partir de dict en utilisant __new__ () en python
Collez l'image dans un fichier Excel en utilisant l'openpyxl de Python
[Python] Comment générer une table pandas dans un fichier Excel
Tirez en accéléré à partir d'une caméra PC en utilisant Python, OpenCV
Aplatir à l'aide du rendement Python de
Comprendre la fonction de convolution en utilisant le traitement d'image comme exemple
Créer une instance d'une classe prédéfinie à partir d'une chaîne en Python
Créer une API qui renvoie les données d'un modèle à l'aide de turicreate
Format lors du passage d'une longue chaîne comme argument de python
Essayez d'extraire une chaîne de caractères d'une image avec Python3
Lire la feuille Excel et le processus en boucle ligne par ligne Python VBA
Traitement d'ajout de colonne de fichier Excel et de suppression de ligne à l'aide de Python Openpyxl
Comment obtenir un ingénieur de la trentaine
[Remarque] Utilisation d'un écran LCD à 16 caractères à 2 chiffres (1602A) de Python avec Raspeye
J'ai essayé de sortir la liste rpm de la destination de connexion SSH sur une feuille Excel avec Python + openpyxl.