Création de tableaux Excel avec Python [Table de gestion des progrès]

introduction

J'ai soudain pensé que j'avais créé une simple table de gestion des progrès pour moi-même. ... N'est-ce pas ennuyeux de faire ça à chaque fois? ??

C'est pourquoi j'ai écrit le code qui crée une table lorsque je la démarre après avoir étudié python.

↓ Le produit fini ressemble à ceci project.gif

Expliquons chaque partie.

Création de fichier

import openpyxl.utils
import os

from openpyxl.styles import PatternFill
from openpyxl.styles.borders import Border, Side
from openpyxl.formatting.rule import FormulaRule

wb = openpyxl.Workbook()
sheet = wb.active
sheet.title = 'Tableau de gestion des progrès'

Commencez par créer un fichier Excel. Créez un nouveau fichier avec openpyxl.Workbook (). active cible la feuille actuellement sélectionnée. Le fichier étant lancé, la feuille Sheet1 est sélectionnée. Vous pouvez modifier le nom de la feuille sélectionnée par titre.

Dimensionnement des cellules

def cellwidth(start, end, wide):
    for length in range(start, end):
        alpha = sheet.cell(row=1, column=length).coordinate[:-1]
        sheet.column_dimensions['{}'.format(alpha)].width = wide


cellwidth(1, 7, 8.38)
cellwidth(2, 3, 17.38)
cellwidth(8, 9, 0.38)
cellwidth(9, 335, 4.88)

for rows in range(1, 100):
    sheet.row_dimensions[rows].height = 19

Vous pouvez définir la largeur de colonne avec colomn_dimensions ['colonne spécifiée'] .width et la hauteur de ligne avec row_dimensions ['ligne spécifiée'] .height. Je voulais spécifier chacun, alors j'en ai fait une fonction et j'ai utilisé l'instruction for. Il est difficile de comprendre la colonne, mais elle est convertie en A = 1, B = 2, C = 3 ... (Exemple: B1 si cellule (ligne = 1, colonne = 2)) Puisque je voulais mettre un alphabet dans la colonne spécifiée, j'ai utilisé cell (row =, column =). Coordinate pour obtenir la position de la cellule, et [: -1] pour obtenir le dernier caractère -1 depuis le début. (Exemple: si c'est AAA1 dans la cellule, obtenez AAA) Puisque la largeur de ligne est uniforme cette fois, ce n'est pas une fonction.

Bordure de cadre

side1 = Side(style='thin', color='000000')
side2 = Side(style='double', color='000000')
side3 = Side(style='hair', color='000000')

for rows in sheet.iter_rows(min_row=1, min_col=1, max_row=100, max_col=9):
    for cell in rows:
        if cell.row == 5:
            cell.border = Border(right=side1, bottom=side2)
        else:
            cell.border = Border(top=None, right=side1, bottom=None, left=None)

for rows in sheet.iter_rows(min_row=1, min_col=9, max_row=100, max_col=335):
    for cell in rows:
        if cell.row == 5:
            cell.border = Border(right=side3, bottom=side2)
        else:
            cell.border = Border(top=side3, right=side3, bottom=side3, left=side3)

Définissez la bordure avec Side (style = 'Border style', color = 'Color'). La bordure (haut =, droite =, bas =, gauche =) vous permet de définir les bordures supérieure, inférieure, gauche et droite d'une cellule. Ici, l'instruction for est utilisée pour définir une bordure pour chaque cellule dans la plage spécifiée par min à max. Seule la 5ème ligne est branchée avec une instruction if car je voulais mettre une ligne sous le cadre. Notez que si vous définissez le haut et le bas et la droite et la gauche sur différents types de lignes, les parties adjacentes seront écrasées par les bordures qui ont été modifiées ultérieurement.

Insérer des nombres et des expressions

startYear = 2020
startMonth = 3
startDay = 1

sheet["B5"].value = "tâche"
sheet["C4"].value = "Date de début"
sheet["C5"].value = "des plans"
sheet["D5"].value = "Performance"
sheet["E4"].value = "Date d'achèvement"
sheet["E5"].value = "des plans"
sheet["F5"].value = "Performance"
sheet["G5"].value = "Remarques"
sheet["I2"].value = startYear
sheet["J2"].value = "Année"
sheet["I3"].value = startMonth
sheet["J3"].value = "Mois"

sheet["I4"].number_format = "d"
sheet["I4"].value = '=DATE(I2, I3, {})'.format(startDay)
sheet["I5"].number_format = "aaa"
sheet["I5"].value = '=I4'

for rows in sheet.iter_rows(min_row=4, min_col=10, max_row=5, max_col=334):
    for cell in rows:
        if cell.row == 4:
            cell.number_format = 'd'
            cell.value = '={}+1'.format(sheet.cell(row=cell.row, column=cell.column-1).coordinate)
        else:
            cell.number_format = 'aaa'
            cell.value = '={}'.format(sheet.cell(row=cell.row-1, column=cell.column).coordinate)

for rows in sheet.iter_rows(min_row=3, min_col=11, max_row=3, max_col=334):
    for cell in rows:
        cell.number_format = "m"
        cell.value = '=IF(DAY({0})=1, {1},"")'.format(sheet.cell(column=cell.column, row=cell.row + 1).coordinate,
                                                      sheet.cell(column=cell.column, row=cell.row + 1).coordinate)

La valeur est entrée dans la cellule spécifiée de la cellule .value. Si vous souhaitez saisir une expression, utilisez '= équation'. Vous devez être prudent car si vous entrez une formule de calcul simple, le résultat du calcul ne sera entré que. Vous pouvez également modifier le format d'affichage avec number_format. Vous pouvez voir le format d'affichage dans Excel ou le vérifier en version imprimée (cell.number_format). Au fait, d est la date et aaa est le jour. Je décide du mois de départ et j'ajoute la date à partir de là, et si c'est un jour, j'affiche également le mois. Avec cela, j'ai approximativement entré les mois, les jours et les jours pendant 11 mois.

Mise en forme conditionnelle

def colorMake(types, start, end):
    return PatternFill(fill_type=types, start_color=start, end_color=end)

grayfill = colorMake('solid', 'd3d3d3', 'd3d3d3')
goldfill = colorMake('solid', 'ffd700', 'ffd700')
bluefill = colorMake('solid', '1e90ff', '1e90ff')

for rows in sheet.iter_rows(min_row=6, min_col=2, max_row=100, max_col=7):
    for cell in rows:
        cell.number_format = "m/d"
sheet.conditional_formatting.add('C6:G100', FormulaRule(formula=['NOT($F6="")'], stopIfTrue=True, fill=grayfill))

sheet.conditional_formatting.add('I4:ME100', FormulaRule(formula=['OR(WEEKDAY(I$5)=1, WEEKDAY(I$5)=7)'], stopIfTrue=True, fill=grayfill))

sheet.conditional_formatting.add('I6:ME100', FormulaRule(formula=['AND($D6<=I$4, $F6>=I$4)'], stopIfTrue=True, fill=goldfill))
sheet.conditional_formatting.add('I6:ME100', FormulaRule(formula=['AND($C6<=I$4, $E6>=I$4)'], stopIfTrue=True, fill=bluefill))

Vous pouvez définir les conditions dans l'ordre de la description dans la feuille de sélection .conditional_formatting.add ('Plage de cellules applicable', FormulaRule (formula = [Condition applicable], stopIfTrue = True ou False, fill = color)). C'était une pierre d'achoppement, mais la formule = [conditions applicables] et le contenu de l'expression conditionnelle ne devraient pas commencer par =. Je n'obtiens aucune erreur, mais pourquoi n'y a-t-il pas de mise en forme conditionnelle dans Excel? ?? ?? Ce sera. stopIfTrue est un format conditionnel "stop if met". Qu'est-ce que c'est si vous n'utilisez pas Excel? C'est comme ressentir ... J'ai également défini la couleur de la cellule lorsque la condition est remplie. PatternFill (filltype = motif de remplissage, start_color =, end_color =) Si vous n'utilisez pas de gradation, start_color et end_color doivent être identiques.

sauvegarder

desktop_path = os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + "\\Desktop"
wb.save(desktop_path + '\\Tableau de gestion des progrès.xlsx')

C'est la fin. Vous pouvez l'enregistrer en tant que classeur .save (nom de fichier). Veuillez noter que sans cela, peu importe combien vous en faites, il ne sera pas enregistré. Cette fois, j'ai spécifié le chemin absolu vers le bureau et l'ai enregistré. S'il ne s'agit que du nom du fichier, il sera enregistré dans le répertoire courant.

À la fin

Comme la plage de cellules est trop fixe cette fois, il semble que le degré de liberté augmentera si vous créez un fichier de propriétés pour les variables et que vous le personnalisez à votre guise en y ajustant les valeurs numériques. C'était beaucoup d'étude car il était rempli de divers éléments. (Petite sensation)

Code entier

import openpyxl.utils
import os

from openpyxl.styles import PatternFill
from openpyxl.styles.borders import Border, Side
from openpyxl.formatting.rule import FormulaRule

wb = openpyxl.Workbook()
sheet = wb.active
sheet.title = 'Tableau de gestion des progrès'


def cellwidth(start, end, wide):
    for length in range(start, end):
        alpha = sheet.cell(row=1, column=length).coordinate[:-1]
        sheet.column_dimensions['{}'.format(alpha)].width = wide


cellwidth(1, 7, 8.38)
cellwidth(2, 3, 17.38)
cellwidth(8, 9, 0.38)
cellwidth(9, 335, 4.88)

for rows in range(1, 100):
    sheet.row_dimensions[rows].height = 19

side1 = Side(style='thin', color='000000')
side2 = Side(style='double', color='000000')
side3 = Side(style='hair', color='000000')

for rows in sheet.iter_rows(min_row=1, min_col=1, max_row=100, max_col=9):
    for cell in rows:
        if cell.row == 5:
            cell.border = Border(right=side1, bottom=side2)
        else:
            cell.border = Border(top=None, right=side1, bottom=None, left=None)

for rows in sheet.iter_rows(min_row=1, min_col=9, max_row=100, max_col=335):
    for cell in rows:
        if cell.row == 5:
            cell.border = Border(right=side3, bottom=side2)
        else:
            cell.border = Border(top=side3, right=side3, bottom=side3, left=side3)

startYear = 2020
startMonth = 2
startDay = 1

sheet["B5"].value = "tâche"
sheet["C4"].value = "Date de début"
sheet["C5"].value = "des plans"
sheet["D5"].value = "Performance"
sheet["E4"].value = "Date d'achèvement"
sheet["E5"].value = "des plans"
sheet["F5"].value = "Performance"
sheet["G5"].value = "Remarques"
sheet["I2"].value = startYear
sheet["J2"].value = "Année"
sheet["I3"].value = startMonth
sheet["J3"].value = "Mois"

sheet["I4"].number_format = "d"
sheet["I4"].value = '=DATE(I2, I3, {})'.format(startDay)
sheet["I5"].number_format = "aaa"
sheet["I5"].value = '=I4'

for rows in sheet.iter_rows(min_row=4, min_col=10, max_row=5, max_col=334):
    for cell in rows:
        if cell.row == 4:
            cell.number_format = 'd'
            cell.value = '={}+1'.format(sheet.cell(row=cell.row, column=cell.column-1).coordinate)
        else:
            cell.number_format = 'aaa'
            cell.value = '={}'.format(sheet.cell(row=cell.row-1, column=cell.column).coordinate)

for rows in sheet.iter_rows(min_row=3, min_col=11, max_row=3, max_col=334):
    for cell in rows:
        cell.number_format = "m"
        cell.value = '=IF(DAY({0})=1, {1},"")'.format(sheet.cell(column=cell.column, row=cell.row + 1).coordinate,
                                                      sheet.cell(column=cell.column, row=cell.row + 1).coordinate)


def colorMake(types, start, end):
    return PatternFill(fill_type=types, start_color=start, end_color=end)


grayfill = colorMake('solid', 'd3d3d3', 'd3d3d3')
goldfill = colorMake('solid', 'ffd700', 'ffd700')
bluefill = colorMake('solid', '1e90ff', '1e90ff')

for rows in sheet.iter_rows(min_row=6, min_col=2, max_row=100, max_col=7):
    for cell in rows:
        cell.number_format = "m/d"
sheet.conditional_formatting.add('C6:G100', FormulaRule(formula=['NOT($F6="")'], stopIfTrue=True, fill=grayfill))

sheet.conditional_formatting.add('I4:ME100', FormulaRule(formula=['OR(WEEKDAY(I$5)=1, WEEKDAY(I$5)=7)'], stopIfTrue=True, fill=grayfill))

sheet.conditional_formatting.add('I6:ME100', FormulaRule(formula=['AND($D6<=I$4, $F6>=I$4)'], stopIfTrue=True, fill=goldfill))
sheet.conditional_formatting.add('I6:ME100', FormulaRule(formula=['AND($C6<=I$4, $E6>=I$4)'], stopIfTrue=True, fill=bluefill))

desktop_path = os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + "\\Desktop"
wb.save(desktop_path + '\\Tableau de gestion des progrès.xlsx')

Recommended Posts

Création de tableaux Excel avec Python [Table de gestion des progrès]
Excel avec Python
Gérez Excel avec python
Utiliser Excel avec Python (1)
Utiliser Excel avec Python (2)
Exploitez Excel avec Python open pyxl
Gestion de vidéos YouTube avec Python 3
[GUI en Python] PyQt5-Layout management-
solveur> Lien> Résoudre le solveur Excel avec python
Création de graphique Excel à l'aide de python xlwings
Installation de Python et gestion des packages avec pip
Dessinez Nozomi Sasaki dans Excel avec python
Créez rapidement un fichier Excel avec Python #python
Convertir des données Excel en JSON avec python
[Easy Python] Lecture de fichiers Excel avec openpyxl
Créer un fichier Excel avec Python + matrice de similarité
Création WebApi avec Python (création CRUD) Pour les débutants
[Easy Python] Lecture de fichiers Excel avec des pandas
Plan d'apprentissage Python pour la gestion de la progression de l'apprentissage de l'IA
FizzBuzz en Python3
Grattage avec Python
Statistiques avec python
Grattage avec Python
[Automation] Extraire le tableau en PDF avec Python
création de table django
Twilio avec Python
Lire les données de la table dans un fichier PDF avec Python
Intégrer avec Python
Jouez avec 2016-Python
AES256 avec python
Lire le nom / la plage de cellules Excel avec Python VBA
python commence par ()
Automatiser des tâches simples avec Python Table des matières
Création récente de classement à l'aide de l'API Qiita avec Python
Bingo avec python
Zundokokiyoshi avec python
Envoyer un e-mail avec Excel en pièce jointe en Python
Micro-ordinateur avec Python
Cast avec python
Excel> INTERCEPT ()> Valeur de la section> Erreur Web> Confirmer avec python / _, _ avec tuple
[BigQuery] Comment utiliser l'API de BigQuery pour Python -Création de table-
Extraire le tableau des fichiers image avec OneDrive et Python
Exécutez Python à partir d'Excel VBA avec xlwings et un supplément de tutoriel
Création automatique de tickets JIRA avec slack bot ~ développement de slack bot avec python ① ~
Manipuler des fichiers Excel à partir de python avec xlrd (mémo personnel)
Pourquoi ne pas créer facilement une table élégante avec Python?
[Python] Résumé de la méthode de création de table utilisant DataFrame (pandas)
Création de "Web Tools" BINGO avec Python (Table of Contents)
[Python] Comment réécrire le style de table avec python-pptx [python-pptx]
Opérations de création de dossier / déplacement de fichier / compression / suppression avec python
[Automatisation] Utilisez GitLab avec Python pour faciliter la gestion des requêtes
Communication série avec Python
Django 1.11 a démarré avec Python3.6
Jugement des nombres premiers avec Python
Python avec eclipse + PyDev.
Communication de socket avec Python