[Office 2010 開發 ] 利用 OpenXML 來把你的多份 PowerPoint 合併在一起

  • 7841
  • 0
  • 2010-05-20

[Office 2010 開發 ] 利用 OpenXML 來把你的多份 PowerPoint 合併在一起

而在本文中將會主要介紹下方幾項實作內容:

  1. 透過 Open XML SDK 開啟 PowerPoint 目標文件檔
  2. 再開啟 PowerPoint 來源文件檔
  3. 針對目標文件在來源檔新增投影片
  4. 把每一個投影片都附予唯一的 ID 值以辨識
  5. 存檔

 

 

image

>> 這是來源檔案 ( one.pptx )

 

 

image

>> 這是目標檔案 ( Two.pptx )

 

 

image

>> 這是最終的整合後檔案 ( output.pptx )

 

 

 

 

 

 

☆ 程式部份

 

◇ 請先建立一個 Concole Application (主控台)

◇ 再把 Program.cs 檔更改成如下的程式碼

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Text;
   5:  using System.IO;
   6:  using System.IO.Packaging;
   7:  using DocumentFormat.OpenXml;
   8:  using DocumentFormat.OpenXml.Packaging;
   9:  using DocumentFormat.OpenXml.Presentation;
  10:   
  11:  namespace AssemblePowerPointDecks
  12:  {
  13:      class Program
  14:      {
  15:          //可以透過 ID 來針對兩份投影片的主 ID 及投影片佈景主題 ID 清單
  16:          static uint uniqueId;
  17:   
  18:          static void Main(string[] args)
  19:          {
  20:              string destDeck = "output.pptx";
  21:   
  22:              File.Copy("one.pptx", destDeck, true);
  23:              MergeDecks("Two.pptx", destDeck);
  24:          }
  25:   
  26:          static void MergeDecks(string sourceDeck, string destDeck)
  27:          {
  28:              int id = 1;
  29:              //開啟目標檔案
  30:              using (PresentationDocument myDestDeck = PresentationDocument.Open(destDeck, true))
  31:              {
  32:                  PresentationPart destPresPart = myDestDeck.PresentationPart;
  33:   
  34:                  //開啟來源檔案
  35:                  using (PresentationDocument mySourceDeck = PresentationDocument.Open(sourceDeck, true))
  36:                  {
  37:                      PresentationPart sourcePresPart = mySourceDeck.PresentationPart;
  38:   
  39:                      //需取得投影片(佈景主題)清單中唯一的id以利稍後使用
  40:                      uniqueId = GetMaxIdFromChild(destPresPart.Presentation.SlideMasterIdList);                   
  41:                      uint maxSlideId = GetMaxIdFromChild(destPresPart.Presentation.SlideIdList);
  42:   
  43:                      //複製每一個來源投影片
  44:                      foreach (SlideId slideId in sourcePresPart.Presentation.SlideIdList)
  45:                      {
  46:                          SlidePart sp;
  47:                          SlidePart destSp;
  48:                          SlideMasterPart destMasterPart;
  49:                          string relId;
  50:                          SlideMasterId newSlideMasterId;
  51:                          SlideId newSlideId;
  52:   
  53:                          //準備唯一關連的ID值
  54:                          id++;
  55:                          sp = (SlidePart)sourcePresPart.GetPartById(slideId.RelationshipId);                        
  56:                          relId = sourceDeck.Remove(sourceDeck.IndexOf('.')) + id;                       
  57:                          destSp = destPresPart.AddPart<SlidePart>(sp, relId);
  58:   
  59:                          //Master part was added, but now we need to make sure the relationship is in place
  60:                          destMasterPart = destSp.SlideLayoutPart.SlideMasterPart;                        
  61:                          destPresPart.AddPart(destMasterPart);
  62:   
  63:                          //新增投影片母片至投影片母片清單中
  64:                          uniqueId++;
  65:                          newSlideMasterId = new SlideMasterId();
  66:                          newSlideMasterId.RelationshipId = destPresPart.GetIdOfPart(destMasterPart);                        
  67:                          newSlideMasterId.Id = uniqueId;
  68:   
  69:                          //新增投影片至投影片清單中
  70:                          maxSlideId++;
  71:                          newSlideId = new SlideId();
  72:                          newSlideId.RelationshipId = relId;                        
  73:                          newSlideId.Id = maxSlideId;
  74:   
  75:                          destPresPart.Presentation.SlideMasterIdList.Append(newSlideMasterId);
  76:                          destPresPart.Presentation.SlideIdList.Append(newSlideId);
  77:                      }
  78:                      //確定所有投影片的 id 皆是唯一值
  79:                      FixSlideLayoutIds(destPresPart);
  80:                  }
  81:                  destPresPart.Presentation.Save();
  82:              }
  83:          }
  84:   
  85:          static void FixSlideLayoutIds(PresentationPart presPart)
  86:          {
  87:              //確定所有投影片佈景主題是有唯一 id
  88:              foreach (SlideMasterPart slideMasterPart in presPart.SlideMasterParts)
  89:              {
  90:                  foreach (SlideLayoutId slideLayoutId in slideMasterPart.SlideMaster.SlideLayoutIdList)
  91:                  {
  92:                      uniqueId++;
  93:                      slideLayoutId.Id = (uint)uniqueId;
  94:                  }
  95:                  slideMasterPart.SlideMaster.Save();
  96:              }
  97:          }
  98:   
  99:          static uint GetMaxIdFromChild(OpenXmlElement el)
 100:          {
 101:              uint max = 1;
 102:              //從設立的子群中取得最大ID值
 103:              foreach (OpenXmlElement child in el.ChildElements)
 104:              {
 105:                  OpenXmlAttribute attribute = child.GetAttribute("id", "");
 106:   
 107:                  uint id = uint.Parse(attribute.Value);
 108:   
 109:                  if (id > max)
 110:                      max = id;
 111:              }
 112:              return max;
 113:          }
 114:      }
 115:  }

 

 

 

>> 檔案下載:點我下載

--->  本文預設於 2010.05.20 登入「Office/Sharepoint 開發組

 

 

 

 

 

 

 

 

 

 

>> 參考翻譯及引用:How to Assemble Multiple PowerPoint Decks