我想基于C#中的模板创建PowerPoint演示文稿。
我使用的是OpenXML 2.0 SDK
。
我的第一步。
我拿了我的.pptx模板,用C#代码更改了它并将其复制到我的项目中。
我可以根据模板创建幻灯片。
现在我想在模板中添加一些占位符。
void SwapPlaceholderText(SlidePart slidePart, string placeholder, string value)
{
//Find and get all the placeholder text locations.
List<Drawing.Text> textList = slidePart.Slide.Descendants<Drawing.Text>().Where(t => t.Text.Equals(placeholder)).ToList();
//Swap the placeholder text with the text from DB
foreach (Drawing.Text text in textList) text.Text = value;
}
但是列表的大小是0。 这个方法甚至可以调用我模板的正确方法吗? 我正在搜索的占位符的信息在我的模板的以下方法中。
private void GenerateUserDefinedTagsPart5Content(UserDefinedTagsPart userDefinedTagsPart5)
{
...
Tag tag71 = new Tag(){ Name = "FIELD.CHAPTER.CONTENT", Val = "#header#" };
Tag tag72 = new Tag(){ Name = "FIELD.CHAPTER.VALUE", Val = "#header#" };
... }
我做错了什么?以及如何修改占位符方法?
祝你好运!
编辑:我发现了一些奇怪的事情。我在我的PowerPoint模板中声明了一个名为“#header#”的占位符,在我的程序中我正在搜索“#header#”但是在我运行程序一次之后,PowerPoint文件中的“#header#”变为“header”我不知道为什么,但是当我现在搜索“标题”时,我的列表大小为1,标题将被替换。
但是在运行我的程序并想要启动PowerPoint演示文稿之后,它说数据已损坏。也许你会看到一些错误:
这是我的主要方法。
Template template = new Template();
template.CreatePackage("templatesource");
PresentationDocument doc = PresentationDocument.Open("templatesource", true);
PowerPoint powerPoint = new PowerPoint(doc, proj);
powerPoint.AddNewSlides();
的PowerPoint级:
public void addSlides()
{
for (int i = 0; i < proj.projects.Capacity; i++ )
{
Console.WriteLine("Slide number: " + i);
AddNewSlide(_document.PresentationPart);
}
_document.PresentationPart.Presentation.Save();
}
private void AddNewSlide(PresentationPart parent)
{
if (_slideTemplate == null) return;
var newSlidePart = parent.AddNewPart<SlidePart>("newSlide" + _slideId);
newSlidePart.FeedData(_slideTemplate.GetStream(FileMode.Open));
newSlidePart.AddPart(_slideTemplate.SlideLayoutPart, _slideTemplate.GetIdOfPart(_slideTemplate.SlideLayoutPart));
SetPlaceholder(newSlidePart, "#header#", "My new header");
newSlidePart.Slide.Save();
SlideIdList listOfSlidesIDs = parent.Presentation.SlideIdList;
uint maxSlideId = 1;
foreach (SlideId slideId in listOfSlidesIDs.ChildElements)
{
if (slideId.Id > maxSlideId) maxSlideId = slideId.Id;
}
SlideId newSlideId = new SlideId { Id = ++maxSlideId, RelationshipId = parent.GetIdOfPart(newSlidePart) };
listOfSlidesIDs.Append(newSlideId);
_slideId++;
}
感谢您的帮助:)