Рабочее решение проблемы изменения размера диаграмм в 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 и аналогичные параметры размера.