7

我想创建一个基于 C# 模板的 PowerPoint 演示文稿。我正在使用OpenXML 2.0 SDK.

我的第一步。

我拿了我的 .pptx 模板,用 C# 代码对其进行了更改,并将其复制到我的项目中。

  1. 我能够根据我的模板创建幻灯片。

  2. 现在我的模板中有一些占位符要替换。

我在msdn端找到了以下方法

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++;  
}

谢谢你的帮助 :)

4

0 回答 0