0

代码如下,

 using (PresentationDocument presentationDocumentObj = PresentationDocument.Open(memoryStreamObj,true))
 {
      PresentationPart presentationPart = presentationDocument.PresentationPart;

            // Check for a null document object.
            if (presentationDocument == null)
            { 
                throw new ArgumentNullException("presentationDocument");
            }


            // Get the Slide Id collection of the presentation document
            var slideIdList = presentationPart.Presentation.SlideIdList;

            if (slideIdList == null)
                throw new NullReferenceException("The number of slide is empty, please select a ppt with a slide at least again");

            // Get all Slide Part of the presentation document 
            var list = slideIdList.ChildElements.Cast<SlideId>().Select(x => presentationPart.GetPartById(x.RelationshipId)).Cast<SlidePart>();

 }

最后一行代码使 power point 模板损坏。我的 openxml 版本是 2.5。任何人请告诉我我要去哪里错了。

  • 编辑

这是我加载 memoryStreamObj 的方式,

byte[] reportByteArray = null;
        using (MemoryStream memoryStreamObj = new MemoryStream())
        {
            memoryStreamObj.Write(reportTemplateByteArray, 0, (int)reportTemplateByteArray.Length);
            using (PresentationDocument presentationDocumentObj = PresentationDocument.Open(memoryStreamObj,true))
         {                   
               //made changes to template

         }
            reportByteArray = memoryStreamObj.GetBuffer();
     }
4

1 回答 1

1

以下行是问题所在,

memoryStreamObj.GetBuffer();

而是使用以下内容,

memoryStreamObj.ToArray();

MSDN 文档如下,

请注意,缓冲区包含可能未使用的已分配字节。例如,如果将字符串“test”写入 MemoryStream 对象,则从 GetBuffer 返回的缓冲区长度为 256,而不是 4,其中 252 个字节未使用。要仅获取缓冲区中的数据,请使用 ToArray 方法;但是,ToArray 会在内存中创建数据的副本。

有关详细信息,请参阅以下链接,

MemoryStream 上的 GetBuffer() 什么时候有用?

于 2017-05-18T14:50:46.837 回答