PowerPoint + Matlab PasteSpecial(Alt + e + s)

时间:2019-07-15 20:31:55

标签: matlab powerpoint

我正在使用MATLAB生成自动PowerPoint报告。为了能够在PowerPoint中编辑MATLAB图,我们使用PasteSpecial。

手动地,我们使用MATLAB图中的Copy Figure,然后将Alt + e + s作为增强型图元文件添加到PasteSpecial中到PowerPoint文件中。这将创建一组可以手动编辑的对象。我想从MATLAB中以编程方式执行此PasteSpecial。

此链接显示您可以执行PasteSpecial:

https://docs.microsoft.com/en-us/office/vba/api/powerpoint.shapes.pastespecial

因此,我创建了MATLAB函数来执行PasteSpecial(特别是PasteSpecial(2)),该函数的工作原理是粘贴的图形是一个简单的位图,而不是我们可以编辑的一组分组对象。

从引用的链接来看,我认为我需要PasteSpecial(ppPasteEnhancedMetafile)之类的东西,但找不到任何访问ppPasteEnhancedMetafile的方法。

请注意,我仅使用基本的MATLAB而不是Mathworks Toolbox进行此操作。另外,我不需要PasteSpecial,而是创建图形,另存为png并插入,因为我们希望能够在PowerPoint中编辑图形。

2 个答案:

答案 0 :(得分:4)

这种情况比我想的要多...当我为SO构造一个问题时,我在发布问题大约15分钟后便找到了解决方案。之后,我花了数小时尝试各种解决方案并在网上搜索。

原来的问题实际上不是我的PasteSpecial行,而是我如何将图形复制到剪贴板。不这样做是为了获得积分,但要确保其他人不会遇到相同的问题。

我通过以下方式将图形复制到剪贴板中:

hgexport(fig_handle, '-clipboard')

我需要使用:

print(fig_handle, '-clipboard', '-dmeta')

然后类似的事情起作用:

shapes_object.PasteSpecial(2)

其中shapes_object是幻灯片上形状的集合。

请求的MVCE:

%% Get a particular shape on a particular slide from a given Powerpoint presentation.
% Get the ActiveX Server for PowerPoint.
ppt = actxserver('PowerPoint.Application');

% Open a PPTX file.
ppt.Presentations.Open(new_fname);

% Get the active PowerPoint Presentation. This also works if you
% manually open a PPTX file.
active_presentation = get(ppt, 'ActivePresentation');

% Get a list of Slide objects from PowerPoint.
slides = active_presentation.Slides;

% Get a particular Slide.
num_slides = slides.Count;
slide = slides.Item(i);      % i is valid between 1 and num_slides
slide.Select;                % Make this the active Slide.

% Get all the Shape on a Slide.
shapes = slide.Shapes;

% Get a specific shape from the Slide.
num_shapes = shapes.Count;
shape = shapes.Item(j);        % j is valid between 1 and num_shapes
shape.Select;                          % Make this the active Shape.

%% Plot a figure.
fig_handle = figure();
plot(rand(1, 1000), rand(1, 1000), 'r.')

% Note that PowerPoint's PasteSpecial pastes the figure into the middle of 
% the slide. In order to make it replace a Shape on the Slide you have to 
% change the new shape's position to be equal to the old shape's position.
% The first step in getting a figure to look better then we should reshape
% the figure.
fig_position = fig_handle.Position;
fig_position(3) = shape.Width;
fig_position(4) = shape.Height;
fig_handle.Position = fig_position;

% Copy the figure to the clipboard.
print(fig_handle, '-clipboard', '-dmeta')

%% Now paste the figure into the PowerPoint file.
pasted_shape = shapes.PasteSpecial(2)

% Change position and size.
pasted_shape .Top = shape.Top;
pasted_shape .Left = shape.Left;
pasted_shape s.Width = shape.Width;
pasted_shape .Height = shape.Height;

% Now delete the original shape.
shape.Delete;

上下文:

我进行了模拟,并希望为每次运行生成标准的PPT报告。我创建一个带有模板幻灯片的幻灯片平台的PPT文件。每个模板幻灯片都只是一个模板,我打算以编程方式从MATLAB中替换每个图和所有文本。我使用shapes.Item(j)来手动选择和识别每个形状。然后,我为每张幻灯片构建一个类,其中包含项目编号到形状名称的映射,例如left_plot或plot_row1_col1。

然后,我通过以适当的顺序汇总适当的幻灯片类来创建报告。然后是大量的绘图代码,并生成了报告中每张幻灯片上每种形状所需的所有绘图。

答案 1 :(得分:0)

我不是MATLAB用户。如果在MATLAB VBA编辑器中可以添加对 Microsoft PowerPoint 16.0对象库的引用(该数字可能会根据所使用的版本而变化),那么您应该可以使用ppPasteEnhancedMetafile参数。 您也可以尝试PasteSpecial(3)来查看是否将粘贴WMF。 这是PasteSpecial格式的枚举页面:PpPasteDataType enumeration (PowerPoint)