Modificare i fogli excel con Python

Nei giorni scorsi ho comprato questo manuale:


che si è rilevato provvidenziale visto che mi trovo a dover generare centinaia di fogli excel per tenere traccia dei rapporti di manutenzioni per un impianto di videosorveglianza.

Scopo del lavoro è quello di generare circa 130 schede di manutenzione per ogni dispositivo che compone l’impianto e quindi aggiornare ogni scheda con il codice relativo codice,  per un totale di circa 600 schede.

Fatta la scheda master, tramite una Macro, ho duplicato i fogli di excel per ottenere 130 schede differenti. Per creare la macro ho seguito questo video tutorial:

Per caricare in Python delle librerie esterne aprire CMD andare nella cartella dove si trova l’eseguibile pip (valido per le installazioni di Windows) quindi eseguire il comando

pip install nome-libreria

Il comando scarica ed installa la libreria.

Ecco il primo ostacolo: faccio per caricare il file excel da cui voglio estrarre i dati e mi viene comunicato un errore che riporto di seguito.

Traceback (most recent call last):
File “C:\Users\m.chiessi\AppData\Local\Programs\Python\Python36\lib\site-packages\openpyxl\reader\excel.py”, line 117, in load_workbook
archive = ZipFile(filename, ‘r’, ZIP_DEFLATED)
File “C:\Users\m.chiessi\AppData\Local\Programs\Python\Python36\lib\zipfile.py”, line 1090, in __init__
self.fp = io.open(file, filemode)
FileNotFoundError: [Errno 2] No such file or directory: ‘INDIRIZZI.xlsx’

In sostanza il file che sto cercando di caricare non è disponibile. provo alcune soluzioni ma niente da fare…cerco sul manuale e vedo il primo paragrafo del capitolo 8 “File e percorsi file”! Verooo devo caricare la libreria os quindi mi muovo tra le cartelle per posizionarmi su quella che contiene il file excel che voglio aprire.

Come intendo procedere: ho a disposizione un file nominato ‘INDIRIZZI.xlsx’ che contiene in forma tabellare tutte le informazioni dei dispositivi dell’impianto che devono essere riportate sulle schede di manutenzione. Il software che voglio scrivere prende le informazioni dl suddetto file e le riporta nelle schede.

 

Con il codice seguente sono riuscito a cambiare il valore della cella S10 dei primi 123 fogli di excel:

 

>>> wbAddTab = openpyxl.load_workbook(‘INDIRIZZI.xlsx’)
>>> wbTestTable = openpyxl.load_workbook(‘Termiche da compilare.xlsx’)
>>> AddSheet = wbAddTab.get_sheet_by_name(‘prova’)
>>> SheetList = wbTestTable.get_sheet_names()
>>> SheetList[1]
‘Apparato TER (2)’
>>> CamSheet = wbTestTable.get_sheet_by_name(SheetList[2])
>>> CamSheet[‘S10’].value = AddSheet[‘D5’].value
>>> wbTestTable.save(‘verifica copia.xlsx’)
>>>

>>> for i in range(2,125,1):
CamSheet[‘S10’].value = AddSheet.cell(row=i, column=4).value
CamSheet = wbTestTable.get_sheet_by_name(SheetList[i])

>>> wbTestTable.save(‘verifica copia2.xlsx’)

Ora devo aggiustare gli indici per azzeccare le pagine e scrivere il codice per modificare le seguenti celle: Q10, T14,V14, per finire cambiando il nome dei fogli.

Le sigle degli apparati sono composte da un numero variabile di caratteri, le schede di collaudo sono state predisposte per riportare i codici in modo che ogni carattere sia contenuto in una singola cella. Occorre quindi eseguire una operazione intermedia che consiste nello scomporre il codice e riscriverlo in modo da avere ogni cella un carattere diverso.

Per scomporre le sigle dei quadri una lettera ogni cella ho eseguito questo codice:

 

for n in range(0,2,1):
for i in range(2,133,1):
quadro = AddSheet.cell(row=i, column=5).value
print(‘n= ‘,n,’i= ‘,i, quadro[n])

Ma non funziona perché non tiene conto della lunghezza variabile dei codici.

COLPO DI GENIO :

il codice che devo copiare da una cella per poi riscrivere i singoli caratteri in singole celle ha una lunghezza variabile, quindi uso un for che ha per argomento della funzione range la lunghezza del codice letto, ovvero: “for n in range(len(quadro)):” dove quadro è una variabile che contiene la stringa del codice del quadro elettrico.

 

Ricarico il file degli indirizzi:

wbAddTab = openpyxl.load_workbook(‘INDIRIZZI.xlsx’)

Qundi carico il foglio dove sono contenute le informazioni:

AddSheet = wbAddTab.get_sheet_by_name(‘prova’)

Ciclo For che si adatta alla lunghezza del codice letto:

for i in range(2,133,1):
quadro = AddSheet.cell(row=i, column=5).value
for n in range(len(quadro)):
AddSheet.cell(row=i, column=5+1+n).value = quadro[n]

Salvo il file:

wbAddTab.save(‘INDIRIZZI2.xlsx’)

 

Con questo codice cambio il nome ai fogli:

for i in range(2,133,1):
currentSheet = wbTestTable.get_sheet_by_name(SheetList[i-2])
currentSheet.title = AddSheet.cell(row=i, column=14).value

 

Di seguiuto la procedura completa per la modifica dei tre elementi delle schede:

  • Codice Quadro elettrico di riferimento
  • Codice Palo
  • Nome Sheet excel

per avere la corretta identazione è possibile scaricare questo file

/* CREAZIONE E MODIFICA SCHEDE DI MANUTENZIONE

/* Posizionamento nella cartella dei file
import os
>>> os.getcwd()
‘C:\\Users\\m.chiessi\\AppData\\Local\\Programs\\Python\\Python36’
>>> os.chdir(‘C:\\Users\\m.chiessi\\Documenti\\prova Python’)

/* Importazione della libreria e apertura dei file

>>> import openpyxl
>>> wbAddTab = openpyxl.load_workbook(‘INDIRIZZI2.xlsx’)
>>> AddSheet = wbAddTab.get_sheet_by_name(‘prova’)
>>> wbTestTable = openpyxl.load_workbook(‘nemo file contenente le tabelle da modificare.xlsx’)
>>> SheetList = wbTestTable.get_sheet_names()

CILCO FOR PER SOTITUZIONE CODICI QUADRI ELETTRICI

for i in range(2,133,1):
quadro = AddSheet.cell(row=i, column=5).value
WorkingSheet = wbTestTable.get_sheet_by_name(SheetList[i-2])
for n in range(len(quadro)):
WorkingSheet.cell(row=10,column=15+n).value = AddSheet.cell(row=i, column=5+1+n).value

CILCO FOR PER SOTITUZIONE CODICI PALI

for i in range(2,133,1):
WorkingSheet = wbTestTable.get_sheet_by_name(SheetList[i-2])
WorkingSheet.cell(row=14,column=20).value = AddSheet.cell(row=i, column=2).value
WorkingSheet.cell(row=14,column=22).value = AddSheet.cell(row=i, column=4).value

CICLO FOR PER SOSTITUZIONE I NOMI FOGLI

for i in range(2,133,1):
currentSheet = wbTestTable.get_sheet_by_name(SheetList[i-2])
currentSheet.title = AddSheet.cell(row=i, column=17).value

/*
valore di column dipende dall’apparato:
termiche= 17
PTZ = 15
SWITCH = 21
PLC = 22
Centralime CIAS = 18
*/

SALVATAGGIO DEL FILE

wbTestTable.save(‘prova codice quadro.xlsx’)

Offerte del giornoGuarda