Откройте несколько файлов Excel, откройте каждый лист каждого файла и сохраните изображение - PullRequest
1 голос
/ 05 июля 2019

У меня есть несколько файлов Excel с изображениями внутри, изображения расположены на разных листах Excel.Моя цель - сохранить изображения на моем компьютере.Эти изображения будут позже использованы для распознавания лиц.

Я создал код для открытия файла Excel и получения изображений.Однако это займет всего один лист, а не весь лист.

import face_recognition
import pandas as pd
import win32com.client as win32
from PIL import ImageGrab
import os

#Read working directory
print(os.getcwd()) #get current working directory
os.chdir("E:/DATA/Master data") #set working directory
print(os.getcwd())#check updated working directory

#Reading xlsx file in a folder
path1="E:/DATA/Master data"
files= os.listdir(path1)
print(files)
listlength = len(files)

#Extracting data from each xlsx file
for f in files:
    excel = win32.gencache.EnsureDispatch('Excel.Application')
    count=0
while (count<listlength):
    a = files.pop(count)
    path_name = path1 + "/" + a
    workbook = excel.Workbooks.Open(path_name)
    wb_folder = workbook.Path
    wb_name = workbook.Name
    wb_path = os.path.join(wb_folder, wb_name)
    for sheet in workbook.Worksheets:
        for i, shape in enumerate(sheet.Shapes):
            if shape.Name.startswith('Picture'):
                shape.Copy()
                image = ImageGrab.grabclipboard()
                image.save('{}.jpg'.format(i+1), 'jpeg')

Я ожидаю получить все изображения с каждого листа в нескольких файлах Excel.

1 Ответ

0 голосов
/ 05 июля 2019

Переменная i сбрасывается для каждого листа, поэтому имя вашего файла совпадает и, следовательно, файл перезаписывается.Добавьте вторую переменную, которая будет увеличиваться для каждого листа, чтобы имя файла также включало это.

Это проверено как работающее, я добавил excel.Visible, чтобы вы могли видеть всплывающие окна листов :) Также ведение журнала, чтобы вы могли видеть, чтопроисходит.Вместо использования глобальной переменной count я просто конкатенировал имя книги к имени листа, а затем использовал переменную "n" для каждого изображения листов.

import win32com.client as win32
from PIL import ImageGrab
import os

def ensureDirExists(filePath):
    if not os.path.exists(filePath):
        os.makedirs(filePath)

def absoluteListDir(directory):
   for dirpath,_,filenames in os.walk(directory):
       for f in filenames:
           yield os.path.abspath(os.path.join(dirpath, f))

dataDirectory = "data"
outputDirectory = "images"

ensureDirExists(dataDirectory)
ensureDirExists(outputDirectory)

excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True

files = absoluteListDir(dataDirectory)

for file in files:
    print("=" * 20)
    print("Opening Workbook: ", file)
    workbook = excel.Workbooks.Open(file)

    for sheet in workbook.Sheets:
        print("Scraping Sheet: ", sheet.Name)
        for n, shape in enumerate(sheet.Shapes):
            if shape.Name.startswith("Picture"):
                shape.Copy()
                image = ImageGrab.grabclipboard()
                outputFile = "{}/{}_{}_{}.jpg".format(outputDirectory, workbook.Name, sheet.Name, n)
                print("Saving Image File: ", outputFile)
                image.save(outputFile, "jpeg")

    print("Closing Workbook")
    workbook.Close(True)
...