在C#中的PowerPoint演示文稿中添加幻灯片
问题描述:
使用C#加载项时,我试图向PowerPoint添加按钮,并且当我单击该按钮时,新幻灯片将添加到当前演示文稿中。在C#中的PowerPoint演示文稿中添加幻灯片
我找到了this solution - 它真的很接近我想要做的事......但打算打开另一个PowerPoint文件并向其中添加幻灯片。但是我想要做的是在当前的演示文稿中添加幻灯片。
我试图修改给定的代码,但我没有成功。
我已插入2个问题为代码,我认为这是一个问题,他们标记// *****的问题在这里*****在开始和代码
private void buttonForSlide_Click(object sender, EventArgs e)
{
InsertNewSlide(2, "New Slide added");
}
// Insert the specified slide into the presentation at the specified position.
public static void InsertNewSlide(int position, string slideTitle)
{
//*******question here********* Initially the code was like the following line where presentationDocument was presentationDocument = PresentationDocument.Open(pathOfTheFile, true) - I don't know how to specify to modify the current presentation ?
PresentationPart presentationPart = presentationDocument.PresentationPart;
// Declare and instantiate a new slide.
Slide slide = new Slide(new CommonSlideData(new ShapeTree()));
uint drawingObjectId = 1;
// Construct the slide content.
// Specify the non-visual properties of the new slide.
NonVisualGroupShapeProperties nonVisualProperties = slide.CommonSlideData.ShapeTree.AppendChild(new NonVisualGroupShapeProperties());
nonVisualProperties.NonVisualDrawingProperties = new NonVisualDrawingProperties() { Id = 1, Name = "" };
nonVisualProperties.NonVisualGroupShapeDrawingProperties = new NonVisualGroupShapeDrawingProperties();
nonVisualProperties.ApplicationNonVisualDrawingProperties = new ApplicationNonVisualDrawingProperties();
// Specify the group shape properties of the new slide.
slide.CommonSlideData.ShapeTree.AppendChild(new GroupShapeProperties());
// Declare and instantiate the title shape of the new slide.
Shape titleShape = slide.CommonSlideData.ShapeTree.AppendChild(new Shape());
drawingObjectId++;
// Specify the required shape properties for the title shape.
titleShape.NonVisualShapeProperties = new NonVisualShapeProperties
(new NonVisualDrawingProperties() { Id = drawingObjectId, Name = "Title" },
new NonVisualShapeDrawingProperties(new Drawing.ShapeLocks() { NoGrouping = true }),
new ApplicationNonVisualDrawingProperties(new PlaceholderShape() { Type = PlaceholderValues.Title }));
titleShape.ShapeProperties = new ShapeProperties();
// Specify the text of the title shape.
titleShape.TextBody = new TextBody(new Drawing.BodyProperties(),
new Drawing.ListStyle(),
new Drawing.Paragraph(new Drawing.Run(new Drawing.Text() { Text = slideTitle })));
// Declare and instantiate the body shape of the new slide.
Shape bodyShape = slide.CommonSlideData.ShapeTree.AppendChild(new Shape());
drawingObjectId++;
// Specify the required shape properties for the body shape.
bodyShape.NonVisualShapeProperties = new NonVisualShapeProperties(new NonVisualDrawingProperties() { Id = drawingObjectId, Name = "Content Placeholder" },
new NonVisualShapeDrawingProperties(new Drawing.ShapeLocks() { NoGrouping = true }),
new ApplicationNonVisualDrawingProperties(new PlaceholderShape() { Index = 1 }));
bodyShape.ShapeProperties = new ShapeProperties();
// Specify the text of the body shape.
bodyShape.TextBody = new TextBody(new Drawing.BodyProperties(),
new Drawing.ListStyle(),
new Drawing.Paragraph());
// Create the slide part for the new slide.
SlidePart slidePart = presentationPart.AddNewPart<SlidePart>();
// Save the new slide part.
slide.Save(slidePart);
// Modify the slide ID list in the presentation part.
// The slide ID list should not be null.
SlideIdList slideIdList = presentationPart.Presentation.SlideIdList;
// Find the highest slide ID in the current list.
uint maxSlideId = 1;
SlideId prevSlideId = null;
foreach (SlideId slideId in slideIdList.ChildElements)
{
if (slideId.Id > maxSlideId)
{
maxSlideId = slideId.Id;
}
position--;
if (position == 0)
{
prevSlideId = slideId;
}
}
maxSlideId++;
// Get the ID of the previous slide.
SlidePart lastSlidePart;
if (prevSlideId != null)
{
lastSlidePart = (SlidePart)presentationPart.GetPartById(prevSlideId.RelationshipId);
}
else
{
lastSlidePart = (SlidePart)presentationPart.GetPartById(((SlideId)(slideIdList.ChildElements[0])).RelationshipId);
}
// Use the same slide layout as that of the previous slide.
if (null != lastSlidePart.SlideLayoutPart)
{
slidePart.AddPart(lastSlidePart.SlideLayoutPart);
}
// Insert the new slide into the slide list after the previous slide.
SlideId newSlideId = slideIdList.InsertAfter(new SlideId(), prevSlideId);
newSlideId.Id = maxSlideId;
newSlideId.RelationshipId = presentationPart.GetIdOfPart(slidePart);
//*******question here********** Do you believe I have to save if I want to modify the current presentation ?
//presentationPart.Presentation.Save();
}
结束
你知道我怎么能说修改当前的演示文稿吗?
答
使用此:
private void button1_Click(object sender, RoutedEventArgs e)
{
string folderName = @"E:\PPTFolder\";
AddSlides(folderName);
}
private void AddSlides(string folderName)
{
string[] filePaths = Directory.GetFiles(folderName, "*.pptx", SearchOption.TopDirectoryOnly);
Microsoft.Office.Core.MsoTriState oFalse = Microsoft.Office.Core.MsoTriState.msoFalse;
Microsoft.Office.Core.MsoTriState oTrue = Microsoft.Office.Core.MsoTriState.msoTrue;
PowerPoint.Application oApp = new PowerPoint.Application();
oApp.Visible = oTrue;
oApp.WindowState = PowerPoint.PpWindowState.ppWindowNormal;
PowerPoint.Presentation oPres;
PowerPoint.Slide oSlide=new PowerPoint.Slide();
for (int i = 0; i < filePaths.Length; i++)
{
oPres = oApp.Presentations.Open(filePaths[i], ReadOnly: oFalse);
oSlide = oPres.Slides.Add(oPres.Slides.Count + 1, PowerPoint.PpSlideLayout.ppLayoutTitleOnly);
oSlide.Shapes[1].TextFrame.TextRange.Text = "Final Test";
oSlide.Shapes[1].TextFrame.TextRange.Font.Name = "Comic Sans MS";
oSlide.Shapes[1].TextFrame.TextRange.Font.Size = 48;
oPres.Save();
oPres.Close();
}
oSlide = null;
oPres = null;
oApp.Quit();
oApp = null;
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
}
嗯,我认为这个问题是相同的:在这里你给一个文件夹,打开和修改其他演示文稿。我想要做的是修改当前的演示文稿(我正在做一个ppt的插件 - 当你打开一个演示文稿并按下插件给出的按钮时,会添加一个新的幻灯片 - >所以我需要修改当前的演示文稿)。也许这是从你的代码非常简单,但我不明白该怎么办? – droledenom