OLE kezelése prezentációkban Python használatával
Bevezetés
Note
Az OLE (Object Linking & Embedding) egy Microsoft technológia, amely lehetővé teszi, hogy egy alkalmazásban létrehozott adatokat és objektumokat egy másik alkalmazásban helyezzük el hivatkozással vagy beágyazással.Tekintsen meg egy a MS Excelben létrehozott diagramot. A diagram ezután egy PowerPoint-diára kerül. Ez az Excel-diagram OLE objektumnak tekinthető.
- Egy OLE objektum ikonként jelenhet meg. Ebben az esetben, ha duplán kattint az ikonra, a diagram a társított alkalmazásban (Excel) nyílik meg, vagy felkérik egy alkalmazás kiválasztására az objektum megnyitásához vagy szerkesztéséhez.
- Egy OLE objektum megjelenítheti saját tartalmát, például egy diagram adatait. Ebben az esetben a diagram aktiválódik a PowerPointben, betöltődik a diagram felülete, és a diagram adatait a PowerPointen belül módosíthatja.
Aspose.Slides for Python via Java lehetővé teszi OLE objektumok beillesztését a diákba OLE objektum keretként (OleObjectFrame).
OLE objektum keretek hozzáadása a diákhoz
Feltételezve, hogy már létrehozott egy diagramot a Microsoft Excelben, és azt egy OLE objektum keretként szeretné beágyazni egy diára az Aspose.Slides for Python via Java használatával, ezt az alábbi módon teheti meg:
- Hozzon létre egy példányt a Presentation osztályból.
- Szerezzen referenciát egy diára a sorszáma alapján.
- Olvassa be az Excel-fájlt bájt tömbként.
- Adja hozzá a OleObjectFrame keretet a diához, amely tartalmazza a bájt tömböt és az OLE objektum egyéb adatait.
- Írja ki a módosított prezentációt PPTX fájlként.
Az alábbi példában egy Excel-fájlból származó diagramot adtunk hozzá egy diára OLE objektum keretként az Aspose.Slides for Python via Java használatával. Megjegyzés hogy a OleEmbeddedDataInfo konstruktor a második paraméterként egy beágyazható objektum kiterjesztést vár. Ez a kiterjesztés lehetővé teszi, hogy a PowerPoint helyesen értelmezze a fájltípust, és a megfelelő alkalmazást válassza az OLE objektum megnyitásához.
from pathlib import Path
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import OleEmbeddedDataInfo, Presentation, SaveFormat
presentation = Presentation()
try:
slide_size = presentation.getSlideSize().getSize()
slide = presentation.getSlides().get_Item(0)
# Az OLE objektum adatainak előkészítése.
file_data = Path("book.xlsx").read_bytes()
file_data = jpype.JArray(jpype.JByte)(file_data)
data_info = OleEmbeddedDataInfo(file_data, "xlsx")
# Az OLE objektum keret hozzáadása a diára.
frame_width = jpype.JFloat(slide_size.getWidth())
frame_height = jpype.JFloat(slide_size.getHeight())
slide.getShapes().addOleObjectFrame(0, 0, frame_width, frame_height, data_info)
presentation.save("output.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Kapcsolt OLE objektum keretek hozzáadása
Az Aspose.Slides for Python via Java lehetővé teszi egy OleObjectFrame hozzáadását a fájlra mutató hivatkozással a beágyazott adatok helyett.
Ez a Python kód megmutatja, hogyan adjon hozzá egy OleObjectFrame keretet egy kapcsolt Excel-fájllal egy diához:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SaveFormat
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(0)
# Egy OLE objektum keret hozzáadása kapcsolt Excel fájllal.
slide.getShapes().addOleObjectFrame(20, 20, 200, 150, "Excel.Sheet.12", "book.xlsx")
presentation.save("output.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
OLE objektum keretek elérése
Ha egy OLE objektum már be van ágyazva egy diára, ezt a módot követve könnyedén megtalálhatja vagy elérheti:
- Töltsön be egy prezentációt a beágyazott OLE objektummal egy Presentation példány létrehozásával.
- Szerezzen referenciát a diára a sorszáma alapján.
- Hozzáférés a OleObjectFrame alakzathoz. A példánkban a korábban létrehozott PPTX‑et használtuk, amelyen az első dián csak egy alakzat található. Ezután ellenőriztük, hogy az objektum egy [OleObjectFrame] volt. Ez volt a kívánt OLE objektum keret, amelyet el akarunk érni.
- Miután az OLE objektum keret elérve, tetszőleges műveletet végezhet rajta.
Az alábbi példában egy OLE objektum keret (egy beágyazott Excel-diagram) és a fájladatai kerülnek elérésre.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import OleObjectFrame, Presentation
presentation = Presentation("sample.pptx")
try:
slide = presentation.getSlides().get_Item(0)
shape = slide.getShapes().get_Item(0)
if isinstance(shape, OleObjectFrame):
ole_frame = shape
# Szerezze meg a beágyazott fájl adatait.
file_data = ole_frame.getEmbeddedData().getEmbeddedFileData()
# Szerezze meg a beágyazott fájl kiterjesztését.
file_extension = ole_frame.getEmbeddedData().getEmbeddedFileExtension()
# ...
finally:
presentation.dispose()
Kapcsolt OLE objektum keret tulajdonságainak elérése
Az Aspose.Slides lehetővé teszi a kapcsolt OLE objektum keret tulajdonságainak elérését.
Ez a Python kód megmutatja, hogyan ellenőrizze, hogy egy OLE objektum kapcsolt-e, majd hogyan szerezze meg a kapcsolt fájl elérési útját:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import OleObjectFrame, Presentation
presentation = Presentation("sample.ppt")
try:
slide = presentation.getSlides().get_Item(0)
shape = slide.getShapes().get_Item(0)
if isinstance(shape, OleObjectFrame):
ole_frame = shape
# Ellenőrizze, hogy az OLE objektum kapcsolt-e.
if ole_frame.isObjectLink():
# Írja ki a kapcsolt fájl teljes elérési útját.
print("OLE object frame is linked to: " + str(ole_frame.getLinkPathLong()))
# Írja ki a kapcsolt fájl relatív útvonalát, ha van.
# Csak a PPT prezentációk tartalmazhatják a relatív útvonalat.
relative_path = ole_frame.getLinkPathRelative()
if relative_path is not None and not relative_path.isEmpty():
print("OLE object frame relative path: " + str(relative_path))
finally:
presentation.dispose()
OLE objektum adatainak módosítása
Note
Ebben a szakaszban az alábbi kódrészlet a Aspose.Cells for Python via Java használatát mutatja be.Ha egy OLE objektum már be van ágyazva egy diára, ezt a módot követve könnyedén hozzáférhet az objektumhoz és módosíthatja annak adatait:
- Töltsön be egy prezentációt a beágyazott OLE objektummal egy Presentation példány létrehozásával.
- Szerezzen referenciát a diára a sorszáma alapján.
- Hozzáférés az OLE objektum keret alakzathoz. A példánkban a korábban létrehozott PPTX‑et használtuk, amelyen az első dián egy alakzat található. Ezután ellenőriztük, hogy az objektum egy [OleObjectFrame] volt. Ez volt a kívánt OLE objektum keret, amelyet el akarunk érni.
- Miután az OLE objektum keret elérve, tetszőleges műveletet végezhet rajta.
- Hozzon létre egy Workbook objektumot, és érje el az OLE adatokat.
- Nyissa meg a kívánt Worksheet lapot, és módosítsa az adatokat.
- Mentse a frissített Workbook objektumot egy adatfolyamba.
- Módosítsa az OLE objektum adatát az adatfolyamból.
Az alábbi példában egy OLE objektum keret (egy beágyazott Excel-diagram) kerül elérésre, és a fájladatai módosulnak a diagram adatainak frissítése érdekében.
import jpade
import asposeslides
import asposecells
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import OleEmbeddedDataInfo, OleObjectFrame, Presentation, SaveFormat
from asposecells.api import Workbook, OoxmlSaveOptions
from asposecells.api import SaveFormat as CellsSaveFormat
from java.io import ByteArrayInputStream, ByteArrayOutputStream
presentation = Presentation("sample.pptx")
try:
slide = presentation.getSlides().get_Item(0)
shape = slide.getShapes().get_Item(0)
if isinstance(shape, OleObjectFrame):
ole_frame = shape
file_data = ole_frame.getEmbeddedData().getEmbeddedFileData()
ole_stream = ByteArrayInputStream(file_data)
# Olvassa be az OLE objektum adatát Workbook objektumként.
workbook = Workbook(ole_stream)
new_ole_stream = ByteArrayOutputStream()
# A munkafüzet adatok módosítása.
cells = workbook.getWorksheets().get(0).getCells()
cells.get(0, 4).putValue("E")
cells.get(1, 4).putValue(jpype.JInt(12))
cells.get(2, 4).putValue(jpype.JInt(14))
cells.get(3, 4).putValue(jpype.JInt(15))
file_options = OoxmlSaveOptions(CellsSaveFormat.XLSX)
workbook.save(new_ole_stream, file_options)
# Az OLE keret objektum adatainak módosítása.
new_file_data = new_ole_stream.toByteArray()
new_data = OleEmbeddedDataInfo(new_file_data, ole_frame.getEmbeddedData().getEmbeddedFileExtension())
ole_frame.setEmbeddedData(new_data)
presentation.save("output.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Egyéb fájltípusok beágyazása a diákba
Az Excel-diagramokon felül az Aspose.Slides for Python via Java lehetővé teszi más fájltípusok beágyazását a diákba. Például HTML, PDF és ZIP fájlokat is beilleszthet objektumként. Ha a felhasználó duplán kattint a beillesztett objektumra, az automatikusan megnyílik a megfelelő programban, vagy a felhasználót felszólítják a megfelelő program kiválasztására.
Ez a Python kód megmutatja, hogyan ágyazzon be HTML‑t és ZIP‑et egy diába:
from pathlib import Path
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import OleEmbeddedDataInfo, Presentation, SaveFormat
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(0)
html_data = Path("sample.html").read_bytes()
html_data = jpype.JArray(jpype.JByte)(html_data)
html_data_info = OleEmbeddedDataInfo(html_data, "html")
html_ole_frame = slide.getShapes().addOleObjectFrame(150, 120, 50, 50, html_data_info)
html_ole_frame.setObjectIcon(True)
zip_data = Path("sample.zip").read_bytes()
zip_data = jpype.JArray(jpype.JByte)(zip_data)
zip_data_info = OleEmbeddedDataInfo(zip_data, "zip")
zip_ole_frame = slide.getShapes().addOleObjectFrame(150, 220, 50, 50, zip_data_info)
zip_ole_frame.setObjectIcon(True)
presentation.save("output.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Beágyazott objektumok fájltípusának beállítása
Prezentációk kezelésekor előfordulhat, hogy régi OLE objektumokat kell újakkal helyettesíteni, vagy egy nem támogatott OLE objektumot kell támogatottá változtatni. Az Aspose.Slides for Python via Java lehetővé teszi a beágyazott objektum fájltípusának beállítását, ami segít frissíteni az OLE keret adatait vagy annak kiterjesztését.
Ez a Python kód megmutatja, hogyan állítsa be egy beágyazott OLE objektum fájltípusát zip értékre:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import OleEmbeddedDataInfo, Presentation, SaveFormat
presentation = Presentation("sample.pptx")
try:
slide = presentation.getSlides().get_Item(0)
ole_frame = slide.getShapes().get_Item(0)
file_extension = ole_frame.getEmbeddedData().getEmbeddedFileExtension()
file_data = ole_frame.getEmbeddedData().getEmbeddedFileData()
print("Current embedded file extension is: " + str(file_extension))
# A fájltípus módosítása ZIP-re.
data_info = OleEmbeddedDataInfo(file_data, "zip")
ole_frame.setEmbeddedData(data_info)
presentation.save("output.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Ikonképek és címek beállítása a beágyazott objektumokhoz
Miután egy OLE objektum be van ágyazva, automatikusan hozzáadódik egy előnézet, amely egy ikonképből áll. Ez az előnézet az, amit a felhasználók látnak, mielőtt elérnék vagy megnyitnák az OLE objektumot. Ha egy konkrét képet és szöveget szeretne használni az előnézet elemeiként, beállíthatja az ikonképet és a címet az Aspose.Slides for Python via Java segítségével.
Ez a Python kód megmutatja, hogyan állítsa be az ikonképet és a címet egy beágyazott objektumhoz:
from pathlib import Path
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SaveFormat
presentation = Presentation("sample.pptx")
try:
slide = presentation.getSlides().get_Item(0)
ole_frame = slide.getShapes().get_Item(0)
# Adjon hozzá egy képet a prezentáció erőforrásaihoz.
image_data = Path("image.png").read_bytes()
image_data = jpype.JArray(jpype.JByte)(image_data)
ole_image = presentation.getImages().addImage(image_data)
# Állítson be címet és képet az OLE előnézethez.
ole_frame.setSubstitutePictureTitle("My title")
ole_frame.getSubstitutePictureFormat().getPicture().setImage(ole_image)
ole_frame.setObjectIcon(True)
presentation.save("output.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Az OLE objektum keret átméretezésének és áthelyezésének megakadályozása
Miután egy kapcsolt OLE objektumot hozzáadott egy prezentációs diához, a PowerPointben való megnyitáskor megjelenhet egy üzenet, amely a hivatkozások frissítését kéri. Az „Update Links” (Hivatkozások frissítése) gombra kattintva a OLE objektum keret mérete és pozíciója megváltozhat, mivel a PowerPoint frissíti a kapcsolt OLE objektum adatait és az előnézetet. Ahhoz, hogy a PowerPoint ne kérje az objektum adatainak frissítését, állítsa a setUpdateAutomatic metódust a OleObjectFrame osztályon False értékre:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SaveFormat
presentation = Presentation("sample.pptx")
try:
slide = presentation.getSlides().get_Item(0)
ole_frame = slide.getShapes().get_Item(0)
ole_frame.setUpdateAutomatic(False)
presentation.save("output.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Beágyazott fájlok kinyerése
Az Aspose.Slides for Python via Java lehetővé teszi a diákkba beágyazott OLE objektumként tárolt fájlok kinyerését a következő módon:
- Hozzon létre egy Presentation példányt, amely tartalmazza a kinyerni kívánt OLE objektumokat.
- Járja végig a prezentáció összes alakzatát, és érje el a OleObjectFrame alakzatokat.
- Olvassa ki a beágyazott fájlok adatait az OLE objektum keretekből, és írja őket lemezre.
Ez a Python kód megmutatja, hogyan nyerjen ki egy diára beágyazott fájlokat OLE objektumként:
from pathlib import Path
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import OleObjectFrame, Presentation
presentation = Presentation("sample.pptx")
try:
slide = presentation.getSlides().get_Item(0)
for index in range(slide.getShapes().size()):
shape = slide.getShapes().get_Item(index)
if isinstance(shape, OleObjectFrame):
ole_frame = shape
file_data = ole_frame.getEmbeddedData().getEmbeddedFileData()
file_extension = ole_frame.getEmbeddedData().getEmbeddedFileExtension()
file_path = Path(f"OLE_object_{index}.{str(file_extension).lstrip('.')}")
file_path.write_bytes(bytes(file_data))
finally:
presentation.dispose()
GYIK
Megjelenik-e az OLE tartalom a diák PDF‑re vagy képre exportálásakor?
A dián látható elem kerül renderelésre – az ikon/helyettesítő kép (előnézet). Az „élő” OLE tartalom nem hajtódik végre a renderelés során. Szükség esetén állítson be saját előnézeti képet a kívánt megjelenés biztosításához az exportált PDF‑ben.
Hogyan zárolhatok egy OLE objektumot a dián, hogy a felhasználók ne mozgathassák vagy szerkeszthessék PowerPointban?
Zárolja az alakzatot: az Aspose.Slides alakzat‑szintű zárolásokat biztosít. Ez nem titkosítás, de hatékonyan megakadályozza a véletlen szerkesztéseket és áthelyezéseket.
Miért „ugrik” vagy változik mérete egy kapcsolt Excel objektum, amikor megnyitom a prezentációt?
A PowerPoint frissítheti a kapcsolt OLE előnézetét. A stabil megjelenés érdekében kövesse a Működő megoldást a munkalap átméretezésére útmutatót – vagy illessze a keretet a tartományra, vagy méretezze a tartományt egy rögzített kerethez, és állítson be megfelelő helyettesítő képet.
Megmaradnak-e a kapcsolt OLE objektumok relatív útvonalai a PPTX formátumban?
A PPTX formátumban a „relatív útvonal” információ nem érhető el – csak a teljes útvonal tárolódik. Relatív útvonalak a régebbi PPT formátumban találhatók. A hordozhatóság érdekében használjon megbízható abszolút útvonalakat, elérhető URI‑kat vagy beágyazást.