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
Expliquons chaque partie.
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.
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.
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.
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.
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.
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.
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)
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