Administrar OLE en presentaciones en Android
Considere un gráfico creado en MS Excel. El gráfico se inserta dentro de una diapositiva de PowerPoint. Ese gráfico de Excel se considera un objeto OLE.
- Un objeto OLE puede aparecer como un icono. En este caso, al hacer doble clic en el icono, el gráfico se abre en su aplicación asociada (Excel), o se le solicita seleccionar una aplicación para abrir o editar el objeto.
- Un objeto OLE puede mostrar su contenido real, como el contenido de un gráfico. En este caso, el gráfico se activa en PowerPoint, se carga la interfaz del gráfico y puede modificar los datos del gráfico dentro de PowerPoint.
Aspose.Slides para Android mediante Java permite insertar objetos OLE en diapositivas como marcos de objetos OLE (OleObjectFrame).
Agregar marcos de objetos OLE a diapositivas
Suponiendo que ya haya creado un gráfico en Microsoft Excel y desea incrustarlo en una diapositiva como un marco de objeto OLE usando Aspose.Slides para Android mediante Java, puede hacerlo de la siguiente manera:
- Crear una instancia de la clase Presentation.
- Obtener la referencia de una diapositiva mediante su índice.
- Leer el archivo Excel como una matriz de bytes.
- Añadir el OleObjectFrame a la diapositiva que contiene la matriz de bytes y otra información sobre el objeto OLE.
- Guardar la presentación modificada como un archivo PPTX.
En el ejemplo siguiente, añadimos un gráfico de un archivo Excel a una diapositiva como un marco de objeto OLE usando Aspose.Slides para Android mediante Java.
Nota que el constructor de OleEmbeddedDataInfo recibe una extensión de objeto incrustable como segundo parámetro. Esta extensión permite a PowerPoint interpretar correctamente el tipo de archivo y elegir la aplicación adecuada para abrir este objeto OLE.
Presentation presentation = new Presentation();
SizeF slideSize = presentation.getSlideSize().getSize();
ISlide slide = presentation.getSlides().get_Item(0);
// Preparar datos para el objeto OLE.
File file = new File("book.xlsx");
byte fileData[] = new byte[(int) file.length()];
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
DataInputStream dis = new DataInputStream(bis);
dis.readFully(fileData);
IOleEmbeddedDataInfo dataInfo = new OleEmbeddedDataInfo(fileData, "xlsx");
// Agregar el marco de objeto OLE a la diapositiva.
slide.getShapes().addOleObjectFrame(0, 0, slideSize.getWidth(), slideSize.getHeight(), dataInfo);
presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();
Agregar marcos de objetos OLE enlazados
Aspose.Slides para Android mediante Java permite agregar un OleObjectFrame sin incrustar datos, sólo con un enlace al archivo.
Este código Java muestra cómo agregar un OleObjectFrame con un archivo Excel enlazado a una diapositiva:
Presentation presentation = new Presentation();
ISlide slide = presentation.getSlides().get_Item(0);
// Agregar un marco de objeto OLE con un archivo Excel enlazado.
slide.getShapes().addOleObjectFrame(20, 20, 200, 150, "Excel.Sheet.12", "book.xlsx");
presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();
Acceder a marcos de objetos OLE
Si un objeto OLE ya está incrustado en una diapositiva, puede encontrarlo o acceder a él fácilmente de la siguiente manera:
- Cargar una presentación con el objeto OLE incrustado creando una instancia de la clase Presentation.
- Obtener la referencia de la diapositiva mediante su índice.
- Acceder a la forma OleObjectFrame.
En nuestro ejemplo, usamos el PPTX creado previamente que tiene una sola forma en la primera diapositiva. Luego cast ese objeto como un IOleObjectFrame. Este era el marco de objeto OLE deseado para acceder. - Una vez accedido al marco de objeto OLE, puede realizar cualquier operación sobre él.
En el ejemplo siguiente, se accede a un marco de objeto OLE (un objeto gráfico de Excel incrustado en una diapositiva) y a sus datos de archivo.
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;
// Obtener los datos del archivo incrustado.
byte[] fileData = oleFrame.getEmbeddedData().getEmbeddedFileData();
// Obtener la extensión del archivo incrustado.
String fileExtension = oleFrame.getEmbeddedData().getEmbeddedFileExtension();
// ...
}
Acceder a propiedades del marco de objeto OLE enlazado
Aspose.Slides permite acceder a las propiedades de los marcos de objetos OLE enlazados.
Este código Java muestra cómo verificar si un objeto OLE está enlazado y obtener la ruta al archivo enlazado:
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;
// Verificar si el objeto OLE está enlazado.
if (oleFrame.isObjectLink()) {
// Imprimir la ruta completa del archivo enlazado.
System.out.println("OLE object frame is linked to: " + oleFrame.getLinkPathLong());
// Imprimir la ruta relativa del archivo enlazado si está presente.
// Solo las presentaciones PPT pueden contener la ruta relativa.
if (oleFrame.getLinkPathRelative() != null && !oleFrame.getLinkPathRelative().isEmpty()) {
System.out.println("OLE object frame relative path: " + oleFrame.getLinkPathRelative());
}
}
}
presentation.dispose();
Cambiar datos del objeto OLE
Si un objeto OLE ya está incrustado en una diapositiva, puede acceder a ese objeto y modificar sus datos de la siguiente manera:
- Cargar una presentación con el objeto OLE incrustado creando una instancia de la clase Presentation.
- Obtener la referencia de la diapositiva mediante su índice.
- Acceder a la forma del marco de objeto OLE.
En nuestro ejemplo, usamos el PPTX creado previamente que tiene una forma en la primera diapositiva. Luego cast ese objeto como un IOleObjectFrame. Este era el marco de objeto OLE deseado para acceder. - Una vez accedido al marco de objeto OLE, puede realizar cualquier operación sobre él.
- Crear un objeto
Workbooky acceder a los datos OLE. - Acceder a la
Worksheetdeseada y modificar los datos. - Guardar el
Workbookactualizado en un flujo. - Cambiar los datos del objeto OLE desde el flujo.
En el ejemplo siguiente, se accede a un marco de objeto OLE (un objeto gráfico de Excel incrustado en una diapositiva) y se modifican sus datos de archivo para actualizar los datos del gráfico.
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());
// Leer los datos del objeto OLE como un objeto Workbook.
Workbook workbook = new Workbook(oleStream);
ByteArrayOutputStream newOleStream = new ByteArrayOutputStream();
// Modificar los datos del workbook.
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);
// Cambiar los datos del objeto del marco OLE.
IOleEmbeddedDataInfo newData = new OleEmbeddedDataInfo(newOleStream.toByteArray(), oleFrame.getEmbeddedData().getEmbeddedFileExtension());
oleFrame.setEmbeddedData(newData);
}
presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();
Incrustar otros tipos de archivo en diapositivas
Además de los gráficos de Excel, Aspose.Slides para Android mediante Java permite incrustar otros tipos de archivos en diapositivas. Por ejemplo, puede insertar archivos HTML, PDF y ZIP como objetos. Cuando un usuario hace doble clic en el objeto insertado, se abre automáticamente en el programa correspondiente, o se le solicita al usuario que seleccione un programa adecuado para abrirlo.
Este código Java muestra cómo incrustar HTML y ZIP en una diapositiva:
Presentation presentation = new Presentation();
ISlide slide = presentation.getSlides().get_Item(0);
File fileHtml = new File("sample.html");
byte htmlData[] = new byte[(int) fileHtml.length()];
BufferedInputStream bisHtml = new BufferedInputStream(new FileInputStream(fileHtml));
DataInputStream disHtml = new DataInputStream(bisHtml);
disHtml.readFully(htmlData);
IOleEmbeddedDataInfo htmlDataInfo = new OleEmbeddedDataInfo(htmlData, "html");
IOleObjectFrame htmlOleFrame = slide.getShapes().addOleObjectFrame(150, 120, 50, 50, htmlDataInfo);
htmlOleFrame.setObjectIcon(true);
File fileZip = new File("sample.zip");
byte zipData[] = new byte[(int) fileZip.length()];
BufferedInputStream bisZip = new BufferedInputStream(new FileInputStream(fileZip));
DataInputStream disZip = new DataInputStream(bisZip);
disZip.readFully(zipData);
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();
Establecer tipos de archivo para objetos incrustados
Al trabajar con presentaciones, puede necesitar reemplazar objetos OLE antiguos por nuevos o reemplazar un objeto OLE no compatible por uno compatible. Aspose.Slides para Android mediante Java permite establecer el tipo de archivo para un objeto incrustado, lo que le permite actualizar los datos del marco OLE o su extensión.
Este código Java muestra cómo establecer el tipo de archivo para un objeto OLE incrustado a zip:
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);
// Cambiar el tipo de archivo a ZIP.
oleFrame.setEmbeddedData(new OleEmbeddedDataInfo(fileData, "zip"));
presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();
Establecer imágenes de icono y títulos para objetos incrustados
Después de incrustar un objeto OLE, se agrega automáticamente una vista previa que consiste en una imagen de icono. Esta vista previa es lo que los usuarios ven antes de acceder o abrir el objeto OLE. Si desea usar una imagen y texto específicos como elementos de la vista previa, puede establecer la imagen de icono y el título usando Aspose.Slides para Android mediante Java.
Este código Java muestra cómo establecer la imagen de icono y el título para un objeto incrustado:
Presentation presentation = new Presentation("sample.pptx");
ISlide slide = presentation.getSlides().get_Item(0);
IOleObjectFrame oleFrame = (IOleObjectFrame) slide.getShapes().get_Item(0);
// Añadir una imagen a los recursos de la presentación.
File file = new File("image.png");
byte imageData[] = new byte[(int) file.length()];
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
DataInputStream dis = new DataInputStream(bis);
dis.readFully(imageData);
IPPImage oleImage = presentation.getImages().addImage(imageData);
// Set a title and the image for the OLE preview.
oleFrame.setSubstitutePictureTitle("My title");
oleFrame.getSubstitutePictureFormat().getPicture().setImage(oleImage);
oleFrame.setObjectIcon(true);
presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();
Prevenir que un marco de objeto OLE sea redimensionado y reposicionado
Después de agregar un objeto OLE enlazado a una diapositiva, al abrir la presentación en PowerPoint puede aparecer un mensaje que solicita actualizar los enlaces. Al hacer clic en el botón “Update Links” (Actualizar enlaces) PowerPoint puede cambiar el tamaño y la posición del marco de objeto OLE porque actualiza los datos del objeto enlazado y refresca la vista previa del objeto. Para evitar que PowerPoint solicite actualizar los datos del objeto, establezca el método setUpdateAutomatic de la interfaz IOleObjectFrame en false:
oleFrame.setUpdateAutomatic(false);
Extraer archivos incrustados
Aspose.Slides para Android mediante Java permite extraer los archivos incrustados en diapositivas como objetos OLE de la siguiente manera:
- Crear una instancia de la clase Presentation que contenga los objetos OLE que desea extraer.
- Recorrer todas las formas de la presentación y acceder a las formas OLEObjectFrame.
- Acceder a los datos de los archivos incrustados desde los marcos de objetos OLE y escribirlos en disco.
Este código Java muestra cómo extraer archivos incrustados en una diapositiva como objetos OLE:
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();
FileOutputStream fos = new FileOutputStream(new File("OLE_object_" + index + fileExtension));
fos.write(fileData);
fos.close();
}
}
presentation.dispose();
FAQ
¿El contenido OLE se renderiza al exportar diapositivas a PDF/imagenes?
Se renderiza lo visible en la diapositiva: el icono/imagen de sustitución (vista previa). El contenido OLE “en vivo” no se ejecuta durante el renderizado. Si es necesario, establezca su propia imagen de vista previa para garantizar la apariencia esperada en el PDF exportado.
¿Cómo puedo bloquear un objeto OLE en una diapositiva para que los usuarios no puedan moverlo/editarlo en PowerPoint?
Bloquee la forma: Aspose.Slides proporciona bloqueos a nivel de forma. No es cifrado, pero evita eficazmente ediciones o movimientos accidentales.
¿Por qué un objeto Excel enlazado “salta” o cambia de tamaño al abrir la presentación?
PowerPoint puede refrescar la vista previa del OLE enlazado. Para una apariencia estable, siga las prácticas de la Solución funcional para el redimensionamiento de hojas de cálculo: ajuste el marco al rango o escale el rango a un marco fijo y establezca una imagen de sustitución adecuada.
¿Se conservan rutas relativas para objetos OLE enlazados en el formato PPTX?
En PPTX la información de “ruta relativa” no está disponible, solo la ruta completa. Las rutas relativas aparecen en el formato más antiguo PPT. Para portabilidad, prefiera rutas absolutas fiables/URIs accesibles o la incrustación.