Manage OLE
Consider a chart created in MS Excel. The chart is then placed inside a PowerPoint slide. That Excel chart is considered an OLE object.
- An OLE object may appear as an icon. In this case, when you double-click the icon, the chart gets opened in its associated application (Excel), or you are asked to select an application for object opening or editing.
- An OLE object may display actual contents—for example, the contents of a chart. In this case, the chart is activated in PowerPoint, the chart interface loads, and you get to modify the chart’s data within the PowerPoint app.
Aspose.Slides for PHP via Java allows you to insert OLE Objects into slides as OLE Object Frames (OleObjectFrame).
Adding OLE Object Frames to Slides
Assuming you already created a chart in Microsoft Excel and want to embed that chart in a slide as an OLE Object Frame using Aspose.Slides for PHP via Java, you can do it this way:
- Create an instance of the Presentation class.
- Obtain the reference of the slide by using its index.
- Open the Excel file containing the Excel chart object and save it to
MemoryStream
. - Add the OleObjectFrame to the slide containing the array of bytes and other information about the OLE object.
- Write the modified presentation as a PPTX file.
In the example below, we added a chart from an Excel file to a slide as an OLE Object Frame using Aspose.Slides for PHP via Java. Note that the IOleEmbeddedDataInfo constructor takes an embeddable object extension as a second parameter. This extension allows PowerPoint to correctly interpret the file type and choose the right application to open this OLE object.
# Instantiates Prseetation class that represents the PPTX file
$pres = new Presentation();
try {
# Accesses the first slide
$sld = $pres->getSlides()->get_Item(0);
# Loads an excel file to stream
$fs = new Java("java.io.FileInputStream", "book1.xlsx");
$Array = new java_class("java.lang.reflect.Array");
$Byte = new JavaClass("java.lang.Byte");
$mstream = new Java("java.io.ByteArrayOutputStream");
$buf = $Array->newInstance($Byte, 4096);
while (true) {
$bytesRead = $fs->read($buf, 0, $Array->getLength($buf));
if ($bytesRead <= 0) {
break;
}
$mstream->write($buf, 0, $bytesRead);
}
$fs->close();
# Creates a data object for embedding
$dataInfo = new OleEmbeddedDataInfo($mstream->toByteArray(), "xlsx");
$mstream->close();
# Adds an Ole Object Frame shape
$oleObjectFrame = $sld->getShapes()->addOleObjectFrame(0, 0, $pres->getSlideSize()->getSize()->getWidth(), $pres->getSlideSize()->getSize()->getHeight(), $dataInfo);
# Writes the PPTX file to disk
$pres->save("OleEmbed_out.pptx", SaveFormat::Pptx);
} catch (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Accessing OLE Object Frames
If an OLE object is already embedded in a slide, you can find or access that object easily using this way:
-
Create an instance of the Presentation class.
-
Obtain the reference of the slide by using its index.
-
Access the OLE Object Frame shape.
In our example, we used the previously created PPTX, which has only one shape on the first slide. We then cast that object as an OleObjectFrame. This was the desired OLE Object Frame to be accessed.
-
Once the OLE Object Frame is accessed, you can perform any operation on it.
In the example below, an OLE Object Frame (an Excel chart object embedded in a slide) is accessed—and then its file data gets written to an Excel file.
# Loads the PPTX to a Presentation object
$pres = new Presentation("AccessingOLEObjectFrame.pptx");
try {
# Accesses the first slide
$sld = $pres->getSlides()->get_Item(0);
# Casts the shape to OleObjectFrame
$oleObjectFrame = $sld->getShapes()->get_Item(0);
# Reads the OLE Object and writes it to disk
if (!java_is_null($oleObjectFrame)) {
# Get embedded file data
$data = $oleObjectFrame->getEmbeddedData()->getEmbeddedFileData();
# Gets embedded file extention
$fileExtention = $oleObjectFrame->getEmbeddedData()->getEmbeddedFileExtension();
# Creates a path to save the extracted file
$extractedPath = "excelFromOLE_out" . $fileExtention;
# Saves extracted data
$fstr = new Java("java.io.FileOutputStream", $extractedPath);
$Array = new java_class("java.lang.reflect.Array");
try {
$fstr->write($data, 0, $Array->getLength($data));
} finally {
$fstr->close();
}
}
} catch (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Changing OLE Object Data
If an OLE object is already embedded in a slide, you can easily access that object and modify its data this way:
-
Open the desired presentation with the embedded OLE Object by creating an instance of the Presentation class.
-
Get the slide’s reference through its index.
-
Access the OLE Object Frame shape.
In our example, we used the previously created PPTX that has only one shape on the first slide. We then cast that object as an OleObjectFrame. This was the desired OLE Object Frame to be accessed.
-
Once the OLE Object Frame is accessed, you can perform any operation on it.
-
Create the Workbook object and access the OLE Data.
-
Access the desired Worksheet and amend the data.
-
Save the updated Workbook in streams.
-
Change the OLE object data from stream data.
In the example below, an OLE Object Frame (an Excel chart object embedded in a slide) is accessed—and then its file data is modified to change the chart data:
$pres = new Presentation("ChangeOLEObjectData.pptx");
try {
$slide = $pres->getSlides()->get_Item(0);
$ole = null;
# Traverses all shapes for Ole frame
foreach($slide->getShapes() as $shape) {
if (java_instanceof($shape, new JavaClass("com.aspose.slides.OleObjectFrame"))) {
$ole = $shape;
}
}
if (!java_is_null($ole)) {
$msln = new ByteArrayInputStream($ole->getEmbeddedData()->getEmbeddedFileData());
try {
# Reads object data in Workbook
$Wb = new Workbook($msln);
$msout = new Java("java.io.ByteArrayOutputStream");
try {
# Modifies the workbook data
$Wb->getWorksheets()->get(0)->getCells()->get(0, 4)->putValue("E");
$Wb->getWorksheets()->get(0)->getCells()->get(1, 4)->putValue(12);
$Wb->getWorksheets()->get(0)->getCells()->get(2, 4)->putValue(14);
$Wb->getWorksheets()->get(0)->getCells()->get(3, 4)->putValue(15);
$so1 = new OoxmlSaveOptions(SaveFormat::XLSX);
$Wb->save($msout, $so1);
# Changes Ole frame object data
$newData = new OleEmbeddedDataInfo($msout->toByteArray(), $ole->getEmbeddedData()->getEmbeddedFileExtension());
$ole->setEmbeddedData($newData);
} finally {
if (!java_is_null($msout)) {
$msout->close();
}
}
} finally {
if (!java_is_null($msln)) {
$msln->close();
}
}
}
$pres->save("OleEdit_out.pptx", SaveFormat::Pptx);
} catch (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Embedding Other File Types in Slides
Besides Excel charts, Aspose.Slides for PHP via Java allows you to embed other types of files in slides. For example, you can insert HTML, PDF, and ZIP files as objects into a slide. When a user double-clicks the inserted object, the object automatically gets launched in the relevant program, or the user gets directed to select an appropriate program to open the object.
This PHP code shows you how to embed HTML and ZIP in a slide:
$pres = new Presentation();
try {
$slide = $pres->getSlides()->get_Item(0);
$Array = new JavaClass("java.lang.reflect.Array");
$Byte = (new JavaClass("java.lang.Byte"))->TYPE;
try {
$dis = new Java("java.io.DataInputStream", new Java("java.io.FileInputStream", "embedOle.html"));
$bytes = $Array->newInstance($Byte, $dis->available());
$dis->readFully($bytes);
} finally {
if (!java_is_null($dis)) $dis->close();
}
$htmlBytes = $bytes;
$dataInfoHtml = new OleEmbeddedDataInfo($htmlBytes, "html");
$oleFrameHtml = $slide->getShapes()->addOleObjectFrame(150, 120, 50, 50, $dataInfoHtml);
$oleFrameHtml->setObjectIcon(true);
try {
$dis = new Java("java.io.DataInputStream", new Java("java.io.FileInputStream", "embedOle.zip"));
$bytes = $Array->newInstance($Byte, $dis->available());
$dis->readFully($bytes);
} finally {
if (!java_is_null($dis)) $dis->close();
}
$zipBytes = $bytes;
$dataInfoZip = new OleEmbeddedDataInfo($zipBytes, "zip");
$oleFrameZip = $slide->getShapes()->addOleObjectFrame(150, 220, 50, 50, $dataInfoZip);
$oleFrameZip->setObjectIcon(true);
$pres->save("embeddedOle.pptx", SaveFormat::Pptx);
} catch (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Setting File Types for Embedded Objects
When working on presentations, you may need to replace old OLE objects with new ones. Or you may need to replace an unsupported OLE object with a supported one.
Aspose.Slides for PHP via Java allows you to set the file type for an embedded object. This way, you get to change the OLE frame data or its extension.
This Java shows you how to set the file type for an embedded OLE object:
$pres = new Presentation("embeddedOle.pptx");
try {
$slide = $pres->getSlides()->get_Item(0);
$oleObjectFrame = $slide->getShapes()->get_Item(0);
echo("Current embedded data extension is: " . $oleObjectFrame->getEmbeddedData()->getEmbeddedFileExtension());
$Array = new JavaClass("java.lang.reflect.Array");
$Byte = (new JavaClass("java.lang.Byte"))->TYPE;
try {
$dis = new Java("java.io.DataInputStream", new Java("java.io.FileInputStream", "embedOle.zip"));
$bytes = $Array->newInstance($Byte, $dis->available());
$dis->readFully($bytes);
} finally {
if (!java_is_null($dis)) $dis->close();
}
$oleObjectFrame->setEmbeddedData(new OleEmbeddedDataInfo($bytes, "zip"));
$pres->save("embeddedChanged.pptx", SaveFormat::Pptx);
} catch (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Setting Icon Images and Titles for Embedded Objects
After you embed an OLE object, a preview consisting of an icon image and title gets added automatically. The preview is what users see before they access or open the OLE object.
If you want to use a specific image and text as elements in the preview, you can set the icon image and title using Aspose.Slides for PHP via Java.
This PHP code shows you how to set the icon image and title for an embedded object:
$pres = new Presentation();
try {
$slide = $pres->getSlides()->get_Item(0);
$oleObjectFrame = $slide->getShapes()->get_Item(0);
$oleImage;
$image = Images->fromFile("image.png");
try {
$oleImage = $pres->getImages()->addImage($image);
} finally {
if (!java_is_null($image)) {
$image->dispose();
}
}
$oleObjectFrame->setSubstitutePictureTitle("My title");
$oleObjectFrame->getSubstitutePictureFormat()->getPicture()->setImage($oleImage);
$oleObjectFrame->setObjectIcon(false);
$pres->save("embeddedOle-newImage.pptx", SaveFormat::Pptx);
} catch (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Prevent an OLE Object Frame from Being Resized and Pepositioned
After you add a linked OLE object to a presentation slide, when you open the presentation in PowerPoint, you might see a message asking you to update the links. Clicking the “Update Links” button may change the size and position of the OLE object frame because PowerPoint updates the data from the linked OLE object and refreshes the object preview. To prevent PowerPoint from prompting to update the object’s data, set the setUpdateAutomatic
method of the OleObjectFrame class to false
:
$oleObjectFrame->setUpdateAutomatic(false);
Extracting Embedded Files
Aspose.Slides for PHP via Java allows you to extract the files embedded in slides as OLE objects this way:
- Create an instance of the Presentation class containing the OLE object you intend to extract.
- Loop through all the shapes in the presentation and access the OLEObjectFrame shape.
- Access the embedded file’s data from the OLE Object Frame and write it to disk.
This PHP code shows you how to extract a file embedded in a slide as an OLE object:
$pres = new Presentation("embeddedOle.pptx");
try {
$slide = $pres->getSlides()->get_Item(0);
for($index = 0; $index < java_values($slide->getShapes()->size()) ; $index++) {
$shape = $slide->getShapes()->get_Item($index);
$oleFrame = $shape;
if (!java_is_null($oleFrame)) {
$data = $oleFrame->getEmbeddedData()->getEmbeddedFileData();
$extension = $oleFrame->getEmbeddedData()->getEmbeddedFileExtension();
# Save extracted data
$fstr = new Java("java.io.FileOutputStream", "oleFrame" . $index . $extension);
$Array = new java_class("java.lang.reflect.Array");
try {
$fstr->write($data, 0, $Array->getLength($data));
} finally {
$fstr->close();
}
}
}
} catch (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}