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

> Исправьте неожиданное изменение размера диаграмм в PPTX при использовании встроенных объектов Excel OLE с Aspose.Slides для .NET. Ознакомьтесь с двумя методами с кодом, чтобы размеры оставались согласованными.

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


## **Фон**

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

В [предыдущей статье](/slides/ru/net/creating-excel-chart-and-embedding-it-in-presentation-as-ole-object/) мы объяснили, как создать диаграмму Excel с помощью Aspose.Cells for .NET и встроить её в презентацию PowerPoint, используя Aspose.Slides for .NET. Чтобы решить [проблему предварительного просмотра объекта](/slides/ru/net/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 .NET.

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

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

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

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

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

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

Предположим, что у нас есть шаблон, и мы хотим создавать презентации на его основе. Допустим, в шаблоне есть фигура с индексом 2, в которой нужно разместить кадр OLE, содержащий встроенную книгу Excel. В этом случае размер кадра OLE‑объекта предопределён — он совпадает с размером фигуры с индексом 2 в шаблоне. Всё, что нужно сделать, — установить размер окна книги равным размеру этой фигуры. Следующий фрагмент кода служит этой цели:
```cs
// Определите размер диаграммы с окном. 
// Установите ширину окна книги в дюймах (делённую на 72, так как PowerPoint использует 72 пиксела на дюйм).
// Установите высоту окна книги в дюймах.
// Сохраните книгу в поток памяти.
// Создайте OLE‑кадр объекта с встроенными данными Excel.
chart.SizeWithWindow = true;

workbook.Worksheets.WindowWidthInch = slide.Shapes[2].Width / 72f;

workbook.Worksheets.WindowHeightInch = slide.Shapes[2].Height / 72f;

MemoryStream workbookStream = workbook.SaveToStream();

Aspose.Slides.OleObjectFrame oleFrame = slide.Shapes.AddOleObjectFrame(
    slide.Shapes[2].X,
    slide.Shapes[2].Y,
    slide.Shapes[2].Width,
    slide.Shapes[2].Height,
	"Excel.Sheet.8",
	workbookStream.ToArray());
```


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

Пусть мы хотим создать презентацию с нуля и добавить кадр OLE‑объекта произвольного размера с встроенной книгой Excel. В следующем фрагменте кода мы создаём кадр OLE‑объекта высотой 4 дюйма и шириной 9,5 дюйма, расположенный на слайде в точке x = 0,5 дюйма, y = 1 дюйм. Затем мы задаём окну книги Excel те же размеры — 4 дюйма в высоту и 9,5 дюйма в ширину.
```cs
// Желаемая высота.
int desiredHeight = 288; // 4 дюйма (4 * 72)

// Желаемая ширина.
int desiredWidth = 684;//9.5 дюйма (9.5 * 72)

// Задайте размер диаграммы с окном.
chart.SizeWithWindow = true;

// Установите ширину окна книги в дюймах.
workbook.Worksheets.WindowWidthInch = desiredWidth / 72f;

// Установите высоту окна книги в дюймах.
workbook.Worksheets.WindowHeightInch = desiredHeight / 72f;

// Сохраните книгу в поток памяти.
MemoryStream workbookStream = workbook.SaveToStream();

// Создайте кадр OLE‑объекта с встроенными данными Excel.
Aspose.Slides.OleObjectFrame oleFrame = slide.Shapes.AddOleObjectFrame(
    36,
    72,
    desiredWidth,
    desiredHeight,
	"Excel.Sheet.8",
	workbookStream.ToArray());
```


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

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

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

Предположим, что у нас есть шаблон, и мы хотим создавать презентации на его основе. Допустим, в шаблоне есть фигура с индексом 2, в которой мы планируем разместить кадр OLE, содержащий встроенную книгу Excel. В этом случае размер кадра OLE‑объекта предопределён — он совпадает с размером фигуры с индексом 2 в шаблоне. Всё, что нужно сделать, — установить размер диаграммы в книге, равным размеру этой фигуры. Следующий фрагмент кода служит этой цели:
```cs
// Задайте размер диаграммы без окна. 
chart.SizeWithWindow = false;

// Установите ширину диаграммы в пикселях (умножьте на 96, так как Excel использует 96 пикселей на дюйм).    
chart.ChartObject.Width = (int)((slide.Shapes[2].Width / 72f) * 96f);

// Установите высоту диаграммы в пикселях.
chart.ChartObject.Height = (int)((slide.Shapes[2].Height / 72f) * 96f);

// Задайте размер печати диаграммы.
chart.PrintSize = PrintSizeType.Custom;

// Сохраните книгу в поток памяти.
MemoryStream workbookStream = workbook.SaveToStream();

// Создайте кадр OLE‑объекта с вложенными данными Excel.
Aspose.Slides.OleObjectFrame oleFrame = slide.Shapes.AddOleObjectFrame(
    slide.Shapes[2].X,
    slide.Shapes[2].Y,
    slide.Shapes[2].Width,
    slide.Shapes[2].Height,
	"Excel.Sheet.8",
	workbookStream.ToArray());
```


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

Пусть мы хотим создать презентацию с нуля и добавить кадр OLE‑объекта произвольного размера с встроенной книгой Excel. В следующем фрагменте кода мы создаём кадр OLE‑объекта высотой 4 дюйма и шириной 9,5 дюйма, расположенный на слайде в точке x = 0,5 дюйма, y = 1 дюйм. Мы также задаём соответствующий размер диаграммы тем же самым: высота 4 дюйма и ширина 9,5 дюйма.
```cs
 // Желаемая высота.
int desiredHeight = 288; // 4 дюйма (4 * 576)

// Желаемая ширина.
int desiredWidth = 684; // 9.5 дюйма (9.5 * 576)

// Задайте размер диаграммы без окна. 
chart.SizeWithWindow = false;

// Установите ширину диаграммы в пикселях.   
chart.ChartObject.Width = (int)((desiredWidth / 72f) * 96f);

// Установите высоту диаграммы в пикселях.    
chart.ChartObject.Height = (int)((desiredHeight / 72f) * 96f);

// Сохраните книгу в поток памяти.
MemoryStream workbookStream = workbook.SaveToStream();

// Создайте кадр OLE‑объекта с встроенными данными Excel.
Aspose.Slides.OleObjectFrame oleFrame = slide.Shapes.AddOleObjectFrame(
    36,
    72,
    desiredWidth,
    desiredHeight,
	"Excel.Sheet.8",
	workbookStream.ToArray());
```


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

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

## **FAQ**

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

**Можно ли полностью предотвратить эту проблему с изменением размера?**  
Да. Если привести размер окна книги Excel или размер диаграммы в соответствие с размером кадра OLE‑объекта до внедрения, размеры диаграмм будут оставаться одинаковыми.

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

**Будут ли эти методы работать как с шаблонными, так и с новыми презентациями?**  
Да. Оба подхода работают одинаково для презентаций, созданных из шаблонов, и для тех, что создаются с нуля.

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

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

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

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