Partage de technologie

pandas pywin32 exploite la bureautique Excel

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

importer des pandas en tant que pd
importer re
importer win32com.client en tant que win32
à partir de win32com.client importer des constantes
importer le système d'exploitation
importer os.path comme osp
 
#Lire le tableau
chemin=os.getcwd()
fp=osp.join(chemin,'fuck_demo.xlsx')
df=pd.read_excel(fp,header=1,usecols=['numéro de série','nom de la section du câble optique (extrémité A-extrémité B)'],nrows=72)#N'oubliez pas les nrows
df.set_index('numéro de série',inplace=True)#Set index
 
#Filtrer les données
df_1=df[~df['Nom de la section du câble optique (extrémité A-extrémité B)'].str.contains('JT01')]
df_2=df[df['Nom de la section du câble optique (extrémité A-extrémité B)'].str.contains('JT01')]
 
#Référence d'opération données df_2
reg=re.compile(r'(?<=()(.*?)(?=))')
pf=df_2.copie()
pf['Extract AB end']=pf['Nom de la section du câble optique (extrémité A-B)'].str.extract(reg,expand=False)
pf['Nombre d'âmes du câble optique']=pf['Nom de la section du câble optique (extrémité A-extrémité B)'].str.extract(r'(?:.*)(-d+)',expand=False)
pf=pf.iloc[::-1]#Ordre inverse, clé
pf['Nombre de conducteurs de câble optique'] = pf['Nombre de conducteurs de câble optique'].replace('-', '', regex=True)#replace
 
 
#Traitement de l'information
ls=[]
pour idx,row dans pf.iterrows() :
strs_2=row['Nom de la section du câble optique (extrémité A-extrémité B)']
strs_3=row['Extraire la fin AB']
strs_4=row['Nombre de conducteurs de câble optique']
si strs_3 dans strs_2 :
ls.append([idx,strs_3,strs_4])
 
 
lg=[]#Stockage l'élément actuel est égal à l'élément précédent et différent de l'élément suivant
lf=[]#Stockage les deux éléments avant et après ne sont pas égaux
pour i dans la plage (len (ls)) :
si ls[i][1]==ls[i-1][1] et ls[i][1]!=ls[i+1][1] :
lt=ls[i-1:i+2]
l1=[]#Numéros de stockage
l2=[]#Store terminal AB
l3=[]#Stockage du nombre de conducteurs de câble optique
pour j dans la plage (len (lt)) :
l1.append(lt[j][0])
l2.append(lt[j][1])
l3.append(lt[j][-1])
 
new_l1=[min(l1),max(l1)]#Obtenir le minimum et le maximum
new_l1=map(str,new_l1)#Les éléments de la liste sont mappés à des chaînes
new_l2=liste(ensemble(l2))+liste(ensemble(l3))
res_1='-'.join(new_l1)#épissage du numéro de série
res_2='-'.join(new_l2)#Épissage du numéro de noyau du câble optique à l'extrémité AB
res_3=list((res_1,res_2))#Convertir en liste
lg.append(res_3)
autre:
l1=ls[i][0]#numéros de magasin
l2=ls[i][1]#store AB fin
l3=ls[i][-1]#storage le nombre de conducteurs de câbles optiques
res_4=liste((l1,l2,l3))
lf.append(res_4)
 
 
 
xh=[]#numéro de série
ab=[]#ab fin
xs=[]#nombre de cœurs
pour k dans la plage (len(lf)) :
l1=lf[k][0]#numéros de magasin
l2=lf[k][1]#store AB fin
l3=lf[k][-1]#storage le nombre de conducteurs de câbles optiques
xh.append(l1)
ab.append(l2)
xs.append(l3)
 
#Regroupez-vous en binôme
xh=[xh[x:x+2] pour x dans la plage(0,len(xh),2)]
ab=[ab[x:x+2] pour x dans la plage(0,len(ab),2)]
xs=[xs[x:x+2] pour x dans la plage(0,len(xs),2)]
 
lm=[]
pour n dans la plage (len(xh)) :
l1=liste((min(xh[n]),max(xh[n])))
new_l1=carte(str,l1)
l2=liste(ensemble(xs[n]))
l3=ab[n]+l2
 
res_1='-'.join(nouveau_l1)
res_2='-'.join(l3)
lm.append([res_1,res_2])
 
 
liste_finale=lg+lm
 
#removedduplication
finall_ls=[]
pour l dans finall_list :
si je ne suis pas dans finall_ls :
finall_ls.append(l)
 
#Recréez le DataFrame en fonction de la liste des résultats
df_3=pd.DataFrame(data=final_ls,columns=['numéro de série','nom de la section du câble optique (extrémité A-extrémité B)'])
df_3.set_index('serial number',drop=True,inplace=True)#Définir la colonne du numéro de série comme index
 
 
#Épissez la section de câble optique sans JT et la section traitée avec JT
cf=pd.concat([df_1,df_3],axe=0)
 
 
'''
Vous pouvez remplacer à nouveau l'index ou ne pas le remplacer. Quoi qu'il en soit, le numéro de ligne est basé sur le numéro de série + 2
'''
 
#pywin32Lire le tableau Excel
#Exécuter le programme Excel
essayer:
excel_app = win32.gencache.EnsureDispatch('Excel.Application')
sauf:
essayer:
win32.gencache.EnsureDispatch('et.Application')
sauf:
win32.gencache.EnsureDispatch('ket.Application')
enfin:
excel_app.Visible = Vrai
excel_app.DisplayAlerts = Faux
#Lire les colonnes requises du tableau
classeur = excel_app.Workbooks.Open(fp)
feuille de calcul = workbook.Worksheets('list')
feuille de calcul.Columns(3).Insert()
feuille de calcul.Columns(4).Insert()
worksheet.Cells(2, 3).Value = 'Numéro du dessin'#Définir le nom de la colonne
worksheet.Cells(2, 4).Value = 'Nom du paragraphe'#Définir le nom de la colonne.
 
#Formulaire d'opération
pour idx,row dans cf.iterrows() :
dl=row['Nom de la section du câble optique (extrémité A-extrémité B)']
bh=idx
si '-' dans str(bh) :
sb=bh.split('-')
start_row=int(min(sb))+2#Numéro de la ligne de départ
end_row=int(max(sb))+2#Numéro de ligne de fin
range1_to_merge=worksheet.Range(worksheet.Cells(start_row, 3), worksheet.Cells(end_row, 3))#Le "numéro de dessin" de la cellule à fusionner
range2_to_merge=worksheet.Range(worksheet.Cells(start_row, 4), worksheet.Cells(end_row, 4))#"Nom du paragraphe" de la cellule à fusionner
range3_to_color=worksheet.Range(worksheet.Cells(start_row, 5), worksheet.Cells(end_row, 5))#Le "nom de la section du câble optique (fin A-end B)" pour définir la couleur
range4_to_color=worksheet.Range(worksheet.Cells(start_row, 17), worksheet.Cells(end_row, 17))#Le "numéro de commande + demandeur" pour définir la couleur
range2_to_merge.WrapText = True#Retour automatique des lignes
range3_to_color.Interior.Color =7396243 # Couleur de remplissage rouge clair 804040
range4_to_color.Interior.Color =7396243
#range3_to_merge.Font.Color = 25500 # Texte rouge foncé
range1_to_merge.Value=bh#Numéro du dessin
range2_to_merge.Value=dl#paragraphe Câble optique
plage1_à_fusionner.Fusionner()
range2_to_merge.Fusionner()
range2_to_merge.Rows.RowHeight=36
range2_to_merge.Columns.ColumnWidth = 34
autre:
feuille de calcul.Cellules(idx+2,3).Valeur = idx
feuille de calcul.Cellules(idx+2,4).Valeur = dl
worksheet.Cells(idx+2,4).WrapText = True#Envelopper automatiquement les lignes
 
 
#Terminer l'opération et sauvegarder le formulaire
classeur.Enregistrer()
classeur.Close(SaveChanges=False)
excel_app.Quit()