PowerPoint 互操作:如果完成速度过快,复制粘贴形状会崩溃

Posted

技术标签:

【中文标题】PowerPoint 互操作:如果完成速度过快,复制粘贴形状会崩溃【英文标题】:PowerPoint Interop: copy-pasting a shape crashes if done too fast 【发布时间】:2021-08-03 02:37:33 【问题描述】:

我在 C#/.NET 程序中使用Microsoft.Office.Interop.PowerPoint 来自动执行对 PPTX 文件的某些操作。

我正在尝试使用以下代码在演示文稿中创建现有形状的副本:

var shape = slide.Shapes[1];
shape.Copy();
var newShape = targetSlide.Shapes.Paste();

然而,Paste() 指令是不可靠的,它有时有效但有时(显然是随机的)抛出以下异常:

错误:System.Runtime.InteropServices.COMException (0x80048240): 形状(未知成员):请求无效。剪贴板为空或 包含可能不会在此处粘贴的数据。在 Microsoft.Office.Interop.PowerPoint.Shapes.Paste()

折腾了一下,网上搜索,发现问题是.Copy()指令明显是异步的,基本上返回的时候并不能保证shape对象确实已经复制到剪贴板了。 事实上,添加一个:

Thread.Sleep(1000);

Copy()Paste() 之间的指令解决了这个问题。

但是,睡眠不是一个合适的解决方案,它会大大减慢程序的速度,并且无法知道您将睡眠时间设置得过高还是过低。

我的问题是:有没有更可靠的方法可以在粘贴之前等待副本“准备好”?

【问题讨论】:

【参考方案1】:

我可能会迟到,但这是我的解决方案: 当我在幻灯片中迭代形状时,它发生在我身上。复制每个并粘贴每个有时会引发您提到的错误。我所做的是一次复制所有形状。

CurrentSelection.SlideRangle.Shapes.Copy();
targetPresentation.Slides[index].Shapes.Paste();

另一个想法是复制整个幻灯片:

CurrentSelection.SlideRangle.Shapes.Copy();

然后

Globals.ThisAddIn.Application.CommandBars.ExecuteMso("PasteSourceFormatting");

您也可以使用“PasteDestinationTheme”

【讨论】:

以上是关于PowerPoint 互操作:如果完成速度过快,复制粘贴形状会崩溃的主要内容,如果未能解决你的问题,请参考以下文章

小功能⭐️Unity解决物体移动速度过快不能检测到碰撞

使用 OpenCV 和 PyQT5 视频播放速度过快

Azure 服务总线向队列中添加消息的速度过快

.Net 使用 Office 互操作打印 PowerPoint 文档

OpenGL 动画的制作

解决pip下载速度过慢及超时等其它的报错的方法适于多种操作系统(详细)