如何使用 Python 将信息从 Excel 提取到 PowerPoint 中并保持格式?
How can I pull information from Excel into PowerPoint using Python and keep the format?
我用 python 的 xlrd 和 pptx 编写了一个脚本来读取目录中的每个工作簿并将每个 sheet 中的信息提取到 PowerPoint 幻灯片中的 table .如果 excel table 很小,但我不知道这些 excel 文件中会有什么。当行和列太多时,它变得难以辨认。当 excel 文件包含图形而不是单元格并且脚本无法读取时,我的主要问题就出现了。所以我尝试使用 pyscreenshot 打开文档并截取屏幕截图,但这似乎很慢而且没有必要。我想让 PowerPoint 中的幻灯片看起来与在 excel 中完全一样,但能够添加和更改内容。
import libraries and modules
import xlrd
from pptx import Presentation
from pptx.util import Inches, Pt
import time
import glob
import os
start = time.time()
prs = Presentation()
title_slide_layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(title_slide_layout)
shapes = slide.shapes
title = slide.shapes.title
subtitle = slide.placeholders[1]
title.text = "Dashboard Generator"
subtitle.text = "made with Python-pptx and xlrd"
for filename in glob.glob(os.path.join("C:/Users/penelope/Desktop/PMO/myfiles/", '*.xlsx')):
print(filename)
file_location = filename
try:
workbook = xlrd.open_workbook(file_location)
nsheets = workbook.nsheets
for n in range(0, nsheets):
sheet = workbook.sheet_by_index(n)
print("sheet:", sheet)
rows = sheet.nrows
cols = sheet.ncols
c = cols
r = rows
if c > 0:
print(c, r)
slide = prs.slides.add_slide(prs.slide_layouts[5])
shapes = slide.shapes
title = slide.shapes.title
title.text = "Table testing"
left = Inches(0.0)
top = Inches(2.0)
width = Inches(6.0)
height = Inches(4.0)
num = 10.0/c
table = shapes.add_table(rows, cols, left, top, width, height).table
for i in range(0, c):
table.columns[i].width = Inches(num)
for i in range(0,r):
for e in range(0,c):
table.cell(i,e).text = str(sheet.cell_value(i,e))
cell = table.rows[i].cells[e]
paragraph = cell.text_frame.paragraphs[0]
paragraph.font.size = Pt(11)
except:
print("Error!")
pass
prs.save('powerpointfile1.pptx')
end = time.time()
print(end - start)
这是我的截图脚本:
import os
import time
import pyscreenshot as ImageGrab
from PIL import Image
if __name__ == "__main__":
os.system('start excel.exe "C:/Users/penelope/Desktop/PMO/TestCase.xlsx"')
time.sleep(3)
im=ImageGrab.grab(bbox=(24,210,1800,990))
im.save("image7.png")
img = Image.open('image7.png')
img.show()
好吧,你选择了一个难题。当然,我每次都尝试过这种事情,但最终都放弃了。
我形成的基本解释是 Excel(和 Word)是 "flowed" 文档环境。也就是说,当您 运行 一页上的空间不足时,它会流到下一页。另一方面,PowerPoint 是逐页显示布局环境。每张幻灯片都独立于其余幻灯片(可以自由重新排序幻灯片的能力证明),每张幻灯片都意味着一次全部显示,而不是滚动。这导致每张幻灯片都是独立的,这意味着仅限于单个 "page".
可以在幻灯片上放置多少信息并使其仍能传达信息是有限制的。一般越少越好。所以,也许我早期的所有努力都以挫折告终并不奇怪 :) 我还得出结论,有效的 "dashboard" 幻灯片需要非常巧妙的布局,并对内容长度进行极端限制,可能需要特定的(人工)总结工作(不只是从 "database" 复制)。
关于图表部分,理论上可以将其转移到PowerPoint中,我什至看到它完成了,但这在技术上非常具有挑战性。在 python-pptx 中没有 API 支持。 This historical issue on the GitHub repo 可能会给出一些想法。我希望胆小的人不适合:)
我用 python 的 xlrd 和 pptx 编写了一个脚本来读取目录中的每个工作簿并将每个 sheet 中的信息提取到 PowerPoint 幻灯片中的 table .如果 excel table 很小,但我不知道这些 excel 文件中会有什么。当行和列太多时,它变得难以辨认。当 excel 文件包含图形而不是单元格并且脚本无法读取时,我的主要问题就出现了。所以我尝试使用 pyscreenshot 打开文档并截取屏幕截图,但这似乎很慢而且没有必要。我想让 PowerPoint 中的幻灯片看起来与在 excel 中完全一样,但能够添加和更改内容。
import libraries and modules
import xlrd
from pptx import Presentation
from pptx.util import Inches, Pt
import time
import glob
import os
start = time.time()
prs = Presentation()
title_slide_layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(title_slide_layout)
shapes = slide.shapes
title = slide.shapes.title
subtitle = slide.placeholders[1]
title.text = "Dashboard Generator"
subtitle.text = "made with Python-pptx and xlrd"
for filename in glob.glob(os.path.join("C:/Users/penelope/Desktop/PMO/myfiles/", '*.xlsx')):
print(filename)
file_location = filename
try:
workbook = xlrd.open_workbook(file_location)
nsheets = workbook.nsheets
for n in range(0, nsheets):
sheet = workbook.sheet_by_index(n)
print("sheet:", sheet)
rows = sheet.nrows
cols = sheet.ncols
c = cols
r = rows
if c > 0:
print(c, r)
slide = prs.slides.add_slide(prs.slide_layouts[5])
shapes = slide.shapes
title = slide.shapes.title
title.text = "Table testing"
left = Inches(0.0)
top = Inches(2.0)
width = Inches(6.0)
height = Inches(4.0)
num = 10.0/c
table = shapes.add_table(rows, cols, left, top, width, height).table
for i in range(0, c):
table.columns[i].width = Inches(num)
for i in range(0,r):
for e in range(0,c):
table.cell(i,e).text = str(sheet.cell_value(i,e))
cell = table.rows[i].cells[e]
paragraph = cell.text_frame.paragraphs[0]
paragraph.font.size = Pt(11)
except:
print("Error!")
pass
prs.save('powerpointfile1.pptx')
end = time.time()
print(end - start)
这是我的截图脚本:
import os
import time
import pyscreenshot as ImageGrab
from PIL import Image
if __name__ == "__main__":
os.system('start excel.exe "C:/Users/penelope/Desktop/PMO/TestCase.xlsx"')
time.sleep(3)
im=ImageGrab.grab(bbox=(24,210,1800,990))
im.save("image7.png")
img = Image.open('image7.png')
img.show()
好吧,你选择了一个难题。当然,我每次都尝试过这种事情,但最终都放弃了。
我形成的基本解释是 Excel(和 Word)是 "flowed" 文档环境。也就是说,当您 运行 一页上的空间不足时,它会流到下一页。另一方面,PowerPoint 是逐页显示布局环境。每张幻灯片都独立于其余幻灯片(可以自由重新排序幻灯片的能力证明),每张幻灯片都意味着一次全部显示,而不是滚动。这导致每张幻灯片都是独立的,这意味着仅限于单个 "page".
可以在幻灯片上放置多少信息并使其仍能传达信息是有限制的。一般越少越好。所以,也许我早期的所有努力都以挫折告终并不奇怪 :) 我还得出结论,有效的 "dashboard" 幻灯片需要非常巧妙的布局,并对内容长度进行极端限制,可能需要特定的(人工)总结工作(不只是从 "database" 复制)。
关于图表部分,理论上可以将其转移到PowerPoint中,我什至看到它完成了,但这在技术上非常具有挑战性。在 python-pptx 中没有 API 支持。 This historical issue on the GitHub repo 可能会给出一些想法。我希望胆小的人不适合:)