PPTXにおけるチャートのリサイズのための作業ソリューション

背景

前回の記事 では、Aspose.Cells for Javaを使用してExcelチャートを作成し、その後Aspose.Slides for PHPを介してPowerPointプレゼンテーションにこのチャートを埋め込む方法を説明しました。オブジェクト変更の問題 に対応するために、チャート画像をチャートOLEオブジェクトフレームに割り当てました。出力プレゼンテーションで、チャート画像を表示しているOLEオブジェクトフレームをダブルクリックすると、Excelチャートがアクティブ化されます。エンドユーザーは、実際のExcelワークブックに必要な変更を加え、その後、アクティブ化されたExcelワークブックの外側をクリックすることで関係するスライドに戻ることができます。ユーザーがスライドに戻ると、OLEオブジェクトフレームのサイズが変更されます。リサイズの係数は、OLEオブジェクトフレームと埋め込まれたExcelワークブックの異なるサイズに対して異なります。

リサイズの原因

Excelワークブックには独自のウィンドウサイズがあるため、初回のアクティベーション時に元のサイズを保持しようとします。一方で、OLEオブジェクトフレームは独自のサイズを持ちます。Microsoftによれば、Excelワークブックがアクティブ化されると、ExcelとPowerPointはサイズを交渉し、埋め込み操作の一部として正しい比率になるようにします。ExcelウィンドウのサイズとOLEオブジェクトフレームのサイズ/位置の違いに基づいて、リサイズが行われます。

作業ソリューション

Aspose.Slides for PHPを介してPowerPointプレゼンテーションを作成するための可能な2つのシナリオがあります。シナリオ1: 既存のテンプレートに基づいてプレゼンテーションを作成するシナリオ2: ゼロからプレゼンテーションを作成する。ここで提供する解決策は、両方のシナリオに有効です。すべての解決策アプローチの基本は同じです。つまり、埋め込まれたOLEオブジェクトウィンドウのサイズは、PowerPointスライド内のOLEオブジェクトフレームのサイズと同じであるべきです。 それでは、解決策の2つのアプローチについて議論します。

最初のアプローチ

このアプローチでは、埋め込まれたExcelワークブックのウィンドウサイズをPowerPointスライド内のOLEオブジェクトフレームのサイズに等しく設定する方法を学びます。シナリオ1テンプレートが定義されていて、このテンプレートに基づいてプレゼンテーションを作成したいとしましょう。例えば、テンプレートのインデックス2にOLEフレームを配置したい形状があると仮定します。このシナリオでは、OLEオブジェクトフレームのサイズは事前定義されているもの(テンプレートのインデックス2にある形状のサイズ)と見なされます。すべての操作として、ワークブックのウィンドウサイズを形状のサイズと等しく設定する必要があります。以下のコードスニペットがこの目的に役立ちます。

try {
//set window width of the workbook in inches (divided by 576 as PowerPoint uses
//576 pixels / inch)
wb.getSettings().setWindowWidthInch(slide.getShapes().get_Item(2).getWidth()/72f);
//set window height of the workbook in inches
wb.getSettings().setWindowHeightInch(slide.getShapes().get_Item(2).getHeight()/72f);
//Save Workbook to Stream
ByteArrayOutputStream wbStream=new ByteArrayOutputStream();
wb.save(wbStream,com.aspose.cells.SaveFormat.EXCEL_97_TO_2003);
//Create an OLE Object Frame with embedded Excel
IOleObjectFrame oof = slide.getShapes().addOleObjectFrame(
slide.getShapes().get_Item(2).getX(),
slide.getShapes().get_Item (2).getY(),
slide.getShapes().get_Item (2).getWidth(),
slide.getShapes().get_Item (2).getHeight(), "Excel.Sheet.8", wbStream.toByteArray());
} catch (Exception e) {
}

**シナリオ2 **ゼロからプレゼンテーションを作成し、埋め込まれたExcelワークブックを持つ任意のサイズのOLEオブジェクトフレームを希望するとしましょう。以下のコードスニペットでは、x軸=0.5インチ、y軸=1インチで、高さ4インチ、幅9.5インチのOLEオブジェクトフレームをスライドに作成しました。さらに、等しいExcelワークブックのウィンドウサイズ、高さ4インチ、幅9.5インチを設定しました。

try {
//Our desired height
int desiredHeight = 288;////4 inch (4 * 72)
//Our desired width
int desiredWidth = 684;////9.5 inch (9.5 * 72)
//define chart size with window
chart.setSizeWithWindow(true);
//set window width of the workbook in inches (divided by 576 as PowerPoint uses
//576 pixels / inch)
wb.getSettings().setWindowWidthInch(desiredHeight/72f);
//set window height of the workbook in inches
wb.getSettings().setWindowHeightInch(desiredWidth/72f);
//Save Workbook to Stream
ByteArrayOutputStream wbStream=new ByteArrayOutputStream();
wb.save(wbStream,com.aspose.cells.SaveFormat.EXCEL_97_TO_2003);
//Create an OLE Object Frame with embedded Excel
IOleObjectFrame oof = slide.getShapes().addOleObjectFrame(
288,
576,
desiredWidth,
desiredHeight, "Excel.Sheet.8", wbStream.toByteArray());
} catch (Exception e) {
}

第二のアプローチ

このアプローチでは、埋め込まれたExcelワークブックに存在するチャートのサイズをPowerPointスライド内のOLEオブジェクトフレームのサイズに等しく設定する方法を学びます。このアプローチは、チャートのサイズが事前に知られていて、変更されることがない場合に役立ちます。シナリオ1テンプレートが定義されていて、このテンプレートに基づいてプレゼンテーションを作成したいとしましょう。例えば、テンプレートのインデックス2にOLEフレームを配置したい形状があると仮定します。このシナリオでは、OLEフレームのサイズは事前定義されているもの(テンプレートのインデックス2にある形状のサイズ)と見なされます。すべての操作として、ワークブック内のチャートのサイズを形状のサイズと等しく設定する必要があります。以下のコードスニペットがこの目的に役立ちます。

try {
//define chart size with window
chart.setSizeWithWindow(false);
//set chart width in pixels (Multiply by 96 as Excel uses 96 pixels per inch)
chart.getChartObject().setWidth((int)((slide.getShapes().get_Item(2).getWidth() / 72f) * 96f));
//set chart height in pixels
chart.getChartObject().setHeight((int)((slide.getShapes().get_Item(2).getHeight() / 72f) * 96f));
//Define chart print size
chart.setPrintSize(PrintSizeType.CUSTOM);
//Save Workbook to Stream
ByteArrayOutputStream wbStream=new ByteArrayOutputStream();
wb.save(wbStream,com.aspose.cells.SaveFormat.EXCEL_97_TO_2003);
//Create an OLE Object Frame with embedded Excel
IOleObjectFrame oof = slide.getShapes().addOleObjectFrame(
slide.getShapes().get_Item(2).getX(),
slide.getShapes().get_Item (2).getY(),
slide.getShapes().get_Item (2).getWidth(),
slide.getShapes().get_Item (2).getHeight(), "Excel.Sheet.8", wbStream.toByteArray());
} catch (Exception e) {
}

シナリオ2ゼロからプレゼンテーションを作成し、埋め込まれたExcelワークブックを持つ任意のサイズのOLEオブジェクトフレームを希望するとしましょう。以下のコードスニペットでは、高さ4インチ、幅9.5インチのOLEオブジェクトフレームをスライドに作成しました。x軸=0.5インチ、y軸=1インチで、さらに、等しいチャートサイズ、高さ4インチ、幅9.5インチを設定しました。

try {
//Our desired height
int desiredHeight = 288;////4 inch (4 * 72)
//Our desired width
int desiredWidth = 684;////9.5 inch (9.5 * 72)
//define chart size with window
chart.setSizeWithWindow(false);
//set chart width in pixels (Multiply by 96 as Excel uses 96 pixels per inch)
chart.getChartObject().setWidth((int)((slide.getShapes().get_Item(2).getWidth() / 576f) * 96f));
//set chart height in pixels
chart.getChartObject().setHeight((int)((slide.getShapes().get_Item(2).getHeight() / 576f) * 96f));
//Save Workbook to Stream
ByteArrayOutputStream wbStream=new ByteArrayOutputStream();
wb.save(wbStream,com.aspose.cells.SaveFormat.EXCEL_97_TO_2003);
//Create an OLE Object Frame with embedded Excel
IOleObjectFrame oof = slide.getShapes().addOleObjectFrame(
288,
576,
desiredWidth,
desiredHeight, "Excel.Sheet.8", wbStream.toByteArray());
} catch (Exception e) {
}

結論