Estrarre immagini da excel

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')