2016-07-21 3 views
2

Ich habe ein Skript mit python xlrd und pptx geschrieben, um jede Arbeitsmappe in einem Verzeichnis zu lesen und Informationen aus jedem Blatt in eine Tabelle in einer PowerPoint-Folie zu ziehen. Es funktioniert in Ordnung, wenn die Excel-Tabelle klein ist, aber ich weiß nicht, was in diesen Excel-Dateien sein wird. Es wird unlesbar, wenn zu viele Zeilen und Spalten vorhanden sind. Mein Hauptproblem entstand, wenn eine Excel-Datei Graphen anstelle von Zellen hatte und das Skript sie nicht lesen konnte. Also habe ich versucht mit pyscreenshot das Dokument zu öffnen und einen Screenshot zu machen, aber das scheint langsam und unnötig. Ich möchte eine Folie in PowerPoint so aussehen lassen, wie sie in Excel aussehen würde, aber mit der Fähigkeit, Dinge hinzuzufügen und zu ändern.Wie kann ich Informationen aus Excel mit Python in PowerPoint ziehen und das Format beibehalten?

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) 

Und das ist mein Screenshot Skript:

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

Antwort

2

Nun, haben Sie ein hartes Problem gewählt. Sicher habe ich all die Male, die ich versucht habe, die Bemühungen aufgegeben.

Die grundlegende Erklärung, die ich bildete, war, dass Excel (und Word) "geflossene" Dokumentumgebungen sind. Das heißt, wenn Sie auf einer Seite keinen Platz mehr haben, geht es zum nächsten. PowerPoint dagegen ist eine Seite-für-Seite-Layoutumgebung. Jede Folie ist unabhängig von dem Rest (belegt durch die Fähigkeit, die Folien frei zu ordnen), wobei jede Folie auf einmal gezeigt und nicht gescrollt werden soll. Dies führt dazu, dass jede Folie in sich abgeschlossen ist, was bedeutet, dass sie auf eine einzelne "Seite" beschränkt ist.

Es gibt eine Grenze dafür, wie viele Informationen man auf eine Folie legen kann und trotzdem kommunizieren kann. Generell ist weniger besser. Also, es ist vielleicht keine Überraschung, dass all meine frühen Bemühungen frustriert endeten. Ich kam auch zu dem Schluss, dass eine effektive "Dashboard" Folie sehr geschickte Layout und extreme Zurückhaltung bei der Inhaltslänge erfordern würde und wahrscheinlich eine spezifische (menschliche) Verdichtung erforderte nur Kopieren von einer "Datenbank").

In Bezug auf die Charts Bit, können diese theoretisch nach PowerPoint verschoben werden und ich habe es sogar gesehen, aber es ist technisch ziemlich herausfordernd. In python-pptx gibt es dafür keine API-Unterstützung. This historical issue on the GitHub repo kann eine Idee geben, was involviert war. Nicht für schwache Nerven, die ich erwarte :)

Verwandte Themen