0

Microsoft.Office.Interop.PowerPoint在 C#/.NET 程序中使用它来自动对 PPTX 文件进行一些操作。

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

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

但是,该Paste()指令是不可靠的,它有时会起作用,但有时(显然是随机的)会引发以下异常:

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

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

Thread.Sleep(1000);

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

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

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

4

1 回答 1

0

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

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

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

CurrentSelection.SlideRangle.Shapes.Copy();

接着

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

你也可以使用“PasteDestinationTheme”

于 2021-09-15T08:06:51.260 回答