PPTXにおけるチャートのリサイズのための作業ソリューション
背景
前の記事 では、Aspose.Cells for Javaを使用してExcelチャートを作成する方法と、そのチャートをAspose.Slides for Javaを使用してPowerPointプレゼンテーションに埋め込む方法について説明しました。オブジェクト変更問題 に対処するために、チャート画像をチャートOLEオブジェクトフレームに割り当てました。出力プレゼンテーションでは、チャート画像を表示しているOLEオブジェクトフレームをダブルクリックすると、Excelチャートがアクティブになります。エンドユーザーは、実際のExcelワークブックで必要な変更を行い、アクティブ化されたExcelワークブックの外をクリックすることで関係するスライドに戻ります。ユーザーがスライドに戻ると、OLEオブジェクトフレームのサイズが変更されます。リサイズの要因は、OLEオブジェクトフレームのサイズと埋め込まれたExcelワークブックのサイズによって異なります。
リサイズの原因
Excelワークブックは独自のウィンドウサイズを持っているため、初回アクティベーション時に元のサイズを保持しようとします。一方で、OLEオブジェクトフレームは独自のサイズを持ちます。Microsoftによれば、Excelワークブックがアクティベートされると、ExcelとPowerPointがサイズを交渉し、埋め込み操作の一部として正しい比率になっていることを確認します。ExcelウィンドウのサイズとOLEオブジェクトフレームのサイズ/位置の違いに基づいて、リサイズが発生します。
作業ソリューション
Aspose.Slides for Javaを使用して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オブジェクトフレームを希望するとしましょう。次のコードスニペットでは、スライドのx軸=0.5インチ、y軸=1インチに4インチの高さと9.5インチの幅を持つOLEオブジェクトフレームを作成しました。さらに、等しいチャートのサイズ、すなわち高さ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) { | |
} | |