Android のプレゼンテーションで OLE を管理

MS Excel で作成されたチャートを考えてみましょう。そのチャートが PowerPoint のスライドに配置されます。その Excel のチャートは OLE オブジェクトと見なされます。

  • OLE オブジェクトはアイコンとして表示されることがあります。この場合、アイコンをダブルクリックすると、チャートは関連付けられたアプリケーション (Excel) で開かれるか、オブジェクトの開封または編集に使用するアプリケーションを選択するよう求められます。
  • OLE オブジェクトは実際の内容(例えばチャートの内容)を表示することもあります。この場合、PowerPoint でチャートがアクティブになり、チャートのインターフェイスが読み込まれ、PowerPoint 内でチャートのデータを変更できるようになります。

Aspose.Slides for Android via Java は、スライドに OLE オブジェクトを OLE オブジェクト フレーム(OleObjectFrame)として挿入することを可能にします。

スライドへの OLE オブジェクト フレームの追加

Microsoft Excel で既にチャートを作成し、Aspose.Slides for Android via Java を使用して OLE オブジェクト フレームとしてスライドに埋め込みたい場合、次の手順で実行できます。

  1. Presentation クラスのインスタンスを作成します。
  2. インデックスを使用してスライドの参照を取得します。
  3. Excel ファイルをバイト配列として読み取ります。
  4. バイト配列および OLE オブジェクトに関するその他の情報を含む OleObjectFrame をスライドに追加します。
  5. 修正されたプレゼンテーションを PPTX ファイルとして書き出します。

以下の例では、Excel ファイルからチャートを取得し、Aspose.Slides for Android via Java を使用して OLE オブジェクト フレームとしてスライドに追加しています。
Note: OleEmbeddedDataInfo コンストラクタは、2 番目のパラメータとして埋め込み可能オブジェクトの拡張子を受け取ります。この拡張子により、PowerPoint はファイルタイプを正しく解釈し、この OLE オブジェクトを開く適切なアプリケーションを選択できます。

Presentation presentation = new Presentation();
SizeF slideSize = presentation.getSlideSize().getSize();
ISlide slide = presentation.getSlides().get_Item(0);

// 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");

// OLE オブジェクト フレームをスライドに追加します。
slide.getShapes().addOleObjectFrame(0, 0, slideSize.getWidth(), slideSize.getHeight(), dataInfo);

presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();

リンクされた OLE オブジェクト フレームの追加

Aspose.Slides for Android via Java を使用すると、データを埋め込まずにファイルへのリンクだけで OleObjectFrame を追加できます。

この Java コードは、リンクされた Excel ファイルを使用して OleObjectFrame をスライドに追加する方法を示しています。

Presentation presentation = new Presentation();
ISlide slide = presentation.getSlides().get_Item(0);

// リンクされた Excel ファイルを持つ OLE オブジェクト フレームを追加します。
slide.getShapes().addOleObjectFrame(20, 20, 200, 150, "Excel.Sheet.12", "book.xlsx");

presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();

OLE オブジェクト フレームへのアクセス

スライドに OLE オブジェクトが既に埋め込まれている場合、次の手順で簡単に検索またはアクセスできます。

  1. 埋め込まれた OLE オブジェクトを含むプレゼンテーションを、Presentation クラスのインスタンスを作成して読み込みます。
  2. インデックスを使用してスライドの参照を取得します。
  3. OleObjectFrame シェイプにアクセスします。例では、最初のスライドに 1 つだけシェイプがある以前に作成した PPTX を使用しました。そのオブジェクトを IOleObjectFrameキャストし、目的の OLE オブジェクト フレームにアクセスしました。
  4. OLE オブジェクト フレームにアクセスしたら、任意の操作を実行できます。

以下の例では、OLE オブジェクト フレーム(スライドに埋め込まれた 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();

    // ...
}

リンクされた OLE オブジェクト フレームのプロパティへのアクセス

Aspose.Slides を使用すると、リンクされた OLE オブジェクト フレームのプロパティにアクセスできます。

この Java コードは、OLE オブジェクトがリンクされているかどうかを確認し、リンクされたファイルへのパスを取得する方法を示しています。

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 オブジェクトがリンクされているか確認します。
    if (oleFrame.isObjectLink()) {
        // リンクされたファイルへのフルパスを出力します。
        System.out.println("OLE object frame is linked to: " + oleFrame.getLinkPathLong());

        // 存在する場合、リンクされたファイルへの相対パスを出力します。
        // 相対パスは PPT プレゼンテーションにだけ含まれます。
        if (oleFrame.getLinkPathRelative() != null && !oleFrame.getLinkPathRelative().isEmpty()) {
            System.out.println("OLE object frame relative path: " + oleFrame.getLinkPathRelative());
        }
    }
}

presentation.dispose();

OLE オブジェクト データの変更

スライドに OLE オブジェクトが既に埋め込まれている場合、次の手順でそのオブジェクトにアクセスし、データを変更できます。

  1. 埋め込まれた OLE オブジェクトを含むプレゼンテーションを、Presentation クラスのインスタンスを作成して読み込みます。
  2. インデックスを使用してスライドの参照を取得します。
  3. OLE オブジェクト フレーム シェイプにアクセスします。例では、最初のスライドに 1 つだけシェイプがある PPTX を使用し、そのオブジェクトを IOleObjectFrameキャストしました。
  4. OLE オブジェクト フレームにアクセスしたら、任意の操作を実行できます。
  5. Workbook オブジェクトを作成し、OLE データにアクセスします。
  6. 対象の Worksheet にアクセスし、データを修正します。
  7. 更新された Workbook をストリームに保存します。
  8. ストリームから OLE オブジェクト データを変更します。

以下の例では、OLE オブジェクト フレーム(スライドに埋め込まれた 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 オブジェクト データを Workbook オブジェクトとして読み取ります。
    Workbook workbook = new Workbook(oleStream);

    ByteArrayOutputStream newOleStream = new ByteArrayOutputStream();

    // ワークブック データを変更します。
    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 フレーム オブジェクト データを変更します。
    IOleEmbeddedDataInfo newData = new OleEmbeddedDataInfo(newOleStream.toByteArray(), oleFrame.getEmbeddedData().getEmbeddedFileExtension());
    oleFrame.setEmbeddedData(newData);
}

presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();

スライドへの他のファイルタイプの埋め込み

Excel チャートに加えて、Aspose.Slides for Android via Java は、スライドに他の種類のファイルを埋め込むことも可能です。たとえば、HTML、PDF、ZIP ファイルをオブジェクトとして挿入できます。ユーザーが挿入されたオブジェクトをダブルクリックすると、関連するプログラムで自動的に開くか、適切なプログラムの選択を促すダイアログが表示されます。

この Java コードは、HTML と ZIP をスライドに埋め込む方法を示しています。

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();

埋め込みオブジェクトのファイルタイプ設定

プレゼンテーションを扱う際、古い OLE オブジェクトを新しいものに置き換えたり、サポートされていない OLE オブジェクトをサポートされたものに差し替える必要がある場合があります。Aspose.Slides for Android via Java を使用すると、埋め込みオブジェクトのファイルタイプを設定でき、OLE フレームのデータや拡張子を更新できます。

この Java コードは、埋め込み OLE オブジェクトのファイルタイプを 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 オブジェクトを埋め込むと、自動的にアイコン画像からなるプレビューが追加されます。このプレビューは、ユーザーが OLE オブジェクトにアクセスまたは開く前に表示されるものです。特定の画像とテキストをプレビューに使用したい場合、Aspose.Slides for Android via Java を使用してアイコン画像とタイトルを設定できます。

この Java コードは、埋め込みオブジェクトのアイコン画像とタイトルを設定する方法を示しています。

Presentation presentation = new Presentation("sample.pptx");
ISlide slide = presentation.getSlides().get_Item(0);
IOleObjectFrame oleFrame = (IOleObjectFrame) slide.getShapes().get_Item(0);

// プレゼンテーションリソースに画像を追加します。
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);

// OLE プレビュー用にタイトルと画像を設定します。
oleFrame.setSubstitutePictureTitle("My title");
oleFrame.getSubstitutePictureFormat().getPicture().setImage(oleImage);
oleFrame.setObjectIcon(true);

presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();

OLE オブジェクト フレームのサイズ変更と位置変更の防止

リンクされた OLE オブジェクトをプレゼンテーション スライドに追加した後、PowerPoint でプレゼンテーションを開くと、リンクの更新を求めるメッセージが表示されることがあります。「Update Links」ボタンをクリックすると、PowerPoint がリンクされた OLE オブジェクトからデータを更新し、オブジェクトのプレビューを再描画するため、OLE オブジェクト フレームのサイズや位置が変更される場合があります。PowerPoint がオブジェクトのデータ更新を促さないようにするには、IOleObjectFrame インターフェイスの setUpdateAutomatic メソッドを false に設定します。

oleFrame.setUpdateAutomatic(false);

埋め込みファイルの抽出

Aspose.Slides for Android via Java を使用すると、スライドに埋め込まれたファイルを OLE オブジェクトとして次の手順で抽出できます。

  1. 抽出したい OLE オブジェクトを含む Presentation クラスのインスタンスを作成します。
  2. プレゼンテーション内のすべてのシェイプをループし、OLEObjectFrame シェイプにアクセスします。
  3. OLE オブジェクト フレームから埋め込みファイルのデータにアクセスし、ディスクに書き出します。

この Java コードは、スライドに埋め込まれたファイルを 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

スライドを PDF/画像にエクスポートする際、OLE コンテンツはレンダリングされますか?

スライド上に表示されているもの、すなわちアイコン/代替画像(プレビュー)がレンダリングされます。ライブの OLE コンテンツはレンダリング時に実行されません。必要に応じて、独自のプレビュー画像を設定すれば、エクスポートされた PDF で期待通りの外観を確保できます。

PowerPoint でユーザーがスライド上の OLE オブジェクトを移動・編集できないようにロックするにはどうすればよいですか?

シェイプをロックします。Aspose.Slides はシェイプレベルのロック機能を提供しています。これは暗号化ではありませんが、誤って編集や移動することを実質的に防止できます。

リンクされた Excel オブジェクトがプレゼンテーションを開くと「ジャンプ」したりサイズが変わったりするのはなぜですか?

PowerPoint はリンクされた OLE のプレビューを更新することがあります。安定した外観を保つには、Working Solution for Worksheet Resizing の手順に従い、フレームを範囲に合わせるか、範囲を固定フレームにスケーリングし、適切な代替画像を設定してください。

リンクされた OLE オブジェクトの相対パスは PPTX 形式で保持されますか?

PPTX では「相対パス」情報は保持されず、フルパスのみが記録されます。相対パスは旧来の PPT 形式でのみ使用可能です。移植性を考慮する場合、信頼できる絶対パスやアクセス可能な URI、あるいは埋め込みを使用することを推奨します。