Используйте python для извлечения изображений из листов Excel

avatar
John
4 марта 2019 в 09:42
12471
3
2

Я нашел код Python2 для извлечения изображений из файлов Excel.

У меня очень фундаментальный вопрос: где я должен указать путь моего целевого файла Excel?

Или это работает только с активным открытым файлом Excel?

import win32com.client       # Need pywin32 from pip
from PIL import ImageGrab    # Need PIL as well
import os

excel = win32com.client.Dispatch("Excel.Application")
workbook = excel.ActiveWorkbook

wb_folder = workbook.Path
wb_name = workbook.Name
wb_path = os.path.join(wb_folder, wb_name)

#print "Extracting images from %s" % wb_path
print("Extracting images from", wb_path)

image_no = 0

for sheet in workbook.Worksheets:
    for n, shape in enumerate(sheet.Shapes):
        if shape.Name.startswith("Picture"):
            # Some debug output for console
            image_no += 1
            print("---- Image No. %07i ----", image_no)

            # Sequence number the pictures, if there's more than one
            num = "" if n == 0 else "_%03i" % n

            filename = sheet.Name + num + ".jpg"
            file_path = os.path.join (wb_folder, filename)

            #print "Saving as %s" % file_path    # Debug output
            print('Saving as ', file_path)

            shape.Copy() # Copies from Excel to Windows clipboard

            # Use PIL (python imaging library) to save from Windows clipboard
            # to a file
            image = ImageGrab.grabclipboard()
            image.save(file_path,'jpeg')
Источник

Ответы (3)

avatar
Alderven
4 марта 2019 в 09:48
6

Вы можете получить изображения из существующего файла Excel следующим образом:

from PIL import ImageGrab
import win32com.client as win32

excel = win32.gencache.EnsureDispatch('Excel.Application')
workbook = excel.Workbooks.Open(r'C:\Users\file.xlsx')

for sheet in workbook.Worksheets:
    for i, shape in enumerate(sheet.Shapes):
        if shape.Name.startswith('Picture'):  # or try 'Image'
            shape.Copy()
            image = ImageGrab.grabclipboard()
            image.save('{}.jpg'.format(i+1), 'jpeg')
John
5 марта 2019 в 02:50
0

Кажется, есть много изображений, имена которых не начинаются с «Picture». Думаю, можно было бы лучше контролировать, какие изображения извлекать, если бы мы внимательно изучили shape.names. Большое спасибо за взлом.

avatar
Lukman Salim
8 ноября 2019 в 01:01
5

Файл xlsx на самом деле является zip-файлом. Вы можете напрямую получить изображения из подпапки xl / media. Вы можете сделать это в Python, используя класс ZipFile. Вам не нужно иметь MS Excel или даже работать в Windows!

avatar
Mike
4 марта 2019 в 09:47
1

Путь к файлу и имя файла определяются в переменных здесь:

wb_folder = workbook.Path
wb_name = workbook.Name
wb_path = os.path.join(wb_folder, wb_name)

В этом конкретном случае он вызывает активную книгу в предыдущей строке:

workbook = excel.ActiveWorkbook

Но теоретически вы должны иметь возможность указать путь с помощью переменных wb_folder и wb_name, если вы загружаете файл в модуль Excel (Python: откройте книгу Excel с помощью Win32 COM Api ).