PPTX 中图表尺寸调整的可行解决方案

概述

使用 Aspose 组件将 Excel 图表作为 OLE 对象嵌入 PowerPoint 演示文稿后,首次激活后图表可能会改变大小。这会导致图表在激活前后的外观出现明显差异。本文说明了导致尺寸变化的原因,并展示了通过将固定图表尺寸匹配到 OLE 框来防止此问题的方法。

在在演示文稿中创建 Excel 图表并将其嵌入为 OLE 对象中,我们介绍了如何使用 Aspose.Cells for Python via .NET 创建 Excel 图表并使用 Aspose.Slides for Python via .NET 将其嵌入 PowerPoint 演示文稿。为了解决对象预览问题,我们将图表图像分配给图表的 OLE 对象框。在输出的演示文稿中,双击显示图表图像的 OLE 对象框即可激活 Excel 图表。用户可以编辑嵌入的 Excel 工作簿,然后点击激活工作簿之外的区域返回幻灯片。用户返回幻灯片时,OLE 对象框的大小会发生变化,且缩放比例取决于 OLE 对象框和嵌入的 Excel 工作簿的原始尺寸。

尺寸变化的原因

嵌入的 Excel 工作簿有其自身的窗口尺寸,Excel 会尝试在对象首次激活时保留该尺寸。幻灯片上的 OLE 框拥有独立定义的尺寸。当 Excel 工作簿被激活时,Excel 与 PowerPoint 会协商对象的大小,以在嵌入过程中保持其比例。因此,工作簿窗口与 OLE 框之间的差异会导致对象重新调整大小。

可行的解决方案

将图表尺寸匹配到幻灯片上的 OLE 框,并使图表尺寸独立于工作簿窗口。此方案适用于新建演示文稿或基于现有模板的演示文稿。

示例需要 Aspose.Cells for Python via .NET 和 Aspose.Slides for Python via .NET。它在活动的图表工作表上创建一个简单的柱形图,并将工作簿以 XLS 格式嵌入。未分配图表预览图像;图表将在 PowerPoint 中激活 OLE 对象后可见。

示例创建了一个新的演示文稿,包含一个 9.5 × 4 英寸的 OLE 框,框左侧距左边缘 0.5 英寸,顶部距上边缘 1 英寸。幻灯片坐标和尺寸使用点(每英寸 72 点)。有关基于现有演示文稿的用法,请参见使用模板。

设置固定图表尺寸

将size_with_window设为 false,使图表尺寸独立于工作簿窗口。通过width和height设置chart_object的尺寸,并使用每英寸 96 像素的换算将点转换为像素:684 × 288 点的框对应 912 × 384 像素的图表。将print_size设为PrintSizeType的 CUSTOM 值。示例使用add_ole_object_frame嵌入工作簿,并保存一个带有 9.5 × 4 英寸 OLE 框的演示文稿。

import io
import aspose.cells as cells
import aspose.cells.charts as charts
import aspose.slides as slides

workbook = cells.Workbook()
data_sheet = workbook.worksheets[0]
data_sheet.name = "Data"
data_sheet.cells.get("A1").put_value(10)
data_sheet.cells.get("A2").put_value(20)

chart_sheet_index = workbook.worksheets.add(cells.SheetType.CHART)
chart_sheet = workbook.worksheets[chart_sheet_index]
chart_index = chart_sheet.charts.add(charts.ChartType.COLUMN, 0, 0, 20, 10)
chart = chart_sheet.charts[chart_index]
chart.n_series.add("Data!A1:A2", True)
workbook.worksheets.active_sheet_index = chart_sheet_index

with slides.Presentation() as presentation:
    slide = presentation.slides[0]

    # 幻灯片坐标和尺寸使用点(每英寸 72 点)。
    width = 684.0  # 9.5 英寸。
    height = 288.0  # 4 英寸。

    chart.size_with_window = False
    # 使用每英寸 96 像素将点转换为图表像素。
    chart.chart_object.width = int(width / 72 * 96)
    chart.chart_object.height = int(height / 72 * 96)
    chart.print_size = cells.PrintSizeType.CUSTOM

    with io.BytesIO() as workbook_stream:
        workbook.save(workbook_stream, cells.SaveFormat.EXCEL_97_TO_2003)
        data_info = slides.dom.ole.OleEmbeddedDataInfo(workbook_stream.getvalue(), "xls")
        slide.shapes.add_ole_object_frame(36, 72, width, height, data_info)

    presentation.save("chart-fixed-size.pptx", slides.export.SaveFormat.PPTX)

使用模板

现有演示文稿的尺寸逻辑相同。要调整示例,请执行以下步骤:

  1. 加载模板演示文稿,而不是创建空白演示文稿。
  2. 确认第一张幻灯片至少包含三个形状,然后使用索引为 2 的形状作为占位符。
  3. 从该形状获取框的宽度和高度,而不是使用固定值 684 和 288。保持尺寸计算不变。
  4. 在占位符的位置添加 OLE 框,而不是使用固定坐标 36 和 72。
  5. 保存演示文稿前移除占位符。

常见问题解答

为什么我的嵌入 Excel 图表在 PowerPoint 中激活后会改变大小?

因为 Excel 在首次激活时会尝试恢复原始窗口尺寸,而 PowerPoint 中的 OLE 对象框有自己的尺寸。PowerPoint 与 Excel 协商尺寸以保持宽高比,从而导致尺寸变化。

如何保持图表和 OLE 框的尺寸一致?

设置与 OLE 框匹配的固定图表尺寸,并在嵌入工作簿之前使用自定义图表打印尺寸。上面的示例展示了所需的设置和单位换算。

仅匹配工作簿窗口尺寸是否足够?

仅匹配工作簿窗口尺寸并不能可靠地阻止 OLE 框在激活后改变大小。请使用示例中展示的固定图表尺寸。

此解决方案是否同时适用于基于模板的演示文稿和新建演示文稿?

是的。对于模板,使用占位符的尺寸和位置;对于新建演示文稿,直接指定框的尺寸和位置。

我可以将此示例用于其他电子表格程序创建的图表吗?

该示例使用 Aspose.Cells 创建的 Excel 工作簿。它未演示其他电子表格程序的激活行为。

相关章节