如何使用Python将信息从Excel提取到PowerPoint并保留格式?

时间:2016-07-21 08:44:35

标签: python excel powerpoint

我用python的xlrd和pptx编写了一个脚本来读取目录中的每个工作簿,并将每个工作表中的信息提取到PowerPoint幻灯片中的表格中。如果excel表很小但是我不知道这些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()

1 个答案:

答案 0 :(得分:3)

嗯,你选择了一个难题。当然,我一直试图尝试这种事情,但我最终放弃了努力。

我形成的基本解释是Excel(和Word)是"流动"文档环境。也就是说,当你在一个页面上用完房间时,它会流向下一个页面。另一方面,PowerPoint是一个逐页的展览布局环境。每张幻灯片都独立于其他幻灯片(可以自由重新排序幻灯片的证明),每个幻灯片都要一次显示,而不是滚动。这导致每张幻灯片都是独立的,这意味着只限于一个页面"

可以在幻灯片上放置多少信息并且仍然可以进行通信,这是一个限制。通常越少越好。所以,也许这并不奇怪,我早期的努力在那里以挫折结束:)我还得出结论,一个有效的"仪表板"幻灯片需要非常熟练的布局,并且对内容长度有极大的限制,可能需要特定的(人工)摘要工作(而不仅仅是从数据库中复制")。

关于图表位,那些理论上可以转移到PowerPoint,我甚至已经看过它,但它在技术上相当具有挑战性。 python-pptx中没有API支持。 This historical issue on the GitHub repo可能会了解所涉及的内容。不是因为我期待的胆小的心脏:)