จัดการ OLE ในงานนำเสนอด้วย Java
บทนำ
ให้นึกถึงแผนภูมิที่สร้างใน MS Excel แผนภูมินั้นถูกวางไว้ในสไลด์ PowerPoint แผนภูมิ Excel นี้ถือเป็นวัตถุ OLE
- OLE object อาจแสดงเป็นไอคอน ในกรณีนี้เมื่อคุณดับเบิลคลิกที่ไอคอน แผนภูมิจะเปิดในแอปพลิเคชันที่เชื่อมโยง (Excel) หรือคุณจะถูกถามให้เลือกแอปพลิเคชันสำหรับการเปิดหรือแก้ไขวัตถุ
- OLE object อาจแสดงเนื้อหาจริงของมัน เช่น เนื้อหาของแผนภูมิ ในกรณีนี้แผนภูมิจะทำงานใน PowerPoint อินเตอร์เฟซของแผนภูมิจะโหลด และคุณสามารถแก้ไขข้อมูลของแผนภูมิได้ภายใน PowerPoint
Aspose.Slides for Java ช่วยให้คุณแทรก OLE Objects ลงในสไลด์เป็น OLE object frames (OleObjectFrame)
เพิ่ม OLE Object Frames ลงในสไลด์
สมมติว่าคุณได้สร้างแผนภูมิใน Microsoft Excel แล้วต้องการฝังมันลงในสไลด์เป็น OLE object frame ด้วย Aspose.Slides for Java คุณสามารถทำได้ดังนี้:
- สร้างอินสแตนซ์ของคลาส Presentation
- รับการอ้างอิงของสไลด์โดยใช้ดัชนีของมัน
- อ่านไฟล์ Excel เป็นอาเรย์ของไบต์
- เพิ่ม OleObjectFrame ไปยังสไลด์พร้อมอาเรย์ไบต์และข้อมูลอื่น ๆ เกี่ยวกับ OLE object
- เขียนพรีเซนเทชันที่แก้ไขแล้วเป็นไฟล์ PPTX
ในตัวอย่างด้านล่าง เราได้เพิ่มแผนภูมิจากไฟล์ Excel ลงในสไลด์เป็น OLE object frame ด้วย Aspose.Slides for Java
หมายเหตุ ว่า constructor ของ OleEmbeddedDataInfo รับส่วนขยายของวัตถุที่สามารถฝังได้เป็นพารามิเตอร์ตัวที่สอง ส่วนขยายนี้ทำให้ PowerPoint สามารถตีความประเภทไฟล์ได้อย่างถูกต้องและเลือกแอปพลิเคชันที่เหมาะสมเพื่อเปิด OLE object นี้
Presentation presentation = new Presentation();
Dimension2D slideSize = presentation.getSlideSize().getSize();
ISlide slide = presentation.getSlides().get_Item(0);
// เตรียมข้อมูลสำหรับวัตถุ OLE.
byte[] fileData = Files.readAllBytes(Paths.get("book.xlsx"));
IOleEmbeddedDataInfo dataInfo = new OleEmbeddedDataInfo(fileData, "xlsx");
// เพิ่มเฟรมวัตถุ OLE ลงในสไลด์.
slide.getShapes().addOleObjectFrame(0, 0, (float)slideSize.getWidth(), (float)slideSize.getHeight(), dataInfo);
presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();
เพิ่ม Linked OLE Object Frames
Aspose.Slides for Java อนุญาตให้คุณเพิ่ม OleObjectFrame โดยไม่ต้องฝังข้อมูล แต่เพียงเชื่อมโยงไปยังไฟล์เท่านั้น
โค้ด Java นี้แสดงวิธีการเพิ่ม OleObjectFrame พร้อมไฟล์ Excel ที่เชื่อมโยงไปยังสไลด์:
Presentation presentation = new Presentation();
ISlide slide = presentation.getSlides().get_Item(0);
// เพิ่มเฟรมวัตถุ OLE พร้อมไฟล์ Excel ที่เชื่อมโยง.
slide.getShapes().addOleObjectFrame(20, 20, 200, 150, "Excel.Sheet.12", "book.xlsx");
presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();
เข้าถึง OLE Object Frames
หาก OLE object ถูกฝังอยู่ในสไลด์แล้ว คุณสามารถค้นหาและเข้าถึงได้ง่ายๆ ดังนี้:
- โหลดพรีเซนเทชันที่มี OLE object ฝังอยู่โดยสร้างอินสแตนซ์ของคลาส Presentation
- รับการอ้างอิงของสไลด์โดยใช้ดัชนีของมัน
- เข้าถึง shape ของ OleObjectFrame ในตัวอย่างของเรา เราใช้ไฟล์ PPTX ที่สร้างไว้ก่อนหน้านี้ซึ่งมีเพียง shape หนึ่งบนสไลด์แรก จากนั้นเราจึง cast วัตถุนี้เป็น IOleObjectFrame นี่คือ OLE object frame ที่ต้องการเข้าถึง
- เมื่อเข้าถึง OLE object frame แล้ว คุณสามารถดำเนินการใดๆ กับมันได้
ในตัวอย่างด้านล่าง เราเข้าถึง OLE object frame (วัตถุแผนภูมิ Excel ที่ฝังในสไลด์) และข้อมูลไฟล์ของมัน
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;
// ดึงข้อมูลไฟล์ที่ฝังไว้.
byte[] fileData = oleFrame.getEmbeddedData().getEmbeddedFileData();
// ดึงส่วนขยายของไฟล์ที่ฝังไว้.
String fileExtension = oleFrame.getEmbeddedData().getEmbeddedFileExtension();
// ...
}
เข้าถึงคุณสมบัติของ Linked OLE Object Frame
Aspose.Slides อนุญาตให้คุณเข้าถึงคุณสมบัติของ linked OLE object frame
โค้ด Java นี้แสดงวิธีการตรวจสอบว่า OLE object ถูกเชื่อมโยงหรือไม่และจากนั้นรับเส้นทางของไฟล์ที่เชื่อมโยง:
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;
// ตรวจสอบว่า OLE object เชื่อมโยงหรือไม่
if (oleFrame.isObjectLink()) {
// พิมพ์เส้นทางเต็มของไฟล์ที่เชื่อมโยง
System.out.println("OLE object frame is linked to: " + oleFrame.getLinkPathLong());
// พิมพ์เส้นทาง relative ของไฟล์ที่เชื่อมโยงหากมี
// เฉพาะงานนำเสนอ PPT เท่านั้นที่สามารถมีเส้นทาง relative ได้
if (oleFrame.getLinkPathRelative() != null && !oleFrame.getLinkPathRelative().isEmpty()) {
System.out.println("OLE object frame relative path: " + oleFrame.getLinkPathRelative());
}
}
}
presentation.dispose();
เปลี่ยนข้อมูล OLE Object
หาก OLE object ถูกฝังอยู่ในสไลด์แล้ว คุณสามารถเข้าถึงและแก้ไขข้อมูลของมันได้ดังนี้:
- โหลดพรีเซนเทชันที่มี OLE object ฝังอยู่โดยสร้างอินสแตนซ์ของคลาส Presentation
- รับการอ้างอิงของสไลด์ผ่านดัชนีของมัน
- เข้าถึง shape ของ OLE object frame ในตัวอย่างของเรา เราใช้ไฟล์ PPTX ที่สร้างไว้ก่อนหน้านี้ซึ่งมี shape หนึ่งบนสไลด์แรก จากนั้นเราจึง cast วัตถุนี้เป็น IOleObjectFrame นี่คือ OLE object frame ที่ต้องการเข้าถึง
- เมื่อเข้าถึง OLE object frame แล้ว คุณสามารถดำเนินการใดๆ กับมันได้
- สร้างอ็อบเจกต์
Workbookและเข้าถึงข้อมูล OLE - เข้าถึง
Worksheetที่ต้องการและแก้ไขข้อมูล - บันทึก
Workbookที่อัปเดตลงในสตรีม - เปลี่ยนข้อมูล OLE object จากสตรีม
ในตัวอย่างด้านล่าง เราเข้าถึง OLE object frame (วัตถุแผนภูมิ Excel ที่ฝังในสไลด์) และแก้ไขข้อมูลไฟล์ของมันเพื่ออัปเดตข้อมูลแผนภูมิ
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());
// อ่านข้อมูล OLE object เป็นอ็อบเจกต์ Workbook.
Workbook workbook = new Workbook(oleStream);
ByteArrayOutputStream newOleStream = new ByteArrayOutputStream();
// แก้ไขข้อมูล 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);
// เปลี่ยนข้อมูลอ็อบเจกต์ OLE frame.
IOleEmbeddedDataInfo newData = new OleEmbeddedDataInfo(newOleStream.toByteArray(), oleFrame.getEmbeddedData().getEmbeddedFileExtension());
oleFrame.setEmbeddedData(newData);
}
presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();
ฝังประเภทไฟล์อื่นในสไลด์
นอกจากแผนภูมิ Excel แล้ว Aspose.Slides for Java ยังอนุญาตให้คุณฝังไฟล์ประเภทอื่นลงในสไลด์ได้ ตัวอย่างเช่น คุณสามารถแทรกไฟล์ HTML, PDF, และ ZIP เป็นวัตถุได้ เมื่อผู้ใช้ดับเบิลคลิกที่วัตถุที่แทรกไว้ มันจะเปิดโดยอัตโนมัติในโปรแกรมที่เกี่ยวข้อง หรือผู้ใช้จะถูกถามให้เลือกโปรแกรมที่เหมาะสมเพื่อเปิดไฟล์นั้น
โค้ด Java นี้แสดงวิธีการฝัง HTML และ ZIP ลงในสไลด์:
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();
ตั้งค่าชนิดไฟล์สำหรับวัตถุที่ฝัง
เมื่อทำงานกับพรีเซนเทชัน คุณอาจต้องการแทนที่ OLE object เก่าโดยอันใหม่หรือแทนที่ OLE object ที่ไม่รองรับด้วยอันที่รองรับ Aspose.Slides for Java อนุญาตให้คุณตั้งค่าชนิดไฟล์สำหรับวัตถุที่ฝัง เพื่อให้คุณสามารถอัปเดตข้อมูลของ OLE frame หรือส่วนขยายของมันได้
โค้ด Java นี้แสดงวิธีการตั้งค่าชนิดไฟล์สำหรับ OLE object ที่ฝังเป็น 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);
// Change the file type to ZIP.
oleFrame.setEmbeddedData(new OleEmbeddedDataInfo(fileData, "zip"));
presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();
ตั้งค่าภาพไอคอนและชื่อสำหรับวัตถุที่ฝัง
หลังจากฝัง OLE object แล้ว การแสดงตัวอย่างที่ประกอบด้วยภาพไอคอนจะถูกเพิ่มโดยอัตโนมัติ การแสดงตัวอย่างนี้คือสิ่งที่ผู้ใช้เห็นก่อนเข้าถึงหรือเปิด OLE object หากคุณต้องการใช้ภาพและข้อความเฉพาะเป็นส่วนประกอบของการแสดงตัวอย่าง คุณสามารถตั้งค่าภาพไอคอนและชื่อโดยใช้ Aspose.Slides for Java
โค้ด Java นี้แสดงวิธีการตั้งค่าภาพไอคอนและชื่อสำหรับวัตถุที่ฝัง:
Presentation presentation = new Presentation("sample.pptx");
ISlide slide = presentation.getSlides().get_Item(0);
IOleObjectFrame oleFrame = (IOleObjectFrame) slide.getShapes().get_Item(0);
// เพิ่มภาพไปยังทรัพยากรของพรีเซนเทชัน.
byte[] imageData = Files.readAllBytes(Paths.get("image.png"));
IPPImage oleImage = presentation.getImages().addImage(imageData);
// ตั้งชื่อและภาพสําหรับการแสดงตัวอย่าง OLE.
oleFrame.setSubstitutePictureTitle("My title");
oleFrame.getSubstitutePictureFormat().getPicture().setImage(oleImage);
oleFrame.setObjectIcon(true);
presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();
ป้องกันไม่ให้ OLE Object Frame ถูกปรับขนาดและย้ายตำแหน่ง
หลังจากคุณเพิ่ม OLE object ที่เชื่อมโยงไปยังสไลด์พรีเซนเทชันแล้ว เมื่อเปิดพรีเซนเทชันใน PowerPoint คุณอาจพบข้อความให้ทำการอัปเดตลิงก์ การคลิกปุ่ม “Update Links” อาจทำให้ขนาดและตำแหน่งของ OLE object frame เปลี่ยนแปลง เพราะ PowerPoint จะอัปเดตข้อมูลจาก OLE object ที่เชื่อมโยงและรีเฟรชการแสดงตัวอย่างของวัตถุ เพื่อป้องกันไม่ให้ PowerPoint เตือนให้ทำการอัปเดตข้อมูลของวัตถุ ให้ตั้งค่าเมธอด setUpdateAutomatic ของอินเทอร์เฟซ IOleObjectFrame เป็น false:
oleFrame.setUpdateAutomatic(false);
สกัดไฟล์ที่ฝัง
Aspose.Slides for Java อนุญาตให้คุณสกัดไฟล์ที่ฝังอยู่ในสไลด์เป็น OLE objects ได้ดังนี้:
- สร้างอินสแตนซ์ของคลาส Presentation ที่มี OLE objects ที่คุณต้องการสกัด
- วนลูปผ่าน shape ทั้งหมดในพรีเซนเทชันและเข้าถึง shape ของ OLEObjectFrame
- เข้าถึงข้อมูลของไฟล์ที่ฝังจาก OLE object frames แล้วบันทึกลงดิสก์
โค้ด Java นี้แสดงวิธีการสกัดไฟล์ที่ฝังในสไลด์เป็น OLE objects:
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
เนื้อหา OLE จะถูกเรนเดอร์เมื่อส่งออกสไลด์เป็น PDF/รูปภาพหรือไม่?
สิ่งที่มองเห็นบนสไลด์คือสิ่งที่ถูกเรนเดอร์—ไอคอน/รูปภาพแทน (preview) เนื้อหา OLE แบบ “live” ไม่ถูกประมวลผลขณะเรนเดอร์ หากต้องการ ให้ตั้งค่าภาพ preview ของคุณเองเพื่อให้แน่ใจว่าปรากฏตามที่คาดใน PDF ที่ส่งออก
จะล็อก OLE object บนสไลด์เพื่อให้ผู้ใช้ไม่สามารถย้าย/แก้ไขมันใน PowerPoint อย่างไร?
ล็อก shape: Aspose.Slides มี shape-level locks ซึ่งไม่ใช่การเข้ารหัส แต่ช่วยป้องกันการแก้ไขหรือการย้ายโดยไม่ได้ตั้งใจได้อย่างมีประสิทธิภาพ
ทำไม OLE object Excel ที่เชื่อมโยงจึง “กระโดด” หรือเปลี่ยนขนาดเมื่อเปิดพรีเซนเทชัน?
PowerPoint อาจรีเฟรช preview ของ OLE ที่เชื่อมโยง เพื่อให้รูปแบบคงที่ ให้ทำตามแนวทางใน Working Solution for Worksheet Resizing — ปรับเฟรมให้พอดีกับช่วงข้อมูล หรือสเกลช่วงให้เข้ากับเฟรมคงที่และตั้งค่าภาพแทนที่เหมาะสม
เส้นทาง relative สำหรับ OLE objects ที่เชื่อมโยงจะคงอยู่ในรูปแบบ PPTX หรือไม่?
ใน PPTX ข้อมูล “relative path” ไม่สามารถใช้ได้—มีเฉพาะเส้นทางเต็มเท่านั้น เส้นทาง relative พบได้ในรูปแบบ PPT เก่า สำหรับการพกพา ควรใช้เส้นทาง absolute ที่เชื่อถือได้/URI ที่เข้าถึงได้หรือการฝังไฟล์