Можем ли мы получить доступ и заменить изображение в формате xlsx? - PullRequest
0 голосов
/ 29 сентября 2018

Я пишу сценарий для автоматизации процесса, который требует обновления файла Excel, а затем построения графика на основе некоторых данных, присутствующих в файле Excel, а затем вставки графика в тот же файл Excel.Я использовал openpyxl для чтения и записи файла Excel, а затем использовал matplotlib для рисования графика для данных, а затем вставил график в тот же файл Excel.Данные в файле Excel обновляются один или два раза в неделю.Каждый раз, когда данные обновляются, мне нужно построить обновленный график и вставить график в файл Excel. Прямо сейчас мой скрипт автоматически обновляет значения в файле Excel и строит график для обновленных данных, но когда я вставляю график, он неперезаписывает предыдущий график, он каждый раз добавляет график над предыдущим графиком, из-за чего размер файла Excel будет увеличиваться.

Сейчас код, который я использую для построения и вставки графика в файл Excelis-

fig = plt.figure(figsize=(8,4)) 
PLT = fig.add_axes([0.04, 0.08, 0.79, 0.8]) 

plt.xlabel("WORKING WEEK (WW)",fontsize=7)
plt.ylabel("UTILIZATION [%]",fontsize=7)
plt.title("PATCH UTILIZATION",fontsize=9)
#PLT.subplots_adjust(right=0.8)
for i in range(len(p)):
    PLT.plot(x,p[i],label = '%s'%row[0],marker="s",markersize=2)
PLT.legend(bbox_to_anchor=(1.21,1),borderaxespad=0,prop={'size':6})
PLT.tick_params(axis='both', which='major', labelsize=4)
plt.savefig("myplot.png",dpi=160)
wb=load_workbook('Excel.xlsm',read_only=False,keep_vba=True)
ws=wb['Patch Util']
img = openpyxl.drawing.image.Image("myplot.png")
img.anchor='D50'
ws.add_image(img)
wb.save('Excel.xlsm')

«x» и «p» - это два списка (p - это список списков), которые содержат данные и будут обновляться при обновлении данных в файле Excel.

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

Будет очень полезно, если кто-нибудь сможет мне помочь с этим

1 Ответ

0 голосов
/ 02 октября 2018

Комментарий : Нет .. Я использую 2.5.6 версию , и в моем случае все графики и диаграммы сохраняются

Показатьмне выводится следующее:

from openpyxl import load_workbook

wb = load_workbook(<your file path>)
ws = wb.worksheets[<your sheet index>]

for image in ws._images:
    print("_id:{}, img.path:{}".format(image._id, image.path))

Комментарий : вывод, который я получил, - _id:1, img.path:/xl/media/image1.png


Вопрос : Можем ли мы получить доступ и заменить изображение в формате xlsx

Вы можете сделать это, заменив Image object в ws._images.Для в первый раз вы должны инициализировать данные ref, делая это как обычно, используя ws.add_image(...).Если изображение существует len(ws._images) == 1, вы можете заменить его новым Image object.
Например:

if len(ws._images) == 0:
    # Initalise the `ref` data, do ws.add_image(...)   
    img = openpyxl.drawing.image.Image("myplot.png")
    img.anchor='D50'
    ws.add_image(img)

elif len(ws._images) == 1:
    # Replace the first image do **only** the following:
    ws._images[0] = openpyxl.drawing.image.Image("myplot.png")
    # Update the default anchor `A1` to your needs
    ws._images[0].anchor='D50'
else:
    raise(ValueError, "Found more than 1 Image!")

Примечание : Вы используете Частная собственность класса , это может привести к неожиданному побочному эффекту.

Работа с openpyxl Версия 2.5.6

...