Nous avons créé un outil GUI qui convertit automatiquement le CSV des données d'élévation de température d'un certain objet vers Excel, entre le temps de montée en température, colore les cellules à n'importe quelle température et crée un graphique.
・ GUI
-Fichier Excel créé automatiquement (* Le graphique est rempli)
ExcelMaker.pyw
import os, sys
import pandas as pd
import openpyxl as px
import tkinter as tk
import tkinter.filedialog as fl
import tkinter.messagebox as mb
from openpyxl.chart import ScatterChart, Reference, Series
from openpyxl.styles import PatternFill
#Fonction de sélection de fichier
def select_file():
global file_path
filetype = [("all file", "*.csv")] #Afficher le fichier CSV
iDir = os.path.abspath(r"<Chemin du répertoire>") #最初に表示したいChemin du répertoire
file_path = fl.askopenfilename(initialdir=iDir, filetypes=filetype) #Spécifier le chemin
file1.set(file_path) #Afficher le chemin sélectionné
#Fonction de création Excel
def make_excel():
excel_name = str(os.path.splitext(file_path)[0]) + "-1.xlsx" #Nom Excel
df = pd.read_csv(file_path, skiprows=57, usecols=[2], encoding="cp932") #Lire CSV
df.drop(df.tail(3).index, inplace=True) #Effacez les 3 dernières lignes et remplacez le fichier
df_float = df.astype("float").round(1) #Arrondir avec le premier point décimal
#S'il existe un fichier avec le même nom, vérifiez si vous souhaitez l'écraser
if os.path.isfile(excel_name):
res = mb.askquestion("", "Il existe un fichier du même nom. Voulez-vous écraser?")
#Écraser le fichier
if res == "yes":
df_float.to_excel(excel_name, header=False, index=False)
#Quitter le programme
elif res == "no":
mb.showinfo("", "Veuillez vérifier à nouveau le nom du fichier")
sys.exit()
#Créer un nouveau fichier
else:
df_float.to_excel(excel_name, header=False, index=False)
#Relations d'opération Excel
wb = px.load_workbook(excel_name)
ws = wb.active
sheet = wb["Sheet1"]
sc = sheet.cell
wc = ws.cell
sheet.insert_cols(0, 1) #Insérez une colonne au début
temp_var = int(entry_temp.get()) - 10 #Température cible-10℃
start = 1 #Heure de début de montée en température
cell_diff1 = 0 #Différence entre les cellules supérieures et inférieures
#En comparant les cellules supérieure et inférieure, si la température augmente de 3 fois ou plus trois fois de suite, l'élévation de température commence.
while cell_diff1 <= 3:
start += 1
cell_diff3 = float(sc(row=start+1, column=2).value) - float(sc(row=start, column=2).value)
if cell_diff3 >= 3:
cell_diff2 = float(sc(row=start+2, column=2).value) - float(sc(row=start+1, column=2).value)
if cell_diff2 >= 3:
cell_diff1 = float(sc(row=start+3, column=2).value) - float(sc(row=start+2, column=2).value)
end = start #Dernière ligne de données
v1 = 0 #Temps de montée en température
#Le temps de montée en température est de 0.Entrez 5 chacun
while sc(row=end, column=2).value is not None:
wc(row=end, column=1, value=v1)
end += 1
v1 += 0.5
keep = start #Heure de début de la rétention
fill = PatternFill(fill_type="solid", fgColor="FFFF00") #Remplissez la cellule de jaune
temp_var = int(entry_temp.get()) - 10 #Température cible-10℃
#Température cible-Ligne 10 ° C
while sc(row=keep, column=2).value <= temp_var:
keep += 1
#Si le premier chiffre est 5, descendez d'une ligne
if str(sc(row=keep, column=1).value)[-1] == str(5):
keep = keep + 1
#Colorez la cellule de l'heure de début de la rétention
wc(row=keep, column=1).fill = fill
wc(row=keep, column=2).fill = fill
v2 = 0 #Temps de montée en température
#Température cible-Le temps de rétention est de 0 à 10 ℃.Entrez 5 chacun
while keep != end:
wc(row=keep, column=3, value=v2)
keep += 1
v2 += 0.5
#Colorez la cellule pour le temps de rétention approprié
if int(entry_time1.get()) == v2 or int(entry_time2.get()) == v2 or int(entry_time3.get()) == v2:
wc(row=keep, column=1).fill = fill
wc(row=keep, column=2).fill = fill
wc(row=keep, column=3).fill = fill
max_entry_time = keep #Temps de rétention maximal
#Aligner le format de cellule avec la première fraction
for row in sheet:
for cell in row:
cell.number_format = "0.0"
#Créer un graphique
chart = ScatterChart()
x_values = Reference(ws, min_row=start, min_col=1, max_row=end, max_col=1) #axe x(Temps de montée en température)
y_values = Reference(ws, min_row=start, min_col=2, max_row=end, max_col=2) #axe y(Température)
graph = Series(y_values, x_values)
chart.series.append(graph)
ws.add_chart(chart, "D"+str(max_entry_time)) #Afficher le graphique en ligne à la fin de la rétention
wb.save(excel_name) #Enregistrer le fichier Excel
mb.showinfo("", "J'ai créé un fichier Excel")
#Créer une interface graphique
if __name__ == "__main__":
root = tk.Tk()
root.title("Convertir CSV en Excel")
#frame1
frame1 = tk.LabelFrame(root, text="Sélectionnez les fichiers")
frame1.grid(row=0, columnspan=2, sticky="we", padx=5)
#Bouton de sélection
select_button = tk.Button(frame1, text="Choix", command=select_file, width=10)
select_button.grid(row=0, column=3)
#Afficher le chemin du fichier
file1 = tk.StringVar()
file1_entry = tk.Entry(frame1, textvariable=file1, width=35)
file1_entry.grid(row=0, column=2, padx=5)
#frame2
frame2 = tk.LabelFrame(root, text="conditions")
frame2.grid(row=1, sticky="we")
#Texte de la température cible
text_temp = tk.Label(frame2, text="Température cible (℃)", width=20)
text_temp.grid(row=0, column=0, padx=5)
#Texte du temps de rétention
text_time = tk.Label(frame2, text="Temps de rétention (secondes):Plusieurs spécifications sont possibles", width=25)
text_time.grid(row=0, column=1)
#Bouton Exécuter
action_button = tk.Button(frame2, text="Courir", command=make_excel, width=15)
action_button.grid(row=3, column=0)
#Champ de saisie de la température cible
entry_temp = tk.Entry(frame2, width=15)
entry_temp.grid(row=1, column=0, padx=5)
#Champ de saisie du temps de rétention
entry_time1 = tk.Entry(frame2, width=15)
entry_time1.grid(row=1, column=1, padx=5, pady=5)
entry_time1.insert(tk.END, 0)
entry_time2 = tk.Entry(frame2, width=15)
entry_time2.grid(row=2, column=1, padx=5, pady=5)
entry_time2.insert(tk.END, 0)
entry_time3 = tk.Entry(frame2, width=15)
entry_time3.grid(row=3, column=1, padx=5, pady=5)
entry_time3.insert(tk.END, 0)
root.mainloop()
ExcelMaker.pyw
import os, sys
import pandas as pd
import openpyxl as px
import tkinter as tk
import tkinter.filedialog as fl
import tkinter.messagebox as mb
from openpyxl.chart import ScatterChart, Reference, Series
from openpyxl.styles import PatternFill
Importez les modules requis.
Créez une interface graphique avec tkinter
, lisez CSV avec pandas
et utilisez Excel avec ʻopenpyxl`.
ExcelMaker.pyw
#Fonction de sélection de fichier
def select_file():
global file_path
filetype = [("all file", "*.csv")] #Afficher le fichier CSV
iDir = os.path.abspath(r"<Chemin du répertoire>") #最初に表示したいChemin du répertoire
file_path = fl.askopenfilename(initialdir=iDir, filetypes=filetype) #Spécifier le chemin
file1.set(file_path) #Afficher le chemin sélectionné
Crée le processus lorsque vous appuyez sur le bouton de sélection.
Affichez uniquement CSV avec filetype
, et spécifiez le répertoire à ouvrir en premier lorsque le bouton de sélection est pressé pour ʻiDir. Dans IDLE utilisé pour l'environnement de développement cette fois, lors de l'insertion d'une chaîne de caractères avec des guillemets, une erreur peut se produire à moins que
r` ne soit ajouté au début, alors entrez-le.
Récupérez le nom du fichier sélectionné dans fileialog.askopenfilename
et définissez-le sur global
car vous souhaitez l'utiliser dans d'autres fonctions.
Sélectionnez le chemin du fichier avec file1.set (file_path)
et affichez-le dans le cadre à gauche du bouton.
ExcelMaker.pyw
#Fonction de création Excel
def make_excel():
excel_name = str(os.path.splitext(file_path)[0]) + "-1.xlsx" #Nom Excel
df = pd.read_csv(file_path, skiprows=57, usecols=[2], encoding="cp932") #Lire CSV
df.drop(df.tail(3).index, inplace=True) #Effacez les 3 dernières lignes et remplacez le fichier
df_float = df.astype("float").round(1) #Arrondir avec le premier point décimal
#S'il existe un fichier avec le même nom, vérifiez si vous souhaitez l'écraser
if os.path.isfile(excel_name):
res = mb.askquestion("", "Il existe un fichier du même nom. Voulez-vous écraser?")
#Écraser le fichier
if res == "yes":
df_float.to_excel(excel_name, header=False, index=False)
#Quitter le programme
elif res == "no":
mb.showinfo("", "Veuillez vérifier à nouveau le nom du fichier")
sys.exit()
#Créer un nouveau fichier
else:
df_float.to_excel(excel_name, header=False, index=False)
Tout d'abord, extrayez les parties nécessaires du CSV ci-dessus et créez-en un fichier Excel.
Pour convertir CSV en nom Excel, utilisez str (os.path.splitext (file_path) [0]) +" -1.xlsx "
pour supprimer le point après le dernier point (.csv) du chemin du fichier, et Ajoutez -1.xlsx
.
Lisez le CSV avec pd.read_csv
.
Puisque les données requises provenaient de la 58e ligne de la deuxième colonne, spécifiez skiprows = 57, usecols = [2]
comme arguments.
De plus, s'il est laissé tel quel, une erreur se produira en raison du type, spécifiez donc ʻencoding = "cp932" `.
Il y avait des données inutiles dans les 3 dernières lignes du CSV lu, alors supprimez-les avec df.drop (df.tail (3) .index)
et remplacez à nouveau le fichier CSV par ʻinplace = True. C'est un type à virgule flottante arrondi au premier chiffre avec
df.astype (" float "). Round (1)`.
Trouvez le fichier Excel que vous essayez de créer avec ʻif os.path.isfile (excel_name): `pour savoir quoi faire s'il y a un fichier avec le même nom. Si l'expression conditionnelle est «True», passez à l'instruction if suivante (== True peut être omis). Dans les autres cas, un nouveau fichier Excel est créé.
S'il y a un fichier avec le même nom, une fenêtre pour sélectionner "Oui" et "Non" sera affichée dans messagebox.askquestion
.
Je ne comprends pas encore les détails, mais pour le moment, je viens de définir la variable comme res = messagebox.askquestio
, mais le processus fonctionne réellement et la fenêtre s'affiche.
Par conséquent, si vous essayez de le définir à l'avance, il sera affiché dans un endroit inattendu, alors assurez-vous de le décrire au moment où vous souhaitez l'afficher.
La valeur de retour de messagebox.askquestio
est" yes = yes "et" no = no ", donc si oui, écrasez le fichier Excel tel quel, si non, quittez le programme avec sys.exit ()
Faire.
Jusqu'à ce point, vous aurez un fichier Excel contenant les données de changement de température dans la deuxième colonne, comme indiqué ci-dessous.
ExcelMaker.pyw
#Relations d'opération Excel
wb = px.load_workbook(excel_name)
ws = wb.active
sheet = wb["Sheet1"]
sc = sheet.cell
wc = ws.cell
sheet.insert_cols(0, 1) #Insérez une colonne au début
temp_var = int(entry_temp.get()) - 10 #Température cible-10℃
start = 1 #Heure de début de montée en température
cell_diff1 = 0 #Différence entre les cellules supérieures et inférieures
#En comparant les cellules supérieure et inférieure, si la température augmente de 3 fois ou plus trois fois de suite, l'élévation de température commence.
while cell_diff1 <= 3:
start += 1
cell_diff3 = float(sc(row=start+1, column=2).value) - float(sc(row=start, column=2).value)
if cell_diff3 >= 3:
cell_diff2 = float(sc(row=start+2, column=2).value) - float(sc(row=start+1, column=2).value)
if cell_diff2 >= 3:
cell_diff1 = float(sc(row=start+3, column=2).value) - float(sc(row=start+2, column=2).value)
end = start #Dernière ligne de données
v1 = 0 #Temps de montée en température
#Le temps de montée en température est de 0.Entrez 5 chacun
while sc(row=end, column=2).value is not None:
wc(row=end, column=1, value=v1)
end += 1
v1 += 0.5
Comparez les cellules supérieures et inférieures avec while cell_diff1 <= 3:
, et si la température augmente de 3 fois ou plus trois fois de suite, la hausse de température commence.
Tout d'abord, comparez la ligne de départ et la ligne ci-dessous avec cell_diff3 = float (sc (row = start + 1, column = 2) .value) --float (sc (row = start, column = 2) .value)
et 3 Dans le cas ci-dessus, comparez une ligne vers le bas avec cell_diff2
de la même manière, et lorsque dell_diff1
devient 3 ou plus, l'instruction while se termine.
Une fois que vous connaissez la ligne pour commencer le réchauffement, entrez le temps de réchauffement dans la première colonne avec while sc (row = end, column = 2) .value is not None:
jusqu'à ce que la valeur de la colonne de changement de température soit vide. Je vais continuer.
ExcelMaker.pyw
keep = start #Heure de début de la rétention
fill = PatternFill(fill_type="solid", fgColor="FFFF00") #Remplissez la cellule de jaune
temp_var = int(entry_temp.get()) - 10 #Température cible-10℃
#Température cible-Ligne 10 ° C
while sc(row=keep, column=2).value <= temp_var:
keep += 1
#Si le premier chiffre est 5, descendez d'une ligne
if str(sc(row=keep, column=1).value)[-1] == str(5):
keep = keep + 1
#Colorez la cellule de l'heure de début de la rétention
wc(row=keep, column=1).fill = fill
wc(row=keep, column=2).fill = fill
v2 = 0 #Temps de montée en température
#Température cible-Le temps de rétention est de 0 à 10 ℃.Entrez 5 chacun
while keep != end:
wc(row=keep, column=3, value=v2)
keep += 1
v2 += 0.5
#Colorez la cellule pour le temps de rétention approprié
if int(entry_time1.get()) == v2 or int(entry_time2.get()) == v2 or int(entry_time3.get()) == v2:
wc(row=keep, column=1).fill = fill
wc(row=keep, column=2).fill = fill
wc(row=keep, column=3).fill = fill
max_entry_time = keep #Temps de rétention maximal
#Aligner le format de cellule avec la première fraction
for row in sheet:
for cell in row:
cell.number_format = "0.0"
temp_var = int (entry_temp.get ()) --10
pour obtenir la valeur de la température cible -10 ℃, etwhile sc (row = keep, column = 2) .value <= temp_var:
pour obtenir la valeur. Examinez la ligne.
À ce moment-là, si la première virgule décimale du temps de montée en température est 5, ʻif str (sc (row = keep, column = 1) .value) [-1] == str (5): ʻest une ligne vers le bas.
Une fois que vous connaissez la ligne de début de rétention, entrez le temps de rétention jusqu'à la dernière ligne avec while keep! = End:
.
À ce moment-là, ʻif int (entry_time1.get ()) == v2 ou int (entry_time2.get ()) == v2 ou int (entry_time3.get ()) == v2: , la même ligne que le temps de rétention spécifié Obtenez la ligne avec le temps de rétention le plus long avec
max_entry_time = keep` à remplir et décidez où placer le graphique.
for row in sheet:
spécifie la ligne entière de la feuille, for cell in row:
spécifie la colonne entière, et cell.number_format =" 0.0 "
aligne le format de cellule avec le premier point décimal.
ExcelMaker.pyw
#Créer un graphique
chart = ScatterChart()
x_values = Reference(ws, min_row=start, min_col=1, max_row=end, max_col=1) #axe x(Temps de montée en température)
y_values = Reference(ws, min_row=start, min_col=2, max_row=end, max_col=2) #axe y(Température)
graph = Series(y_values, x_values)
chart.series.append(graph)
ws.add_chart(chart, "D"+str(max_entry_time)) #Afficher le graphique en ligne à la fin de la rétention
wb.save(excel_name) #Enregistrer le fichier Excel
mb.showinfo("", "J'ai créé un fichier Excel")
chart = ScatterChart ()
pour un diagramme de dispersion, x_values = Reference (ws, min_row = start, min_col = 1, max_row = end, max_col = 1)
pour la première colonne de l'axe X, y_values = Reference ( Spécifiez la deuxième colonne sur l'axe Y avec ws, min_row = start, min_col = 2, max_row = end, max_col = 2)
.
Spécifiez les axes X et Y avec graph = Series (y_values, x_values)
et ajoutez-les avec chart.series.append (graph)
.
Enfin, avec ws.add_chart (chart," D "+ str (max_entry_time))
, placez le graphique dans la ligne à la fin de la rétention dans la colonne D (4ème colonne), enregistrez le fichier et terminez.
ExcelMaker.pyw
#Créer une interface graphique
if __name__ == "__main__":
root = tk.Tk()
root.title("Convertir CSV en Excel")
#frame1
frame1 = tk.LabelFrame(root, text="Sélectionnez les fichiers")
frame1.grid(row=0, columnspan=2, sticky="we", padx=5)
#Bouton de sélection
select_button = tk.Button(frame1, text="Choix", command=select_file, width=10)
select_button.grid(row=0, column=3)
#Afficher le chemin du fichier
file1 = tk.StringVar()
file1_entry = tk.Entry(frame1, textvariable=file1, width=35)
file1_entry.grid(row=0, column=2, padx=5)
#frame2
frame2 = tk.LabelFrame(root, text="conditions")
frame2.grid(row=1, sticky="we")
#Texte de la température cible
text_temp = tk.Label(frame2, text="Température cible (℃)", width=20)
text_temp.grid(row=0, column=0, padx=5)
#Texte du temps de rétention
text_time = tk.Label(frame2, text="Temps de rétention (secondes):Plusieurs spécifications sont possibles", width=25)
text_time.grid(row=0, column=1)
#Bouton Exécuter
action_button = tk.Button(frame2, text="Courir", command=make_excel, width=15)
action_button.grid(row=3, column=0)
#Champ de saisie de la température cible
entry_temp = tk.Entry(frame2, width=15)
entry_temp.grid(row=1, column=0, padx=5)
#Champ de saisie du temps de rétention
entry_time1 = tk.Entry(frame2, width=15)
entry_time1.grid(row=1, column=1, padx=5, pady=5)
entry_time1.insert(tk.END, 0)
entry_time2 = tk.Entry(frame2, width=15)
entry_time2.grid(row=2, column=1, padx=5, pady=5)
entry_time2.insert(tk.END, 0)
entry_time3 = tk.Entry(frame2, width=15)
entry_time3.grid(row=3, column=1, padx=5, pady=5)
entry_time3.insert(tk.END, 0)
root.mainloop()
Créez cet écran. En tant que structure, un champ et un bouton de sélection pour afficher le chemin du fichier sélectionné sont agencés dans l'image 1, un champ pour entrer la température cible et le temps de rétention, et un bouton d'exécution sont disposés dans l'image 2.
En gros, spécifiez tk.Label
pour les phrases, tk.Button
pour les boutons et tk.Entry
pour les champs d'entrée, et placez-les n'importe où avec grid
.
Si vous souhaitez ajouter le traitement lorsque vous appuyez sur le bouton, spécifiez la fonction dans l'argument comand
, et si vous voulez mettre la valeur initiale dans le champ de saisie, spécifiez la valeur avec .insert
.
En passant, en définissant l'extension sur .pyw
, l'écran noir de l'arrière-plan au démarrage du programme ne sera pas affiché.
Cette fois, j'ai créé quelque chose qui pourrait être automatisé dans mon travail quotidien ainsi que dans mes études, mais parce que j'ai compris le travail lui-même, j'ai pu créer le programme lui-même assez facilement. (2H / jour x 10 jours)
En pensant au futur cours, les ingénieurs (ingénieurs RPA?) Qui introduisent de tels programmes dans les entreprises pour améliorer l'efficacité du travail semblent intéressants, je les considérerai donc comme des options.
Recommended Posts