我一直在努力使用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,但这不会影响已创建的任何形状,只会影响程序中之后创建的新形状。
答案 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