Рабочее решение для изменения размера графиков в PPTX

Предыстория

В предыдущей статье мы объяснили, как создать график Excel с использованием Aspose.Cells для Java и затем встроить этот график в презентацию PowerPoint с помощью Aspose.Slides для PHP через Java. Для решения проблемы изменения объекта мы назначили изображение графика ОLE-объекту. В итоговой презентации, когда мы дважды щелкаем на OLE-объекте, показывающем изображение графика, активируется график Excel. Конечные пользователи могут вносить любые изменения в фактическую книгу Excel, а затем вернуться к соответствующему слайду, щелкнув за пределами активной книги Excel. Размер OLE-объекта изменится, когда пользователь вернется к слайду. Фактор изменения размера будет различаться для разных размеров OLE-объекта и встроенной книги Excel.

Причина изменения размера

Поскольку книга Excel имеет свой собственный размер окна, она пытается сохранить свой первоначальный размер при первом активации. С другой стороны, OLE-объект будет иметь свой собственный размер. По словам Microsoft, при активации книги Excel, Excel и PowerPoint договариваются о размере и обеспечивают его правильные пропорции в рамках операции встраивания. На основании различий между размерами окон Excel и размером / положением OLE-объекта происходит изменение размера.

Рабочее решение

Существуют два возможных сценария для создания презентаций PowerPoint с использованием Aspose.Slides для PHP через Java.Сценарий 1: Создать презентацию на основе существующего шаблонаСценарий 2: Создать презентацию с нуля. Решение, которое мы здесь предоставим, будет действовать для обоих сценариев. Основой всех подходов к решению будет одно и то же. То есть: Размер окна встроенного OLE-объекта должен быть таким же, как и размер OLE-объекта в слайде PowerPoint. Теперь мы обсудим два подхода к решению.

Первый подход

В этом подходе мы научимся устанавливать размер окна встроенной книги Excel, равный размеру OLE-объекта в слайде PowerPoint.Сценарий 1Предположим, мы определили шаблон и желаем создать презентации на основе этого шаблона. Предположим, что в шаблоне есть какая-то форма на индексе 2, где мы хотим разместить OLE-объект, содержащий встроенную книгу Excel. В этом сценарии размер 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Предположим, мы хотим создать презентацию с нуля и желаем OLE-объект любого размера с встроенной книгой Excel. В следующем фрагменте кода мы создали OLE-объект с высотой 4 дюйма и шириной 9.5 дюйма в слайде на оси x=0.5 дюйма и оси y=1 дюйм. Кроме того, мы установили эквивалентный размер окна книги 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, равный размеру OLE-объекта в слайде PowerPoint. Этот подход полезен, когда известен исходный размер графика и он никогда не изменится. Сценарий 1Предположим, мы определили шаблон и желаем создать презентации на основе этого шаблона. Предположим, что в шаблоне есть какая-то форма на индексе 2, где мы хотим разместить OLE-объект, содержащий встроенную книгу Excel. В этом сценарии размер 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: Предположим, мы хотим создать презентацию с нуля и желаем OLE-объект любого размера с встроенной книгой Excel. В следующем фрагменте кода мы создали OLE-объект с высотой 4 дюйма и шириной 9.5 дюйма в слайде на оси 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) {
}

Заключение