จัดการ OLE ในพรีเซนเทชันโดยใช้ Python
บทนำ
Info
OLE (Object Linking & Embedding) เป็นเทคโนโลยีของ Microsoft ที่ช่วยให้ข้อมูลและวัตถุที่สร้างในแอปพลิเคชันหนึ่งสามารถลิงก์หรือฝังในแอปพลิเคชันอื่นได้เช่น ตัวอย่างเช่น แผนภูมิที่สร้างใน Microsoft Excel แล้ววางบนสไลด์ PowerPoint คือวัตถุ OLE
- OLE object อาจปรากฏเป็นไอคอน การคลิกสองครั้งที่ไอคอนจะเปิดวัตถุในแอปพลิเคชันที่เชื่อมโยง (เช่น Excel) หรือให้คุณเลือกแอปเพื่อเปิดหรือแก้ไขมัน
- OLE object อาจแสดงเนื้อหา (เช่น แผนภูมิ) ในกรณีนี้ PowerPoint จะทำให้วัตถุที่ฝังทำงาน โหลดอินเทอร์เฟซแผนภูมิ และอนุญาตให้คุณแก้ไขข้อมูลของแผนภูมิภายใน PowerPoint
Aspose.Slides for Python ช่วยให้คุณแทรก OLE objects ลงในสไลด์เป็น OLE object frames (OleObjectFrame)
เพิ่มวัตถุ OLE ลงในสไลด์
หากคุณได้สร้างแผนภูมิใน Microsoft Excel แล้วต้องการฝังมันในสไลด์เป็น OLE object frame โดยใช้ Aspose.Slides for Python ให้ทำตามขั้นตอนต่อไปนี้:
- สร้างอินสแตนซ์ของคลาส Presentation
- รับอ้างอิงไปยังสไลด์ตามดัชนีของมัน
- อ่านไฟล์ Excel เป็นอาเรย์ไบต์
- เพิ่ม OleObjectFrame ลงในสไลด์ โดยส่งอาเรย์ไบต์และรายละเอียดอื่นๆ ของวัตถุ OLE
- บันทึกพรีเซนเทชันที่แก้ไขเป็นไฟล์ PPTX
ในตัวอย่างด้านล่าง แผนภูมิจากไฟล์ Excel ถูกฝังในสไลด์เป็น OleObjectFrame
หมายเหตุ: ตัวสร้าง OleEmbeddedDataInfo รับส่วนขยายไฟล์ของวัตถุที่ฝังเป็นพารามิเตอร์ที่สอง PowerPoint ใช้ส่วนขยายนี้เพื่อระบุประเภทไฟล์และเลือกแอปพลิเคชันที่เหมาะสมในการเปิด OLE object
with slides.Presentation() as presentation:
slide_size = presentation.slide_size.size
slide = presentation.slides[0]
# เตรียมข้อมูลสำหรับวัตถุ OLE.
with open("book.xlsx", "rb") as file_stream:
file_data = file_stream.read()
data_info = slides.dom.ole.OleEmbeddedDataInfo(file_data, "xlsx")
# เพิ่มกรอบวัตถุ OLE ลงในสไลด์.
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)
เพิ่มวัตถุ OLE เชื่อมโยง
Aspose.Slides for Python ช่วยให้คุณเพิ่ม OleObjectFrame ที่ลิงก์ไปยังไฟล์แทนการฝังข้อมูลของมัน
ตัวอย่าง Python ต่อไปนี้แสดงวิธีเพิ่ม OleObjectFrame ที่ลิงก์ไปยังไฟล์ Excel บนสไลด์:
with slides.Presentation() as presentation:
slide = presentation.slides[0]
# เพิ่มกรอบวัตถุ OLE พร้อมไฟล์ Excel ที่เชื่อมโยง.
slide.shapes.add_ole_object_frame(20, 20, 200, 150, "Excel.Sheet.12", "book.xlsx")
presentation.save("output.pptx", slides.export.SaveFormat.PPTX)
เข้าถึงวัตถุ OLE
หากวัตถุ OLE ได้ถูกฝังไว้ในสไลด์แล้ว คุณสามารถเข้าถึงได้ตามขั้นตอนต่อไปนี้:
- โหลดพรีเซนเทชันที่มีวัตถุ OLE ฝังอยู่โดยสร้างอินสแตนซ์ของคลาส Presentation
- รับอ้างอิงไปยังสไลด์ตามดัชนีของมัน
- เข้าถึงรูปร่าง OleObjectFrame
- เมื่อคุณมีกรอบวัตถุ OLE แล้วให้ดำเนินการที่ต้องการกับมัน
ตัวอย่างด้านล่างเข้าถึง OLE object frame — แผนภูมิ Excel ที่ฝังอยู่ — และดึงข้อมูลไฟล์ของมัน ในตัวอย่างนี้เราใช้ PPTX ที่มีรูปร่างเดียวบนสไลด์แรก
with slides.Presentation("sample.pptx") as presentation:
slide = presentation.slides[0]
shape = slide.shapes[0]
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
# ...
เข้าถึงคุณสมบัติวัตถุ OLE เชื่อมโยง
Aspose.Slides ให้คุณเข้าถึงคุณสมบัติของกรอบวัตถุ OLE เชื่อมโยง
ตัวอย่าง Python ด้านล่างตรวจสอบว่าวัตถุ OLE ถูกลิงก์หรือไม่ และหากใช่จะดึงเส้นทางไปยังไฟล์ที่ลิงก์ไว้:
with slides.Presentation("sample.ppt") as presentation:
slide = presentation.slides[0]
shape = slide.shapes[0]
if isinstance(shape, slides.OleObjectFrame):
ole_frame = shape
# ตรวจสอบว่าวัตถุ OLE ถูกลิงก์หรือไม่.
if ole_frame.is_object_link:
# พิมพ์เส้นทางเต็มของไฟล์ที่ลิงก์.
print("OLE object frame is linked to:", ole_frame.link_path_long)
# พิมพ์เส้นทางสัมพันธ์ของไฟล์ที่ลิงก์ หากมี.
# เฉพาะพรีเซนเทชัน .ppt เท่านั้นที่สามารถมีเส้นทางสัมพันธ์ได้.
if ole_frame.link_path_relative:
print("OLE object frame relative path:", ole_frame.link_path_relative)
เปลี่ยนข้อมูลวัตถุ OLE
หากวัตถุ OLE ได้ถูกฝังอยู่ในสไลด์แล้ว คุณสามารถเข้าถึงและแก้ไขข้อมูลของมันได้ตามขั้นตอนต่อไปนี้:
- โหลดพรีเซนเทชันโดยสร้างอินสแตนซ์ของคลาส Presentation
- รับสไลด์เป้าหมายตามดัชนีของมัน
- เข้าถึงรูปร่าง OleObjectFrame
- เมื่อคุณมีกรอบวัตถุ OLE แล้วให้ดำเนินการที่จำเป็นกับมัน
- สร้างอ็อบเจกต์
Workbookแล้วอ่านข้อมูล OLE - เปิด
Worksheetที่ต้องการและแก้ไขข้อมูล - บันทึก
Workbookที่อัปเดตลงสตรีม - แทนที่ข้อมูลของวัตถุ OLE ด้วยสตรีมนั้น
ในตัวอย่างด้านล่างกรอบวัตถุ OLE (แผนภูมิ Excel ที่ฝัง) ถูกเข้าถึงและข้อมูลไฟล์ของมันถูกแก้ไขเพื่ออัปเดตแผนภูมิ ตัวอย่างใช้ PPTX ที่สร้างไว้ก่อนหน้านี้ซึ่งมีรูปร่างเดียวบนสไลด์แรก
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:
# อ่านข้อมูลวัตถุ OLE เป็นออบเจ็กต์ Workbook.
workbook = cells.Workbook(ole_stream)
with io.BytesIO() as new_ole_stream:
# แก้ไขข้อมูล workbook.
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)
# เปลี่ยนข้อมูลออบเจ็กต์ของกรอบ 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)
ฝังไฟล์ในสไลด์
นอกจากแผนภูมิ Excel แล้ว Aspose.Slides for Python ยังให้คุณฝังไฟล์ประเภทอื่นในสไลด์ได้ เช่น คุณสามารถแทรกไฟล์ HTML, PDF และ ZIP เป็นวัตถุได้ เมื่อผู้ใช้คลิกสองครั้งที่วัตถุที่แทรกเข้ามา ระบบจะเปิดโดยอัตโนมัติในแอปพลิเคชันที่เชื่อมโยง หรือจะแจ้งให้ผู้ใช้เลือกโปรแกรมที่เหมาะสม
โค้ด Python นี้แสดงวิธีฝังไฟล์ HTML และ ZIP ลงในสไลด์:
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)
กำหนดประเภทไฟล์สำหรับวัตถุที่ฝัง
เมื่อต้องทำงานกับพรีเซนเทชัน คุณอาจต้องการแทนที่วัตถุ OLE เก่าด้วยวัตถุใหม่ หรือสลับวัตถุ OLE ที่ไม่รองรับเป็นวัตถุที่รองรับ Aspose.Slides for Python ให้คุณกำหนดประเภทไฟล์ของวัตถุที่ฝัง เพื่ออัปเดตข้อมูลเฟรม OLE หรือส่วนขยายไฟล์ของมันได้
โค้ด Python นี้แสดงวิธีกำหนดประเภทไฟล์ของวัตถุ OLE ที่ฝังเป็น zip:
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}")
# เปลี่ยนประเภทไฟล์เป็น ZIP.
ole_frame.set_embedded_data(slides.dom.ole.OleEmbeddedDataInfo(file_data, "zip"))
presentation.save("output.pptx", slides.export.SaveFormat.PPTX)
ตั้งค่าภาพไอคอนและชื่อสำหรับวัตถุที่ฝัง
หลังจากที่คุณฝังวัตถุ OLE แล้ว ระบบจะเพิ่มตัวอย่างภาพไอคอนโดยอัตโนมัติ ตัวอย่างภาพนี้คือสิ่งที่ผู้ใช้เห็นก่อนเข้าถึงหรือเปิดวัตถุ OLE หากคุณต้องการใช้ภาพและข้อความเฉพาะในตัวอย่างภาพ คุณสามารถตั้งค่าภาพไอคอนและชื่อได้โดยใช้ Aspose.Slides for Python
โค้ด Python นี้แสดงวิธีตั้งค่าภาพไอคอนและชื่อสำหรับวัตถุที่ฝัง:
with slides.Presentation("sample.pptx") as presentation:
slide = presentation.slides[0]
ole_frame = slide.shapes[0]
# เพิ่มภาพไปยังทรัพยากรพรีเซนเทชัน.
with slides.Images.from_file("image.png") as image:
ole_image = presentation.images.add_image(image)
# ตั้งค่าชื่อและภาพสำหรับตัวอย่าง 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)
ป้องกันไม่ให้กรอบวัตถุ OLE ถูกปรับขนาดและย้ายตำแหน่ง
หลังจากที่คุณเพิ่มวัตถุ OLE เชื่อมโยงลงในสไลด์ PowerPoint อาจแจ้งให้คุณอัปเดตลิงก์เมื่อเปิดพรีเซนเทชัน การเลือก “Update Links” สามารถทำให้ขนาดและตำแหน่งของกรอบวัตถุ OLE เปลี่ยนแปลงได้ เนื่องจาก PowerPoint รีเฟรชตัวอย่างด้วยข้อมูลจากวัตถุที่ลิงก์ เพื่อป้องกันไม่ให้ PowerPoint แจ้งให้คุณอัปเดตข้อมูลของวัตถุ ให้ตั้งค่า update_automatic ของคลาส OleObjectFrame เป็น False:
ole_frame.update_automatic = False
สกัดไฟล์ที่ฝังไว้
Aspose.Slides for Python ให้คุณสกัดไฟล์ที่ฝังในสไลด์เป็น OLE objects ได้ตามขั้นตอนต่อไปนี้:
- สร้างอินสแตนซ์ของคลาส Presentation ที่มี OLE objects ที่คุณต้องการสกัด
- วนลูปผ่านรูปร่างทั้งหมดในพรีเซนเทชันและค้นหารูปร่าง OLEObjectFrame
- ดึงข้อมูลไฟล์ที่ฝังจากแต่ละ [OLEObjectFrame] แล้วเขียนลงดิสก์
โค้ด Python ต่อไปนี้แสดงวิธีสกัดไฟล์ที่ฝังในสไลด์เป็น OLE objects:
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
จะมีการเรนเดอร์เนื้อหา OLE เมื่อส่งออกสไลด์เป็น PDF/ภาพหรือไม่?
สิ่งที่มองเห็นได้บนสไลด์จะถูกเรนเดอร์ — ไอคอน/ภาพแทน (preview) เนื้อหา OLE “สด” จะไม่ถูกประมวลผลระหว่างการเรนเดอร์ หากต้องการ ให้ตั้งค่าภาพตัวอย่างของคุณเองเพื่อให้แน่ใจว่าปรากฏอย่างที่คาดหวังใน PDF ที่ส่งออก
ฉันจะล็อกวัตถุ OLE บนสไลด์เพื่อให้ผู้ใช้ไม่สามารถย้าย/แก้ไขได้ใน PowerPoint อย่างไร?
ล็อกรูปทรง: Aspose.Slides มี shape-level locks ซึ่งไม่ใช่การเข้ารหัส แต่ช่วยป้องกันการแก้ไขหรือการย้ายโดยบังเอิญได้อย่างมีประสิทธิภาพ
ทำไมวัตถุ Excel ที่เชื่อมโยง “กระโดด” หรือเปลี่ยนขนาดเมื่อฉันเปิดพรีเซนเทชัน?
PowerPoint อาจรีเฟรชตัวอย่างของ OLE ที่เชื่อมโยง เพื่อให้การแสดงผลคงที่ให้ทำตามแนวทางของ Working Solution for Worksheet Resizing — ปรับกรอบให้พอดีกับช่วงข้อมูล หรือปรับสเกลช่วงให้พอดีกับกรอบคงที่และตั้งค่าภาพแทนที่เหมาะสม
เส้นทางสัมพันธ์สำหรับวัตถุ OLE ที่เชื่อมโยงจะถูกเก็บไว้ในรูปแบบ PPTX หรือไม่?
ใน PPTX ข้อมูล “relative path” ไม่พร้อมใช้งาน — มีเพียงเส้นทางเต็มเท่านั้น เส้นทางสัมพันธ์พบได้ในรูปแบบ PPT เก่า เพื่อความพกพา ให้ใช้เส้นทางแบบเต็มที่เชื่อถือได้/URI ที่เข้าถึงได้หรือฝังไฟล์แทน