Nel caso di un file Excel con all’interno delle immagini (no path, no url) semplicemente ‘incollate’ dentro, come nel caso, ad esempio, di un listino prezzi, un catalogo o altro possiamo utilizzare un codice pyton per farci creare una cartella contenente le immagini e rinominate secondo nostre specifiche.
Ho preso spunto da un estratto di codice (inizialmente non funzionante) presente su stackoverflow (qui il link al thread).
Il codice accetta come parametri il file excel e crea una directory temporanea per le elaborazioni, alla fine elimina la cartella temporanea e lascia un cartella di destinazione contenente le immagini estratte.
Lo riporto qui per comodità (funzionante):
import pathlib
import shutil
def extract_xls_images(path):
if type(path) is str:
path = pathlib.Path(path)
if path.suffix != '.xlsx':
raise ValueError('path must be an xlsx file')
source_file = path.name
name = path.name.replace(''.join(path.suffixes), '').replace(' ', '') # name of excel file without suffixes
temp_file = pathlib.Path(name).parent / 'temp.xlsx' # temp xlsx
temp_zip = temp_file.with_suffix('.zip') # temp zip
shutil.copyfile(source_file, temp_file)
temp_file.rename(str(temp_zip))
extract_dir = temp_file.parent / 'temp'
extract_dir.mkdir(exist_ok=True)
destination_dir = temp_file.parent / 'dest'
destination_dir.mkdir(exist_ok=True)
shutil.unpack_archive(temp_zip, extract_dir) # unzip xlsx zip file
paths_img = sorted((extract_dir / 'xl' / 'media').glob('*.png')) # find images
move_paths = {path: destination_dir / (name + f'-{str(n)}.png') for n, path in enumerate(paths_img)} # create move path dict
new_paths = [shutil.move(old, new) for old, new in move_paths.items()] # move / rename image files
shutil.rmtree(extract_dir) # delete temp folder
temp_zip.unlink() # delete temp file
return new_paths
extract_xls_images('listino_agricow.xlsx')