# Рабочее решение проблемы изменения размера диаграммы в PPTX

> Исправьте неожиданное изменение размера диаграммы в PPTX при использовании встроенных OLE‑объектов Excel с Aspose.Slides for Java. Узнайте два метода с кодом для поддержания одинаковых размеров.

Source: https://docs.aspose.com/slides/ru/java/working-solution-for-chart-resizing-in-pptx/
Updated: 2025-12-10


## **Общие сведения**

Было замечено, что диаграммы Excel, встроенные как OLE‑объекты в презентацию PowerPoint через компоненты Aspose, после первого активации масштабируются до неопределённого размера. Это приводит к заметной визуальной разнице в презентации между состоянием диаграммы до и после активации. Команда Aspose подробно исследовала проблему и нашла решение. В этой статье описаны причины проблемы и соответствующее исправление.

В [предыдущей статье](/slides/ru/java/creating-excel-chart-and-embedding-it-in-presentation-as-ole-object/) мы объяснили, как создать диаграмму Excel с помощью Aspose.Cells for Java и встроить её в презентацию PowerPoint, используя Aspose.Slides for Java. Чтобы решить [проблему предварительного просмотра объекта](/slides/ru/java/object-preview-issue-when-adding-oleobjectframe/), мы присвоили изображение диаграммы OLE‑объекту кадра. В полученной презентации, когда вы дважды щёлкните по кадру OLE‑объекта, отображающему изображение диаграммы, диаграмма Excel активируется. Пользователи могут вносить любые изменения в исходную книгу Excel, а затем возвращаться к соответствующему слайду, щёлкнув за пределами активированной книги. Размер кадра OLE‑объекта изменяется при возврате к слайду, и коэффициент изменения размера зависит от исходных размеров как кадра OLE‑объекта, так и встроенной книги Excel.

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

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

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

Существует два возможных сценария создания презентаций PowerPoint с помощью Aspose.Slides for Java.

**Сценарий 1:** Создание презентации на основе существующего шаблона.

**Сценарий 2:** Создание презентации с нуля.

Предлагаемое решение применимо к обоим сценариям. Основой всех подходов является одно и то же: **размер окна встроенного OLE‑объекта должен совпадать с размером кадра OLE‑объекта в слайде PowerPoint**. Далее рассмотрим два подхода к этому решению.

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

В этом подходе мы узнаем, как установить размер окна встроенной книги Excel так, чтобы он соответствовал размеру кадра OLE‑объекта в слайде PowerPoint.

**Сценарий 1**

Предположим, что у нас есть шаблон, и мы хотим создавать презентации на его основе. Допустим, в шаблоне существует форма с индексом 2, куда мы хотим поместить кадр OLE, содержащий встроенную книгу Excel. В этом случае размер кадра OLE‑объекта предопределён — он совпадает с размером формы с индексом 2 в шаблоне. Всё, что нам надо сделать, — установить размер окна книги равным размеру этой формы. Следующий фрагмент кода служит этой цели:
```java
// Установите ширину окна рабочей книги в дюймах (делится на 576, так как PowerPoint использует 576 пикселей на дюйм).
workbook.getSettings().setWindowWidthInch(slide.getShapes().get_Item(2).getWidth() / 72f);
 
// Установите высоту окна рабочей книги в дюймах.
workbook.getSettings().setWindowHeightInch(slide.getShapes().get_Item(2).getHeight() / 72f);
 
// Сохраните рабочую книгу в поток памяти.
ByteArrayOutputStream workbookStream = new ByteArrayOutputStream();
workbook.save(workbookStream, com.aspose.cells.SaveFormat.EXCEL_97_TO_2003);
 
// Создайте кадр OLE‑объекта с встроенными данными Excel.
IOleObjectFrame oleFrame = 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",
    workbookStream.toByteArray());
```


**Сценарий 2**

Предположим, что мы хотим создать презентацию с нуля и добавить кадр OLE‑объекта произвольного размера с встроенной книгой Excel. В следующем фрагменте кода мы создаём кадр OLE‑объекта высотой 4 дюйма и шириной 9,5 дюйма, расположенный в точке x = 0,5 дюйма и y = 1 дюйм на слайде. Затем мы задаём окну книги Excel тот же размер — 4 дюйма в высоту и 9,5 дюйма в ширину.
```java
// Желаемая высота.
int desiredHeight = 288; // 4 дюйма (4 * 72)
 
// Желаемая ширина.
int desiredWidth = 684; // 9.5 дюйма (9.5 * 72)
 
// Задать размер диаграммы с окном.
chart.setSizeWithWindow(true);
 
// Установить ширину окна рабочей книги в дюймах (делится на 576, так как PowerPoint использует 576 пикселей на дюйм).
workbook.getSettings().setWindowWidthInch(desiredHeight / 72f);
 
// Установить высоту окна рабочей книги в дюймах.
workbook.getSettings().setWindowHeightInch(desiredWidth / 72f);
 
// Сохранить рабочую книгу в поток памяти.
ByteArrayOutputStream workbookStream = new ByteArrayOutputStream();
workbook.save(workbookStream, com.aspose.cells.SaveFormat.EXCEL_97_TO_2003);
 
// Создать кадр OLE‑объекта с встроенными данными Excel.
IOleObjectFrame oleFrame = slide.getShapes().addOleObjectFrame(
    288,
    576,
    desiredWidth,
    desiredHeight,
    "Excel.Sheet.8",
    workbookStream.toByteArray());
```


## **Второй подход**

В этом подходе мы узнаем, как установить размер диаграммы во встроенной книге Excel так, чтобы он соответствовал размеру кадра OLE‑объекта в слайде PowerPoint. Этот подход полезен, когда размер диаграммы известен заранее и не будет изменяться.

**Сценарий 1**

Предположим, что у нас есть шаблон, и мы хотим создавать презентации на его основе. Допустим, в шаблоне существует форма с индексом 2, куда мы планируем поместить кадр OLE, содержащий встроенную книгу Excel. В этом случае размер кадра OLE‑объекта предопределён — совпадает с размером формы с индексом 2 в шаблоне. Всё, что нам нужно, — установить размер диаграммы в книге, равный размеру этой формы. Следующий фрагмент кода служит этой цели:
```java
// Определить размер диаграммы без окна.
chart.setSizeWithWindow(false);
 
// Задать ширину диаграммы в пикселях (умножить на 96, так как Excel использует 96 пикселей на дюйм).
chart.getChartObject().setWidth((int)((slide.getShapes().get_Item(2).getWidth() / 72f) * 96f));
 
// Задать высоту диаграммы в пикселях.
chart.getChartObject().setHeight((int)((slide.getShapes().get_Item(2).getHeight() / 72f) * 96f));
 
// Определить размер печати диаграммы.
chart.setPrintSize(PrintSizeType.CUSTOM);
 
// Сохранить рабочую книгу в поток памяти.
ByteArrayOutputStream workbookStream = new ByteArrayOutputStream();
workbook.save(workbookStream, com.aspose.cells.SaveFormat.EXCEL_97_TO_2003);
 
// Создать кадр OLE‑объекта с вложенными данными Excel.
IOleObjectFrame oleFrame = 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",
    workbookStream.toByteArray());
```


**Сценарий 2**

Предположим, что мы хотим создать презентацию с нуля и добавить кадр OLE‑объекта произвольного размера с встроенной книгой Excel. В следующем фрагменте кода мы создаём кадр OLE‑объекта высотой 4 дюйма и шириной 9,5 дюйма, расположенный в точке x = 0,5 дюйма и y = 1 дюйм на слайде. Мы также задаём размер диаграммы такие же параметры: высота = 4 дюйма, ширина = 9,5 дюйма.
```java
// Желаемая высота.
int desiredHeight = 288; // 4 дюйма (4 * 72)
 
// Желаемая ширина.
int desiredWidth = 684; // 9.5 дюйма (9.5 * 72)
 
// Определить размер диаграммы без окна.
chart.setSizeWithWindow(false);
 
// Задать ширину диаграммы в пикселях (умножить на 96, так как Excel использует 96 пикселей на дюйм).
chart.getChartObject().setWidth((int)((slide.getShapes().get_Item(2).getWidth() / 576f) * 96f));
 
// Задать высоту диаграммы в пикселях.
chart.getChartObject().setHeight((int)((slide.getShapes().get_Item(2).getHeight() / 576f) * 96f));
 
// Сохранить рабочую книгу в поток памяти.
ByteArrayOutputStream workbookStream = new ByteArrayOutputStream();
workbook.save(workbookStream, com.aspose.cells.SaveFormat.EXCEL_97_TO_2003);
 
// Создать кадр OLE‑объекта с встроенными данными Excel.
IOleObjectFrame oleFrame = slide.getShapes().addOleObjectFrame(
    288,
    576,
    desiredWidth,
    desiredHeight,
    "Excel.Sheet.8",
    workbookStream.toByteArray());
```


## **Заключение**

Существует два подхода к исправлению проблемы изменения размера диаграммы. Выбор подхода зависит от требований и сценария использования. Оба подхода работают одинаково, независимо от того, создаются ли презентации из шаблона или с нуля. Кроме того, в этом решении нет ограничения на размер кадра OLE‑объекта.

## **Часто задаваемые вопросы**

**Почему моя встроенная диаграмма Excel меняет размер после активации в PowerPoint?**

Это происходит потому, что Excel пытается восстановить исходный размер окна при первой активации, тогда как кадр OLE‑объекта в PowerPoint имеет свои собственные размеры. PowerPoint и Excel согласовывают размеры, чтобы сохранить соотношение сторон, что может привести к изменению размера.

**Можно ли полностью предотвратить эту проблему с изменением размера?**

Да. Согласовав размер окна книги Excel или размер диаграммы с размером кадра OLE‑объекта перед внедрением, вы сохраняете постоянный размер диаграммы.

**Какой подход выбрать: задавать размер окна книги или размер диаграммы?**

Используйте **Подход 1 (размер окна)**, если хотите сохранить соотношение сторон книги и, возможно, позже изменить размер.
Используйте **Подход 2 (размер диаграммы)**, если размеры диаграммы фиксированы и не будут изменяться после внедрения.

**Будут ли эти методы работать как с шаблонными презентациями, так и с новыми презентациями?**

Да. Оба подхода работают одинаково для презентаций, созданных из шаблонов, и для новых презентаций.

**Есть ли ограничение на размер кадра OLE‑объекта?**

Нет. Вы можете задать кадр OLE любого размера, пока он адекватно масштабируется к размеру книги или диаграммы.

**Можно ли использовать эти методы с диаграммами, созданными в других табличных программах?**

Примеры рассчитаны на диаграммы Excel, созданные с помощью Aspose.Cells, но принципы применимы к другим OLE‑совместимым табличным программам, если они поддерживают аналогичные параметры размеров.

## **Связанные разделы**

- [Создание диаграмм Excel и их встраивание как OLE‑объекты в презентации](/slides/ru/java/creating-excel-chart-and-embedding-it-in-presentation-as-ole-object/)
- [Автоматическое обновление OLE‑объектов с помощью надстройки PowerPoint](/slides/ru/java/updating-ole-objects-automatically-using-ms-powerpoint-add-in/)
