Zarządzanie OLE w prezentacjach przy użyciu Pythona

Wprowadzenie

Na przykład wykres utworzony w Microsoft Excel i umieszczony na slajdzie PowerPoint jest obiektem OLE.

  • Obiekt OLE może wyświetlać się jako ikona. Dwukrotne kliknięcie ikony otwiera obiekt w powiązanej aplikacji (np. Excel) lub wyświetla monitek o wybranie aplikacji do otwarcia lub edycji.
  • Obiekt OLE może wyświetlać swoją zawartość (na przykład wykres). W takim przypadku PowerPoint aktywuje osadzony obiekt, ładuje interfejs wykresu i pozwala edytować dane wykresu w PowerPoint.

Aspose.Slides for Python umożliwia wstawianie obiektów OLE do slajdów jako ramki obiektów OLE (OleObjectFrame).

Dodawanie obiektów OLE do slajdów

Jeśli już utworzyłeś wykres w Microsoft Excel i chcesz osadzić go w slajdzie jako ramkę obiektu OLE przy użyciu Aspose.Slides for Python, wykonaj następujące kroki:

  1. Utwórz instancję klasy Presentation.
  2. Uzyskaj odwołanie do slajdu po jego indeksie.
  3. Odczytaj plik Excel do tablicy bajtów.
  4. Dodaj OleObjectFrame do slajdu, przekazując tablicę bajtów oraz inne szczegóły obiektu OLE.
  5. Zapisz zmodyfikowaną prezentację jako plik PPTX.

W poniższym przykładzie wykres z pliku Excel jest osadzony w slajdzie jako OleObjectFrame.

Uwaga: Konstruktor OleEmbeddedDataInfo przyjmuje rozszerzenie pliku osadzalnego obiektu jako drugi parametr. PowerPoint używa tego rozszerzenia, aby zidentyfikować typ pliku i wybrać odpowiednią aplikację do otwarcia obiektu OLE.

import aspose.slides as slides

with slides.Presentation() as presentation:
    slide_size = presentation.slide_size.size
    slide = presentation.slides[0]

    # Przygotuj dane dla obiektu OLE.
    with open("book.xlsx", "rb") as file_stream:
        file_data = file_stream.read()
        data_info = slides.dom.ole.OleEmbeddedDataInfo(file_data, "xlsx")

    # Dodaj ramkę obiektu OLE do slajdu.
    ole_frame = slide.shapes.add_ole_object_frame(0, 0, slide_size.width, slide_size.height, data_info)

    presentation.save("output.pptx", slides.export.SaveFormat.PPTX)

Dodawanie połączonych obiektów OLE

Aspose.Slides for Python umożliwia dodanie OleObjectFrame, który łączy się z plikiem zamiast osadzać jego dane.

Poniższy przykład w Pythonie pokazuje, jak dodać OleObjectFrame, połączony z plikiem Excel na slajdzie:

import aspose.slides as slides

with slides.Presentation() as presentation:
    slide = presentation.slides[0]

    # Dodaj ramkę obiektu OLE z połączonym plikiem Excel.
    slide.shapes.add_ole_object_frame(20, 20, 200, 150, "Excel.Sheet.12", "book.xlsx")

    presentation.save("output.pptx", slides.export.SaveFormat.PPTX)

Dostęp do obiektów OLE

Jeśli obiekt OLE jest już osadzony w slajdzie, możesz uzyskać do niego dostęp w następujący sposób:

  1. Załaduj prezentację zawierającą osadzony obiekt OLE, tworząc instancję klasy Presentation.
  2. Uzyskaj odwołanie do slajdu po jego indeksie.
  3. Uzyskaj dostęp do kształtu OleObjectFrame.
  4. Gdy masz już ramkę obiektu OLE, wykonaj na niej wszelkie wymagane operacje.

Poniższy przykład uzyskuje dostęp do ramki obiektu OLE — osadzonego wykresu Excel — i pobiera jego dane pliku. W tym przykładzie używamy PPTX, który ma pojedynczy kształt na pierwszym slajdzie.

import aspose.slides as slides

with slides.Presentation("sample.pptx") as presentation:
    slide = presentation.slides[0]
    shape = slide.shapes[0]

    if isinstance(shape, slides.OleObjectFrame):
        ole_frame = shape

        # Pobierz dane osadzonego pliku.
        file_data = ole_frame.embedded_data.embedded_file_data

        # Pobierz rozszerzenie osadzonego pliku.
        file_extension = ole_frame.embedded_data.embedded_file_extension

        # ...

Dostęp do właściwości połączonego obiektu OLE

Aspose.Slides umożliwia dostęp do właściwości połączonej ramki obiektu OLE.

Poniższy przykład w Pythonie sprawdza, czy obiekt OLE jest połączony i, jeśli tak, pobiera ścieżkę do połączonego pliku:

import aspose.slides as slides

with slides.Presentation("sample.ppt") as presentation:
    slide = presentation.slides[0]
    shape = slide.shapes[0]

    if isinstance(shape, slides.OleObjectFrame):
        ole_frame = shape

        # Sprawdź, czy obiekt OLE jest połączony.
        if ole_frame.is_object_link:
            # Wypisz pełną ścieżkę do połączonego pliku.
            print("OLE object frame is linked to:", ole_frame.link_path_long)

            # Wypisz ścieżkę względną do połączonego pliku, jeśli jest dostępna.
            # Tylko prezentacje .ppt mogą zawierać ścieżkę względną.
            if ole_frame.link_path_relative:
                print("OLE object frame relative path:", ole_frame.link_path_relative)

Zmiana danych obiektu OLE

Jeśli obiekt OLE jest już osadzony w slajdzie, możesz uzyskać do niego dostęp i zmodyfikować jego dane w następujący sposób:

  1. Załaduj prezentację, tworząc instancję klasy Presentation.
  2. Uzyskaj docelowy slajd po jego indeksie.
  3. Uzyskaj dostęp do kształtu OleObjectFrame.
  4. Gdy masz już ramkę obiektu OLE, wykonaj wymagane operacje na niej.
  5. Utwórz obiekt Workbook i odczytaj dane OLE.
  6. Otwórz żądany Worksheet i edytuj dane.
  7. Zapisz zaktualizowany Workbook do strumienia.
  8. Zamień dane obiektu OLE przy użyciu tego strumienia.

W poniższym przykładzie ramka obiektu OLE (osadzony wykres Excel) jest dostępna i jej dane pliku są modyfikowane w celu aktualizacji wykresu. Przykład używa wcześniej utworzonego PPTX, który zawiera pojedynczy kształt na pierwszym slajdzie.

import io
import aspose.slides as slides
import aspose.cells as cells

with slides.Presentation("sample.pptx") as presentation:
    slide = presentation.slides[0]
    shape = slide.shapes[0]

    if isinstance(shape, slides.OleObjectFrame):
        ole_frame = shape

        with io.BytesIO(ole_frame.embedded_data.embedded_file_data) as ole_stream:
            # Odczytaj dane obiektu OLE jako obiekt Workbook.
            workbook = cells.Workbook(ole_stream)

        with io.BytesIO() as new_ole_stream:
            # Modyfikuj dane skoroszytu.
            workbook.worksheets.get(0).cells.get(0, 4).put_value("E")
            workbook.worksheets.get(0).cells.get(1, 4).put_value(12)
            workbook.worksheets.get(0).cells.get(2, 4).put_value(14)
            workbook.worksheets.get(0).cells.get(3, 4).put_value(15)

            file_options = cells.OoxmlSaveOptions(cells.SaveFormat.XLSX)
            workbook.save(new_ole_stream, file_options)

            # Zmień dane obiektu ramki OLE.
            new_data = slides.dom.ole.OleEmbeddedDataInfo(new_ole_stream.getvalue(), ole_frame.embedded_data.embedded_file_extension)
            ole_frame.set_embedded_data(new_data)

    presentation.save("output.pptx", slides.export.SaveFormat.PPTX)

Osadzanie plików w slajdach

Oprócz wykresów Excel, Aspose.Slides for Python umożliwia osadzanie w slajdach innych typów plików. Na przykład możesz wstawiać pliki HTML, PDF i ZIP jako obiekty. Gdy użytkownik dwukrotnie kliknie wstawiony obiekt, otwiera się automatycznie w powiązanej aplikacji lub wyświetla się monit o wybranie odpowiedniego programu.

Ten kod w Pythonie pokazuje, jak osadzić pliki HTML i ZIP w slajdzie:

import aspose.slides as slides

with slides.Presentation() as presentation:
    slide = presentation.slides[0]

    with open("sample.html", "rb") as html_stream:
        html_data = html_stream.read()

    html_data_info = slides.dom.ole.OleEmbeddedDataInfo(html_data, "html")
    html_ole_frame = slide.shapes.add_ole_object_frame(150, 120, 50, 50, html_data_info)
    html_ole_frame.is_object_icon = True

    with open("sample.zip", "rb") as zip_stream:
        zip_data = zip_stream.read()

    zip_data_info = slides.dom.ole.OleEmbeddedDataInfo(zip_data, "zip")
    zip_ole_frame = slide.shapes.add_ole_object_frame(150, 220, 50, 50, zip_data_info)
    zip_ole_frame.is_object_icon = True

    presentation.save("output.pptx", slides.export.SaveFormat.PPTX)

Ustawianie typów plików dla osadzonych obiektów

Pracując z prezentacjami, możesz potrzebować zamienić stare obiekty OLE na nowe lub zastąpić nieobsługiwany obiekt OLE obsługiwanym. Aspose.Slides for Python pozwala ustawić typ pliku osadzonego obiektu, umożliwiając aktualizację danych ramki OLE lub jej rozszerzenia pliku.

Ten kod w Pythonie pokazuje, jak ustawić typ pliku osadzonego obiektu OLE na zip:

import aspose.slides as slides

with slides.Presentation("sample.pptx") as presentation:
    slide = presentation.slides[0]
    ole_frame = slide.shapes[0]

    file_extension = ole_frame.embedded_data.embedded_file_extension
    file_data = ole_frame.embedded_data.embedded_file_data

    print(f"Current embedded file extension is: {file_extension}")

    # Zmień typ pliku na ZIP.
    ole_frame.set_embedded_data(slides.dom.ole.OleEmbeddedDataInfo(file_data, "zip"))

    presentation.save("output.pptx", slides.export.SaveFormat.PPTX)

Ustawianie obrazów ikon i tytułów dla osadzonych obiektów

Po osadzeniu obiektu OLE automatycznie dodawane jest podgląd oparty na ikonie. Ten podgląd widzą użytkownicy przed dostępem lub otwarciem obiektu OLE. Jeśli chcesz użyć konkretnego obrazu i tekstu w podglądzie, możesz ustawić obraz ikony i tytuł przy użyciu Aspose.Slides for Python.

Ten kod w Pythonie pokazuje, jak ustawić obraz ikony i tytuł dla osadzonego obiektu:

import aspose.slides as slides

with slides.Presentation("sample.pptx") as presentation:
    slide = presentation.slides[0]
    ole_frame = slide.shapes[0]

    # Dodaj obraz do zasobów prezentacji.
    with slides.Images.from_file("image.png") as image:
        ole_image = presentation.images.add_image(image)

    # Ustaw tytuł i obraz dla podglądu OLE.
    ole_frame.substitute_picture_title = "My title"
    ole_frame.substitute_picture_format.picture.image = ole_image
    ole_frame.is_object_icon = True

    presentation.save("output.pptx", slides.export.SaveFormat.PPTX)

Zapobieganie zmianie rozmiaru i położenia ramki obiektu OLE

Po dodaniu połączonego obiektu OLE do slajdu PowerPoint może wyświetlić monitek o aktualizację łączy przy otwieraniu prezentacji. Wybranie Aktualizuj łącza może zmienić rozmiar i położenie ramki obiektu OLE, ponieważ PowerPoint odświeża podgląd danymi z połączonego obiektu. Aby zapobiec wyświetlaniu monitu o aktualizację danych obiektu, ustaw właściwość update_automatic klasy OleObjectFrame na False:

import aspose.slides as slides

with slides.Presentation("sample.pptx") as presentation:
    slide = presentation.slides[0]
    ole_frame = slide.shapes[0]

    ole_frame.update_automatic = False

    presentation.save("output.pptx", slides.export.SaveFormat.PPTX)

Wyodrębnianie osadzonych plików

Aspose.Slides for Python umożliwia wyodrębnianie plików osadzonych w slajdach jako obiekty OLE w następujący sposób:

  1. Utwórz instancję klasy Presentation, która zawiera obiekty OLE, które chcesz wyodrębnić.
  2. Przejdź po wszystkich kształtach w prezentacji i znajdź kształty OLEObjectFrame.
  3. Pobierz dane osadzonego pliku z każdego OLEObjectFrame i zapisz je na dysku.

Poniższy kod w Pythonie pokazuje, jak wyodrębnić pliki osadzone w slajdzie jako obiekty OLE:

import aspose.slides as slides

with slides.Presentation("sample.pptx") as presentation:
    slide = presentation.slides[0]

    for index, shape in enumerate(slide.shapes):
        if isinstance(shape, slides.OleObjectFrame):
            ole_frame = shape

            file_data = ole_frame.embedded_data.embedded_file_data
            file_extension = ole_frame.embedded_data.embedded_file_extension

            file_path = f"OLE_object_{index}{file_extension}"
            with open(file_path, 'wb') as file_stream:
                file_stream.write(file_data)

FAQ

Czy zawartość OLE zostanie wyrenderowana podczas eksportowania slajdów do PDF/obrazów?

To, co jest widoczne na slajdzie, jest renderowane — ikona/obraz zastępczy (podgląd). „Żywa” zawartość OLE nie jest wykonywana podczas renderowania. W razie potrzeby ustaw własny obraz podglądu, aby zapewnić oczekiwany wygląd w wyeksportowanym PDF.

Aby także zachować osadzony plik jako załącznik PDF, ustaw PdfOptions.include_ole_data na True. Opcja ta jest domyślnie wyłączona. Przykład i instrukcje sprawdzania załącznika znajdziesz w Zachowaj osadzone pliki OLE jako załączniki PDF.

Jak mogę zablokować obiekt OLE na slajdzie, aby użytkownicy nie mogli go przesuwać/edytować w PowerPoint?

Zablokuj kształt: Aspose.Slides udostępnia blokady na poziomie kształtu. To nie jest szyfrowanie, ale skutecznie zapobiega przypadkowym edycjom i przesuwaniu.

Dlaczego połączony obiekt Excel “przeskakuje” lub zmienia rozmiar po otwarciu prezentacji?

PowerPoint może odświeżyć podgląd połączonego OLE. Aby uzyskać stabilny wygląd, stosuj praktyki z Working Solution for Worksheet Resizing — dopasuj ramkę do zakresu lub przeskaluj zakres do stałej ramki i ustaw odpowiedni obraz zastępczy.

Czy ścieżki względne połączonych obiektów OLE będą zachowane w formacie PPTX?

W PPTX informacje o „ścieżkach względnych” nie są dostępne — tylko pełna ścieżka. Ścieżki względne występują w starszym formacie PPT. Dla przenośności lepiej używać pewnych ścieżek bezwzględnych/dostępnych URI lub osadzania.