Рабочее решение для изменения размера диаграмм в PPTX
Предыстория
В предыдущей статье мы объяснили, как создать диаграмму Excel с помощью Aspose.Cells для Java и далее встроить эту диаграмму в презентацию PowerPoint с помощью Aspose.Slides для Java. Чтобы учесть проблему изменения объекта, мы назначили изображение диаграммы ОLE-объекту свойствам. В выходной презентации, когда мы дважды щелкаем по OLE-объекту, отображающему изображение диаграммы, активируется диаграмма Excel. Конечные пользователи могут внести любые желаемые изменения в фактической книге Excel, а затем вернуться к соответствующему слайду, щелкнув вне активной книги Excel. Размер OLE-объекта изменится, когда пользователь вернется к слайду. Фактор изменения размера будет отличаться для разных размеров OLE-объекта и встроенной книги Excel.
Причина изменения размера
Поскольку у книги Excel есть свой собственный размер окна, она пытается сохранить свой первоначальный размер при первой активации. С другой стороны, OLE-объект будет иметь свой собственный размер. Согласно Microsoft, при активации книги Excel Excel и PowerPoint согласовывают размер и обеспечивают его правильные пропорции как часть операции встраивания. На основе различий в размерах окон Excel и размере / положении OLE-объекта происходит изменение размера.
Рабочее решение
Существуют два возможных сценария создания презентаций PowerPoint с использованием Aspose.Slides для Java. Сценарий 1: Создание презентации на основе существующего шаблона Сценарий 2: Создание презентации с нуля. Решение, которое мы предоставим здесь, будет действовать для обоих сценариев. Основой всех подходов к решению будет одно и то же. То есть: Размер окна встроенного OLE-объекта должен быть равен размеру OLE-объекта в слайде PowerPoint. Теперь мы обсудим два подхода к решению.
Первый подход
В этом подходе мы узнаем, как установить размер окна встроенной книги Excel, эквивалентный размеру OLE-объекта в слайде PowerPoint. Сценарий 1 Предположим, мы определили шаблон и хотим создать презентации на основе этого шаблона. Предположим, в шаблоне есть какая-то фигура на индексе 2, где мы хотим разместить OLE-объект, содержащий встроенную книгу Excel. В этом сценарии размер OLE-объекта будет считаться предопределенным (что является размером фигуры на индексе 2 в шаблоне). Все, что нам нужно сделать: установить размер окна книги Excel равным размеру фигуры. Следующий кодовый фрагмент будет служить этой цели:
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 в шаблоне). Все, что нам нужно сделать: установить размер диаграммы в книге Excel равным размеру фигуры. Следующий кодовый фрагмент будет служить этой цели:
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) { | |
} | |