Zarządzanie OLE w prezentacjach przy użyciu Javy
Wprowadzenie
Note
OLE (Object Linking & Embedding) to technologia firmy Microsoft, która umożliwia umieszczanie danych i obiektów utworzonych w jednej aplikacji w innej aplikacji poprzez łączenie lub osadzanie.Rozważmy wykres utworzony w programie MS Excel. Wykres ten jest następnie umieszczany na slajdzie PowerPointa. Ten wykres Excel jest uważany za obiekt OLE.
- Obiekt OLE może być wyświetlany jako ikona. W takim przypadku, po dwukrotnym kliknięciu ikony, wykres otwiera się w skojarzonej aplikacji (Excel) lub użytkownik zostaje poproszony o wybranie aplikacji do otwarcia lub edycji obiektu.
- Obiekt OLE może wyświetlać rzeczywistą zawartość, np. zawartość wykresu. W tym przypadku wykres jest aktywowany w PowerPoint, ładuje się interfejs wykresu i można modyfikować dane wykresu bezpośrednio w PowerPoint.
Aspose.Slides for Java umożliwia wstawianie obiektów OLE do slajdów jako ramki obiektów OLE (OleObjectFrame).
Dodaj ramki obiektów OLE do slajdów
Zakładając, że już utworzyłeś wykres w Microsoft Excel i chcesz go osadzić w slajdzie jako ramkę obiektu OLE przy użyciu Aspose.Slides for Java, możesz to zrobić w następujący sposób:
- Utwórz instancję klasy Presentation .
- Pobierz odniesienie do slajdu za pomocą jego indeksu.
- Odczytaj plik Excel jako tablicę bajtów.
- Dodaj OleObjectFrame do slajdu, przekazując tablicę bajtów oraz inne informacje o obiekcie OLE.
- Zapisz zmodyfikowaną prezentację jako plik PPTX.
W przykładowym kodzie poniżej dodaliśmy wykres z pliku Excel do slajdu jako ramkę obiektu OLE przy użyciu Aspose.Slides for Java. Uwaga że konstruktor OleEmbeddedDataInfo przyjmuje rozszerzenie obiektu osadzalnego jako drugi parametr. To rozszerzenie pozwala PowerPointowi prawidłowo zinterpretować typ pliku i wybrać odpowiednią aplikację do otwarcia tego obiektu OLE.
import com.aspose.slides.*;
import java.awt.geom.Dimension2D;
import java.nio.file.Files;
import java.nio.file.Paths;
Presentation presentation = new Presentation();
Dimension2D slideSize = presentation.getSlideSize().getSize();
ISlide slide = presentation.getSlides().get_Item(0);
// Przygotuj dane dla obiektu OLE.
byte[] fileData = Files.readAllBytes(Paths.get("book.xlsx"));
IOleEmbeddedDataInfo dataInfo = new OleEmbeddedDataInfo(fileData, "xlsx");
// Dodaj ramkę obiektu OLE do slajdu.
slide.getShapes().addOleObjectFrame(0, 0, (float)slideSize.getWidth(), (float)slideSize.getHeight(), dataInfo);
presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();
Dodaj powiązane ramki obiektów OLE
Aspose.Slides for Java umożliwia dodanie OleObjectFrame bez osadzania danych, a jedynie z odwołaniem do pliku.
Poniższy kod Java pokazuje, jak dodać OleObjectFrame z powiązanym plikiem Excel do slajdu:
import com.aspose.slides.*;
Presentation presentation = new Presentation();
ISlide slide = presentation.getSlides().get_Item(0);
// Dodaj ramkę obiektu OLE z połączonym plikiem Excel.
slide.getShapes().addOleObjectFrame(20, 20, 200, 150, "Excel.Sheet.12", "book.xlsx");
presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();
Uzyskaj dostęp do ramek obiektów OLE
Jeśli obiekt OLE jest już osadzony w slajdzie, możesz go łatwo znaleźć lub uzyskać dostęp w następujący sposób:
- Załaduj prezentację zawierającą osadzony obiekt OLE, tworząc instancję klasy Presentation .
- Pobierz odniesienie do slajdu, używając jego indeksu.
- Uzyskaj dostęp do kształtu OleObjectFrame. W naszym przykładzie użyliśmy wcześniej utworzonego pliku PPTX, który ma tylko jeden kształt na pierwszym slajdzie. Następnie rzutowaliśmy ten obiekt na IOleObjectFrame. To była pożądana ramka obiektu OLE, do której chcieliśmy uzyskać dostęp.
- Po uzyskaniu dostępu do ramki obiektu OLE możesz wykonać na niej dowolną operację.
W przykładzie poniżej ramka obiektu OLE (obiekt wykresu Excel osadzony w slajdzie) oraz jej dane plikowe są dostępne.
import com.aspose.slides.*;
Presentation presentation = new Presentation("sample.pptx");
ISlide slide = presentation.getSlides().get_Item(0);
IShape shape = slide.getShapes().get_Item(0);
if (shape instanceof IOleObjectFrame) {
IOleObjectFrame oleFrame = (IOleObjectFrame) shape;
// Pobierz osadzone dane pliku.
byte[] fileData = oleFrame.getEmbeddedData().getEmbeddedFileData();
// Pobierz rozszerzenie osadzonego pliku.
String fileExtension = oleFrame.getEmbeddedData().getEmbeddedFileExtension();
// ...
}
Uzyskaj dostęp do właściwości powiązanej ramki obiektu OLE
Aspose.Slides umożliwia dostęp do właściwości powiązanej ramki obiektu OLE.
Poniższy kod Java pokazuje, jak sprawdzić, czy obiekt OLE jest powiązany, a następnie uzyskać ścieżkę do powiązanego pliku:
import com.aspose.slides.*;
Presentation presentation = new Presentation("sample.ppt");
ISlide slide = presentation.getSlides().get_Item(0);
IShape shape = slide.getShapes().get_Item(0);
if (shape instanceof IOleObjectFrame) {
IOleObjectFrame oleFrame = (IOleObjectFrame) shape;
// Sprawdź, czy obiekt OLE jest powiązany.
if (oleFrame.isObjectLink()) {
// Wypisz pełną ścieżkę do powiązanego pliku.
System.out.println("OLE object frame is linked to: " + oleFrame.getLinkPathLong());
// Wypisz względną ścieżkę do powiązanego pliku, jeśli jest dostępna.
// Tylko prezentacje PPT mogą zawierać względną ścieżkę.
if (oleFrame.getLinkPathRelative() != null && !oleFrame.getLinkPathRelative().isEmpty()) {
System.out.println("OLE object frame relative path: " + oleFrame.getLinkPathRelative());
}
}
}
presentation.dispose();
Zmień dane obiektu OLE
Note
W tej sekcji poniższy przykład kodu korzysta z Aspose.Cells for Java.Jeśli obiekt OLE jest już osadzony w slajdzie, możesz łatwo uzyskać dostęp do tego obiektu i zmodyfikować jego dane w następujący sposób:
- Załaduj prezentację zawierającą osadzony obiekt OLE, tworząc instancję klasy Presentation .
- Pobierz odniesienie do slajdu za pomocą jego indeksu.
- Uzyskaj dostęp do kształtu ramki obiektu OLE. W naszym przykładzie użyliśmy wcześniej utworzonego pliku PPTX, który ma jeden kształt na pierwszym slajdzie. Następnie rzutowaliśmy ten obiekt na IOleObjectFrame. To była pożądana ramka obiektu OLE, do której chcieliśmy uzyskać dostęp.
- Po uzyskaniu dostępu do ramki obiektu OLE możesz wykonać na niej dowolną operację.
- Utwórz obiekt
Workbooki uzyskaj dostęp do danych OLE. - Uzyskaj dostęp do żądanej
Worksheeti zmień dane. - Zapisz zaktualizowany
Workbookw strumieniu. - Zmień dane obiektu OLE ze strumienia.
W przykładzie poniżej ramka obiektu OLE (obiekt wykresu Excel osadzony w slajdzie) jest dostępna, a jej dane plikowe są modyfikowane w celu zaktualizowania danych wykresu.
import com.aspose.slides.*;
import com.aspose.cells.Workbook;
import com.aspose.cells.OoxmlSaveOptions;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
Presentation presentation = new Presentation("sample.pptx");
ISlide slide = presentation.getSlides().get_Item(0);
IShape shape = slide.getShapes().get_Item(0);
if (shape instanceof IOleObjectFrame) {
IOleObjectFrame oleFrame = (IOleObjectFrame) shape;
ByteArrayInputStream oleStream = new ByteArrayInputStream(oleFrame.getEmbeddedData().getEmbeddedFileData());
// Odczytaj dane obiektu OLE jako obiekt Workbook.
Workbook workbook = new Workbook(oleStream);
ByteArrayOutputStream newOleStream = new ByteArrayOutputStream();
// Modyfikuj dane skoroszytu.
workbook.getWorksheets().get(0).getCells().get(0, 4).putValue("E");
workbook.getWorksheets().get(0).getCells().get(1, 4).putValue(12);
workbook.getWorksheets().get(0).getCells().get(2, 4).putValue(14);
workbook.getWorksheets().get(0).getCells().get(3, 4).putValue(15);
OoxmlSaveOptions fileOptions = new OoxmlSaveOptions(com.aspose.cells.SaveFormat.XLSX);
workbook.save(newOleStream, fileOptions);
// Zmień dane obiektu ramki OLE.
IOleEmbeddedDataInfo newData = new OleEmbeddedDataInfo(newOleStream.toByteArray(), oleFrame.getEmbeddedData().getEmbeddedFileExtension());
oleFrame.setEmbeddedData(newData);
}
presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();
Wstaw inne typy plików do slajdów
Oprócz wykresów Excel, Aspose.Slides for Java umożliwia osadzanie innych typów plików w slajdach. Na przykład możesz wstawiać pliki HTML, PDF i ZIP jako obiekty. Gdy użytkownik dwukrotnie kliknie wstawiony obiekt, otwiera się automatycznie w odpowiednim programie lub wyświetla się komunikat z prośbą o wybranie odpowiedniego programu.
Poniższy kod Java pokazuje, jak osadzić HTML i ZIP w slajdzie:
import com.aspose.slides.*;
import java.nio.file.Files;
import java.nio.file.Paths;
Presentation presentation = new Presentation();
ISlide slide = presentation.getSlides().get_Item(0);
byte[] htmlData = Files.readAllBytes(Paths.get("sample.html"));
IOleEmbeddedDataInfo htmlDataInfo = new OleEmbeddedDataInfo(htmlData, "html");
IOleObjectFrame htmlOleFrame = slide.getShapes().addOleObjectFrame(150, 120, 50, 50, htmlDataInfo);
htmlOleFrame.setObjectIcon(true);
byte[] zipData = Files.readAllBytes(Paths.get("sample.zip"));
IOleEmbeddedDataInfo zipDataInfo = new OleEmbeddedDataInfo(zipData, "zip");
IOleObjectFrame zipOleFrame = slide.getShapes().addOleObjectFrame(150, 220, 50, 50, zipDataInfo);
zipOleFrame.setObjectIcon(true);
presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();
Ustaw typy plików dla osadzonych obiektów
Podczas pracy z prezentacjami możesz potrzebować zastąpić stare obiekty OLE nowymi lub zamienić nieobsługiwany obiekt OLE na obsługiwany. Aspose.Slides for Java umożliwia ustawienie typu pliku dla osadzonego obiektu, co pozwala zaktualizować dane ramki OLE lub jej rozszerzenie.
Poniższy kod Java pokazuje, jak ustawić typ pliku dla osadzonego obiektu OLE na zip:
import com.aspose.slides.*;
Presentation presentation = new Presentation("sample.pptx");
ISlide slide = presentation.getSlides().get_Item(0);
IOleObjectFrame oleFrame = (IOleObjectFrame) slide.getShapes().get_Item(0);
String fileExtension = oleFrame.getEmbeddedData().getEmbeddedFileExtension();
byte[] fileData = oleFrame.getEmbeddedData().getEmbeddedFileData();
System.out.println("Current embedded file extension is: " + fileExtension);
// Change the file type to ZIP.
oleFrame.setEmbeddedData(new OleEmbeddedDataInfo(fileData, "zip"));
presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();
Ustaw obrazy ikon i tytuły dla osadzonych obiektów
Po osadzeniu obiektu OLE automatycznie dodawany jest podgląd składający się z obrazu ikony. Ten podgląd jest tym, co widzą użytkownicy przed uzyskaniem dostępu lub otwarciem obiektu OLE. Jeśli chcesz użyć konkretnego obrazu i tekstu jako elementów podglądu, możesz ustawić obraz ikony oraz tytuł przy użyciu Aspose.Slides for Java.
Poniższy kod Java pokazuje, jak ustawić obraz ikony i tytuł dla osadzonego obiektu:
import com.aspose.slides.*;
import java.nio.file.Files;
import java.nio.file.Paths;
Presentation presentation = new Presentation("sample.pptx");
ISlide slide = presentation.getSlides().get_Item(0);
IOleObjectFrame oleFrame = (IOleObjectFrame) slide.getShapes().get_Item(0);
// Dodaj obraz do zasobów prezentacji.
byte[] imageData = Files.readAllBytes(Paths.get("image.png"));
IPPImage oleImage = presentation.getImages().addImage(imageData);
// Ustaw tytuł i obraz dla podglądu OLE.
oleFrame.setSubstitutePictureTitle("My title");
oleFrame.getSubstitutePictureFormat().getPicture().setImage(oleImage);
oleFrame.setObjectIcon(true);
presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();
Zapobiegaj zmianie rozmiaru i położenia ramki obiektu OLE
Po dodaniu powiązanego obiektu OLE do slajdu prezentacji, po otwarciu prezentacji w PowerPoint może pojawić się komunikat z prośbą o aktualizację łączy. Kliknięcie przycisku „Update Links” może zmienić rozmiar i położenie ramki obiektu OLE, ponieważ PowerPoint aktualizuje dane z powiązanego obiektu OLE i odświeża podgląd obiektu. Aby zapobiec wyświetlaniu monitu o aktualizację danych obiektu, wywołaj metodę setUpdateAutomatic interfejsu IOleObjectFrame z wartością false:
import com.aspose.slides.*;
Presentation presentation = new Presentation("sample.pptx");
ISlide slide = presentation.getSlides().get_Item(0);
IOleObjectFrame oleFrame = (IOleObjectFrame) slide.getShapes().get_Item(0);
oleFrame.setUpdateAutomatic(false);
presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();
Wyodrębnij osadzone pliki
Aspose.Slides for Java umożliwia wyodrębnienie plików osadzonych w slajdach jako obiektów OLE w następujący sposób:
- Utwórz instancję klasy Presentation zawierającą obiekty OLE, które chcesz wyodrębnić.
- Przejdź przez wszystkie kształty w prezentacji i uzyskaj dostęp do kształtów OLEObjectFrame.
- Uzyskaj dostęp do danych osadzonych plików z ramek obiektów OLE i zapisz je na dysku.
Poniższy kod Java pokazuje, jak wyodrębnić pliki osadzone w slajdzie jako obiekty OLE:
import com.aspose.slides.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
Presentation presentation = new Presentation("sample.pptx");
ISlide slide = presentation.getSlides().get_Item(0);
for (int index = 0; index < slide.getShapes().size(); index++) {
IShape shape = slide.getShapes().get_Item(index);
if (shape instanceof IOleObjectFrame) {
IOleObjectFrame oleFrame = (IOleObjectFrame) shape;
byte[] fileData = oleFrame.getEmbeddedData().getEmbeddedFileData();
String fileExtension = oleFrame.getEmbeddedData().getEmbeddedFileExtension();
Path filePath = Paths.get("OLE_object_" + index + fileExtension);
Files.write(filePath, fileData);
}
}
presentation.dispose();
FAQ
Czy zawartość OLE będzie renderowana podczas eksportu 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, wywołaj setIncludeOleData z wartością true. Opcja jest domyślnie wyłączona. Przykład i instrukcje sprawdzania załącznika znajdziesz w Preserve Embedded OLE Files as PDF Attachments.
Jak mogę zablokować obiekt OLE na slajdzie, aby użytkownicy nie mogli go przemieszczać/edytować w PowerPoint?
Zablokuj kształt: Aspose.Slides udostępnia shape-level locks. Nie jest to szyfrowanie, ale skutecznie zapobiega przypadkowym edycjom i przemieszczeniom.
Dlaczego powiązany obiekt Excel „przeskakuje” lub zmienia rozmiar po otwarciu prezentacji?
PowerPoint może odświeżać podgląd powiązanego OLE. Aby uzyskać stabilny wygląd, zastosuj praktyki opisane w Working Solution for Worksheet Resizing — dopasuj ramkę do zakresu lub skaluj zakres do stałej ramki i ustaw odpowiedni obraz zastępczy.
Czy względne ścieżki do powiązanych obiektów OLE będą zachowane w formacie PPTX?
W PPTX informacja o „względnej ścieżce” nie jest dostępna — jedynie pełna ścieżka. Względne ścieżki występują w starszym formacie PPT. Dla przenośności lepiej używać niezawodnych ścieżek bezwzględnych/URI dostępnych lub osadzania.