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#" };
 ... }

私は何を間違っていますか?placeholder-method をどのように変更する必要がありますか?

よろしくお願いします!

編集:私はいくつかの奇妙なことを発見しました。PowerPoint テンプレートで「#header#」というプレースホルダーを宣言し、プログラムで「#header#」を検索していましたが、プログラムを 1 回実行した後、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();

パワーポイントクラス:

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