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

Фон

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

В предыдущей статье мы объяснили, как создать диаграмму Excel с помощью Aspose.Cells for .NET и встроить её в презентацию PowerPoint, используя Aspose.Slides for .NET. Чтобы решить проблему предварительного просмотра объекта, мы присвоили изображение диаграммы кадру 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 в шаблоне. Всё, что нужно сделать, — установить размер окна книги равным размеру этой фигуры. Следующий фрагмент кода служит этой цели:

// Определите размер диаграммы с окном. 
// Установите ширину окна книги в дюймах (делённую на 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 дюйма в ширину.

// Желаемая высота.
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 в шаблоне. Всё, что нужно сделать, — установить размер диаграммы в книге, равным размеру этой фигуры. Следующий фрагмент кода служит этой цели:

// Задайте размер диаграммы без окна. 
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 дюйма.

 // Желаемая высота.
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 и аналогичные параметры размера.

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