我需要将多个 Excel 表格作为高分辨率 EMF 图像移动到多个 powerpoint 中。我无法将数据链接到 powerpoint,因为我需要从源自单个 Excel 模板的 400 多个不同 Excel 模型更新 400 多个不同的 powerpoint,而 VBA 不是一个选项。所有的幻灯片和 Excel 模型的格式和布局都完全相同。下面的代码可以工作,但是粘贴到 PowerPoint 中的图像的分辨率太低,我不知道如何提高它。
import win32com.client as win32
from pptx import Presentation
from PIL import ImageGrab, Image
import os
modelPath = "P:/Folder"
FileName = "XXXX.xlsx"
outT = "P:/Folder/Charts"
cellRange = 'A1:C10'
sheetName = 'Norm'
o = win32com.client.Dispatch('Excel.Application')
wb = o.Workbooks.Open(modelPath +"/"+FileName)
wsT = wb.Worksheets['Norm']
# Grab Table
wsT.Range(wsT.Cells(4,3),wsT.Cells(41,8)).CopyPicture(Format = 2)
imgEMF = ImageGrab.grabclipboard()
imgFile = os.path.join(outT,'norm.emf')
imgEMF.save(imgFile, 'PNG', compress_level=0, dpi=(5000, 5000))
t=ImageGrab.grabclipboard()
# remove old tables
pres = Presentation("Test.pptx") # name of existing pptx
t = [26, 28, 31, 33, 34]
for i in t:
slides = pres.slides[i]
shapes = slides.shapes
for shape in shapes:
if shape.shape_type == 13 or shape.shape_type == 1:
shapes.element.remove(shape.element)
#add new tables
slide = pres.slides[31]
slide.shapes.add_picture(out+'/norm.emf', left = Inches(0.41), top = Inches(2.25), width = Inches(6.17), height = Inches(3.0))
# I cut all but one table from the code
pres.save('Test6.pptx')
遇到的问题是,没有使用 EMF 文件格式提供的分辨率优势。当前的代码首先将 Excel 表格复制为 EMF(这很好),但随后使用 PIL 将其保存为 PNG 文件。此步骤会降低图像分辨率,因为 PNG 是光栅格式,而 EMF 是矢量格式。
以下是如何改进代码的方法:
-
直接将 EMF 粘贴到 PowerPoint 中,无需中间 PNG 保存。 win32com API 允许直接粘贴剪贴板内容,无需保存为文件。
-
使用
Shapes.AddPicture
方法并指定.emf
文件。 此方法可以很好地处理 EMF 文件,并且不会以 PIL 的方式降低分辨率。
以下是更新后的代码:
import win32com.client as win32
from pptx import Presentation
import os
modelPath = "P:/Folder"
FileName = "XXXX.xlsx"
outT = "P:/Folder/Charts"
cellRange = 'A1:C10'
sheetName = 'Norm'
o = win32com.client.Dispatch('Excel.Application')
wb = o.Workbooks.Open(modelPath +"/"+FileName)
wsT = wb.Worksheets['Norm']
# Grab Table
wsT.Range(wsT.Cells(4,3),wsT.Cells(41,8)).CopyPicture(Format = 2)
# remove old tables
pres = Presentation("Test.pptx")
t = [26, 28, 31, 33, 34]
for i in t:
slides = pres.slides[i]
shapes = slides.shapes
for shape in shapes:
if shape.shape_type == 13 or shape.shape_type == 1:
shapes.element.remove(shape.element)
#add new tables
slide = pres.slides[31]
slide.shapes.add_picture(os.path.join(outT,'norm.emf'), left = Inches(0.41), top = Inches(2.25), width = Inches(6.17), height = Inches(3.0))
pres.save('Test6.pptx')
代码说明:
-
我们删除了所有与
PIL
相关的代码,因为我们不再需要将图像保存为 PNG。 -
在
add_picture
方法中,我们现在直接使用存储在outT
文件夹中的norm.emf
文件的路径。
通过这些更改,应该能够将 Excel 表格作为高分辨率 EMF 图像直接插入到 PowerPoint 演示文稿中,而不会损失质量。
标签:python,excel,powerpoint From: 78813190