使用OpenXML创建.pptx文件

时间:2013-10-28 09:23:31

标签: c# openxml-sdk

我想基于C#中的模板创建PowerPoint演示文稿。 我使用的是OpenXML 2.0 SDK

我的第一步。

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

  1. 我可以根据模板创建幻灯片。

  2. 现在我想在模板中添加一些占位符。

  3. 我在msdn side

    上找到了以下方法
    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++;  
    }
    

    感谢您的帮助:)

0 个答案:

没有答案