2016-07-21 5 views
2

私はpythonのxlrdとpptxを使って各ブックをディレクトリに読み込んで、各シートの情報をPowerPointスライドのテーブルに読み込むスクリプトを書いています。 Excelテーブルが小さくてもうまくいきますが、これらのExcelファイルに何が含まれるかわかりません。行数と列数が多すぎると判読不能になります。私の主な問題は、Excelファイルにセルの代わりにグラフがあり、スクリプトがそれを読み取れなかったときに発生しました。だから私は、ドキュメントを開いてスクリーンショットを撮るためにpyscreenshotを使ってみましたが、これは遅くて不必要なようです。私はExcelのように正確にスライドを作ってみたいが、物を追加したり変更したりできる。ExcelからPowerPointへの情報をPythonを使用して取得し、その形式を維持するにはどうすればよいですか?

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() 

答えて

2

さて、あなたは、ハードの問題を選択しました。私が努力を放棄し終えたこの種のことを私が試みたことは確かです。

私が形成した根本的な説明は、Excel(とWord)が "流された"ドキュメント環境だということでした。つまり、1ページで部屋を使い果たすと、次のページに移動します。一方、PowerPointは、ページ単位の展示用レイアウト環境です。各スライドは残りの部分とは独立しています(スライドを自由に並べ替えることができることが証明されています)。各スライドは一度にすべて表示され、スクロールされません。これにより、各スライドは自己完結型になります。つまり、単一の「ページ」に制約されています。

スライドに配置できる情報の量には限界があり、それでも通信するには限界があります。一般的にはそれほど良くありません。私は、効果的な「ダッシュボード」スライドには非常に巧みなレイアウトとコンテンツ長の極端な抑制が必要で、おそらく特定の(人間の)要約作業を必要とすると結論付けました。 「データベース」からコピーするだけです)。

グラフのビットについては、理論的にはPowerPointに移動できますが、私はそれも完了したと見ていますが、技術的には非常に困難です。 Python-pptxにはAPIのサポートはありません。 This historical issue on the GitHub repoは、何が関係しているかをいくつか考えているかもしれません。私が期待しているかすかな心のためではありません:)

関連する問題