Break Links PowerPoint 2010

时间:2012-12-10 20:53:55

标签: c# powerpoint

我一直在努力使用C#和PowerPoint,我之前发布过如何使用C#更新ppt中的链接如果链接设置为手动,我没有得到任何响应,所以我想我会试图绕过这个问题在文件中将链接设置为自动,然后当C#打开它时,它会更新它们,保存文件,然后将它们分解并保存为另一个文件名,但这并没有证明更容易。

我需要知道的是如何打破链接。我知道一些VBA并编写了一个代码来打破它们,但是当我用C#调用一个带有RunMacro方法的宏时,它似乎没有使用我正在使用的方法(? - 我是C#的新手所以我不喜欢我完全理解为什么会这样,但如果你谷歌“运行宏PowerPoint C#”,你会发现我确定我试图去做的方式。)请帮助,我完全失去了。

我的脚本看起来像这样

Using PowerPoint = Microsoft.Office.Interop.PowerPoint;

public void Main()
    {

        PowerPoint.Application ppt = new PowerPoint.Application();
        PowerPoint.Presentation PRS = ppt.Presentations.Open(@"Filename.pptm",
        Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoTrue);


        PRS.UpdateLinks();
        PRS.Save
        //here is where I need to break the links
        PRS.SaveAs(@"filename with links broken.pptm", 
            Microsoft.Office.Interop.PowerPoint.PpSaveAsFileType.ppSaveAsOpenXMLPresentationMacroEnabled, MsoTriState.msoTrue);
        PRS.Close(); 
       ppt.Quit();
}

我尝试在打开文件之前将linkformat设置为manual,但这不会影响已创建的任何形状,只会影响程序中之后创建的新形状。

2 个答案:

答案 0 :(得分:1)

我在Powerpoint中做过类似的项目,也涉及破坏链接。在我的程序中,我正在从Excel文件中读取并获取此数据并将其放入Powerpoint演示文稿中。在我的Powerpoint模板文件中,我将所有指向Excel文件的链接布局并按我希望的方式进行格式化。程序开始运行,这将填充Excel文件。写完Excel后,我打开Powerpoint和UpdateLinks()到我的演示文稿。更新链接后,我使用Powerpoint中的Shapes上的for循环中断链接。之后,我保存并关闭文档。下面是我用来创建基于每个ppt文件模板的Powerpoint文件的函数(对于我的例子,我遍历多个ppt文件,因为每个ppt文件只包含一个幻灯片。它们都被合并到一个幻灯片后面的处理)。

public void CreatePowerpoint()
    {
        string[] fileArray = Directory.GetFiles(@"C:\Users\Me\Desktop\test");
        Microsoft.Office.Interop.PowerPoint.Application pptApp = new Microsoft.Office.Interop.PowerPoint.Application();
        for (int i = 0; i < fileArray.Length; i++)
        {
            string file = fileArray[i];

            Microsoft.Office.Interop.PowerPoint.Presentation powerpoint = pptApp.Presentations.Open(file);
            powerpoint.UpdateLinks();

            Microsoft.Office.Interop.PowerPoint.Slides slides = powerpoint.Slides;
            Microsoft.Office.Interop.PowerPoint.Slide slide = slides[1];
            Microsoft.Office.Interop.PowerPoint.Shapes pptShapes = (Microsoft.Office.Interop.PowerPoint.Shapes)slide.Shapes;

            foreach (Microsoft.Office.Interop.PowerPoint.Shape y in pptShapes)
            {
                Microsoft.Office.Interop.PowerPoint.Shape j = (Microsoft.Office.Interop.PowerPoint.Shape)y;
                try
                {
                    //If auto link update is disabled for links
                    //j.LinkFormat.j.Update();
                    if (j.LinkFormat != null)
                    {
                        j.LinkFormat.BreakLink();
                    }
                }
                catch (Exception)
                {

                }
            }

            powerpoint.SaveAs(@"C:\Users\Me\Desktop\test" + i + ".pptx");
            powerpoint.Close();
            Thread.Sleep(3000);
        }
        pptApp.Quit();
    }

答案 1 :(得分:-1)

在打开文件之前更改内容对当前未打开的文件没有任何影响。迭代每张幻灯片上的形状集合以及每个形状:

If .Type = msoLinkedOLEObject Then
    .LinkFormat.BreakLink
End If

msoLinkedOLEObject = 10