Tworzenie prezentacji pptx

0

Cześć, w ramach ćwiczeń bawię się prezentacją w Pythonie. Mam już przygotowaną prezentacje, w niej są jakieś tabele i chce tam wrzucić tekst to tabeli a tekst pobiera z excela. Zapisuje prezentacje nazwą również pobraną z excela i wszystko fajnie działa. Teraz mnie zastanawia jak mogę zrobić żeby mi kilka prezentacji tworzył a nie tylko 1. Mam powiedzmy 5 wierszy w tabeli, w 1 kolumnie są nazwy jak mają się nazywać pliki .pptx a w drugiej kolumnie tekst jaki ma być umieszczony do tabeli. To mój kod

from pptx import Presentation
from pptx.util import Inches
from openpyxl import load_workbook
from pptx.util import Pt

wb = load_workbook('moje.xlsx')
ws = wb.active

prs = Presentation('moje.pptx')

slides = prs.slides
slide1 = slides[0]
j = 1
i = 2

for shape in slide1.shapes:
    if j == 1:
        x = str(ws.cell(i, 2).value)
        cos = 'robie co chce: ' +  x
        shape.text = cos
    for paragraph in shape.text_frame.paragraphs:
        for run in paragraph.runs:
            run.font.size = Pt(14)
            run.font.name = 'Arial'
    j = j + 1
value = str(ws.cell(i, 1). value)
prs.save("moje\\" + value + ".pptx")
0

Teraz mnie zastanawia jak mogę zrobić żeby mi kilka prezentacji tworzył a nie tylko 1. Mam powiedzmy 5 wierszy w tabeli, w 1 kolumnie są nazwy jak mają się nazywać pliki pptx a w drugiej kolumnie tekst jaki ma być umieszczony do tabeli.

Nie znam biblioteki, z której korzystasz, ale… co stoi na przeszkodzie, by to zrobić dokładnie tak, jak piszesz? Jakieś błędy się pojawiają, biblioteka ma wąty, coś innego?

0

@Althorion: musiałem chwilę pomyśleć, wystarczyło tylko pętle for dodać i nadaje nazwy plikom tak jak powinien natomiast tekst nie pobiera z innych komórek tylko cały czas z jednej i tej samej komórki. Teraz mam tak:

for i in range(2, ws.max_row+1):
    for shape in slide1.shapes:
        if j == 2:
            x = str(ws.cell(i, 2).value)
            cos = 'robie co chce: ' +  x
            shape.text = cos
        for paragraph in shape.text_frame.paragraphs:
            for run in paragraph.runs:
                run.font.size = Pt(14)
                run.font.name = 'Arial'
        j = j + 1
    value = str(ws.cell(i, 1). value)
    prs.save("moje\\" + value + ".pptx")
0

Dane bierzesz tu: x = str(ws.cell(i, 2).value). Nigdzie nie zmieniasz i, jest takie, jakie zrobiłeś na początku, więc i komórka ta sama. Uzależnij to od czego tam chcesz, to zacznie się zmieniać.

0

@Althorion: powiem Ci szczerze że kombinuje i jeszcze nie wiem jak to zrobić xd

0

Nie odkryłem jeszcze tego, co chcesz zrobić, ale Twój opis z pierwszego posta brzmiał dobrze. Zrób sobie tę tablicę taką jak chciałeś, iteruj w pętli po niej, używaj nazw do nadawania nazw i tekstu do wyznaczania tekstu — i tyle.

0

@Althorion: to i jest zdefiniowane tutaj for i in range(2, ws.max_row+1) więc nie rozumiem czemu to nie działa. Przecież to sprawia że odczytuje następne komórki

0

Weź sobie debugger, ustaw break point na x = str(ws.cell(i, 2).value) i przeleć przez ten kod, patrząc jak Ci się co zmienia, i czy robi, co chcesz. W szczególności, czy nie masz problemów z tym, że nie zmieniasz z powrotem j na jeden, czy ile byś tam chciał, więc masz tę wartość rosnącą w nieskończoność, więc do tego if j == 2: wejdziesz co najwyżej raz, co tłumaczy pojedynczy rezultat.

A przynajmniej tak to wygląda — może masz jakąś akcję na dystans, która to zmienia; trudno powiedzieć, nie pokazujesz nam całego kodu, ani nie wiem, jak wyglądają Twoje dane wejściowe. Ani, co już akurat jest po mojej stronie, nie wiem jak działa biblioteka z której korzystasz, może ona robi jakąś magię w tle…

0

prezentacja ma 1 slajd i jest pusta, ma tylko dwie tabele, daje j == 2 żeby wstawiał tekst do drugiej tabeli, w excelu
mam:
A1 - nazwa, B1 - tekst
A2 - nazwa pliku 1, B2 - jakis tekst 1
A3 - nazwa pliku 2, B3 - jakis tekst 2
kolumna A jest od nazywania pliku, kolumna B ma test który chce wstawić do drugiej tabeli w prezentacji pptx

To jest cały kod

from pptx import Presentation
from pptx.util import Inches
from openpyxl import load_workbook
from pptx.util import Pt

wb = load_workbook('moje.xlsx')
ws = wb.active

prs = Presentation('moje.pptx')

slides = prs.slides
slide1 = slides[0]
j = 1

for i in range(2, ws.max_row+1):
    for shape in slide1.shapes:
        if j == 2:
            x = str(ws.cell(i, 2).value)
            cos = 'robie co chce: ' +  x
            shape.text = cos
        for paragraph in shape.text_frame.paragraphs:
            for run in paragraph.runs:
                run.font.size = Pt(14)
                run.font.name = 'Arial'
        j = j + 1
    value = str(ws.cell(i, 1). value)
    prs.save("moje\\" + value + ".pptx")
0

No to tak jak pisałem. j Ci idzie tylko w górę. if j == 2: wykona się dokładnie raz. Wrzuć j = 1 do zewnętrznej pętli, powinno rozwiązać cały problem.

0

@Althorion: Rozwiązało problem xD myślałem że jak już wcześniej zdefiniowałem j = 1 to nie ma znaczenia czy będzie ten napis w pętli czy poza nią, a jednak ma. Dzięki za pomoc :)

1

No a ma — jak jest poza pętlą, to się wykona raz, jak jest w pętli, to z każdym jej przebiegiem. Jak się wykonuje z każdym przebiegiem, to każdy przebieg liczy od jedynki; a jak nie, to każdy przebieg kontynuuje liczenie od ostatniej wartości.

Obie rzeczy mogły mieć sens w różnych warunkach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1