Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用OpenXML创建PowerPoint演示文稿时PPTX文件损坏_C#_Powerpoint_Openxml - Fatal编程技术网

C# 使用OpenXML创建PowerPoint演示文稿时PPTX文件损坏

C# 使用OpenXML创建PowerPoint演示文稿时PPTX文件损坏,c#,powerpoint,openxml,C#,Powerpoint,Openxml,**重要提示:在代码块之后回答问题** 平台: C#,OpenXMLSDK(2.5),.NET4.0 我正在努力实现的目标 我一直在尝试从数据库中的一些数据和图像生成pptx演示文稿。 任何生成的文件都会损坏,但它确实通过了OOXML验证。我真的不知道我还能做什么 我已经尝试过的 我试图删除图像和文本,然后对删除第一张(模板)幻灯片的代码进行了注释,但没有改变我的最终结果:一个损坏的文件 错误 当我试图打开文件时:“PowerPoint无法显示文件“filename.pptx”中幻灯片上的某些文

**重要提示:在代码块之后回答问题**

平台: C#,OpenXMLSDK(2.5),.NET4.0

我正在努力实现的目标

我一直在尝试从数据库中的一些数据和图像生成pptx演示文稿。 任何生成的文件都会损坏,但它确实通过了OOXML验证。我真的不知道我还能做什么

我已经尝试过的

我试图删除图像和文本,然后对删除第一张(模板)幻灯片的代码进行了注释,但没有改变我的最终结果:一个损坏的文件

错误

当我试图打开文件时:“PowerPoint无法显示文件“filename.pptx”中幻灯片上的某些文本、图像或对象,因为它们已损坏。 受影响的幻灯片已被演示文稿中的空白幻灯片替换,因此无法恢复丢失的信息。若要确保可以在早期版本的PowerPoint中打开该文件,请使用“另存为”命令(文件菜单),并使用相同或新名称保存该文件

代码

下面是我用来生成PPTX的代码:

void GenerateSlides(string fullPath, string path, IEnumerable<Data> data)
    {
        var slidePath = fullPath;

        if (!Directory.Exists(path))
            Directory.CreateDirectory(path);

        // Copy the template file to generate new slides
        File.Copy(string.Format("{0}{1}", path, "TemplateTF.pptx"), slidePath, true);

        using (var presentationDocument = PresentationDocument.Open(slidePath, true))
        {
            var presentationPart = presentationDocument.PresentationPart;
            var slideTemplate = (SlidePart)presentationPart.GetPartById("rId2");

            // Recover the data to fullfill the slidepart
            int i = 1;

            foreach (var singleData in data)
            {
                (...)

                // Creates the new image
                var newSlide = CloneSlidePart(presentationPart, slideTemplate);
                var imgId = "rIdImg" + i;
                var imagePart = newSlide.AddImagePart(ImagePartType.Jpeg, imgId);
                var stream = new MemoryStream();
                using (var file = File.Open(string.Format("{0}{1}"
                    , WebConfigurationManager.AppSettings["pathImages"]
                    , singleData.ImageName), FileMode.Open))
                {
                    var buffer = new byte[file.Length];
                    file.Read(buffer, 0, (int)file.Length);
                    stream.Write(buffer, 0, buffer.Length);
                    imagePart.FeedData(new MemoryStream(buffer));
                }
                // Important method to swap the original image
                SwapPhoto(newSlide, imgId);
                i++;

                InsertContent(newSlide, (...));
                SwapPhoto(newSlide, imgId);
                newSlide.Slide.Save();
            }

            DeleteTemplateSlide(presentationPart, slideTemplate);
            presentationPart.Presentation.Save();
        }
    }

void SwapPhoto(SlidePart slidePart, string imgId)
    {
        var blip = slidePart.Slide.Descendants<Drawing.Blip>().First();
        blip.Embed = imgId;
        slidePart.Slide.Save();
    }

void DeleteTemplateSlide(PresentationPart presentationPart, SlidePart slideTemplate)
    {
        var slideIdList = presentationPart.Presentation.SlideIdList;
        foreach (SlideId slideId in slideIdList.ChildElements)
        {
            if (slideId.RelationshipId.Value.Equals("rId2"))
            {
                slideIdList.RemoveChild(slideId);
            }
        }
        presentationPart.DeletePart(slideTemplate);
    }

SlidePart CloneSlidePart(PresentationPart presentationPart, SlidePart slideTemplate)
    {
        var newSlidePart = presentationPart.AddNewPart<SlidePart>("newSlide" + i);
        i++;
        newSlidePart.FeedData(slideTemplate.GetStream(FileMode.Open));
        newSlidePart.AddPart(slideTemplate.SlideLayoutPart);

        var slideIdList = presentationPart.Presentation.SlideIdList;

        uint maxSlideId = 1;
        SlideId prevSlideId = null;
        foreach (SlideId slideId in slideIdList.ChildElements)
        {
            if (slideId.Id > maxSlideId)
            {
                maxSlideId = slideId.Id;
                prevSlideId = slideId;
            }
        }
        maxSlideId++;

        var newSlideId = slideIdList.InsertAfter(new SlideId(), prevSlideId);
        newSlideId.Id = maxSlideId;
        newSlideId.RelationshipId = presentationPart.GetIdOfPart(newSlidePart);

        return newSlidePart;
    }

void InsertContent(SlidePart slidePart, (...))
    {
        SwapPlaceholderText(slidePart, "Title", "ReplacementString1");
        SwapPlaceholderText(slidePart, "Text", "ReplacementString2");
    }

    void SwapPlaceholderText(SlidePart slidePart, string placeholder, string value)
    {
        var textList = slidePart.Slide.Descendants<Drawing.Text>().Where(
           t => t.Text.Equals(placeholder)).ToList();

        foreach (Drawing.Text text in textList)
        {
            text.Text = value;
        }
    }
void生成滑块(字符串完整路径、字符串路径、IEnumerable数据)
{
var slidePath=完整路径;
如果(!Directory.Exists(path))
CreateDirectory(路径);
//复制模板文件以生成新幻灯片
Copy(string.Format(“{0}{1}”,路径,“TemplateTF.pptx”),slidePath,true);
使用(var presentationDocument=presentationDocument.Open(slidePath,true))
{
var presentationPart=presentationDocument.presentationPart;
var slideTemplate=(SlidePart)presentationPart.GetPartById(“rId2”);
//恢复数据以完全填充幻灯片部分
int i=1;
foreach(数据中的var singleData)
{
(...)
//创建新图像
var newSlide=ClonesslidePart(呈现部分,幻灯片模板);
var imgId=“rIdImg”+i;
var imagePart=newSlide.AddImagePart(ImagePartType.Jpeg,imgId);
var stream=newmemoryStream();
使用(var file=file.Open(string.Format(“{0}{1}”)
,WebConfiguration Manager.AppSettings[“pathImages”]
,singleData.ImageName),FileMode.Open)
{
var buffer=新字节[file.Length];
读取(缓冲区,0,(int)file.Length);
stream.Write(buffer,0,buffer.Length);
imagePart.FeedData(新内存流(缓冲区));
}
//交换原始图像的重要方法
SwapPhoto(newSlide,imgId);
i++;
插入内容(newSlide,(…);
SwapPhoto(newSlide,imgId);
newSlide.Slide.Save();
}
删除模板幻灯片(presentationPart、slideTemplate);
presentationPart.Presentation.Save();
}
}
void SwapPhoto(SlidePart SlidePart,字符串imgId)
{
var blip=slidePart.Slide.subjects().First();
blip.Embed=imgId;
slidePart.Slide.Save();
}
作废删除模板幻灯片(PresentationPart PresentationPart,SlidePart slideTemplate)
{
var slidedlist=presentationPart.Presentation.slidedlist;
foreach(slidedlist.ChildElements中的SlideId SlideId)
{
if(slided.RelationshipId.Value.Equals(“rId2”))
{
slidedlist.RemoveChild(slideId);
}
}
presentationPart.DeletePart(slideTemplate);
}
SlidePart CloneSlidePart(演示部分演示部分,SlidePart slideTemplate)
{
var newSlidePart=presentationPart.AddNewPart(“newSlide”+i);
i++;
FeedData(slideTemplate.GetStream(FileMode.Open));
newSlidePart.AddPart(slideTemplate.SlideLayoutPart);
var slidedlist=presentationPart.Presentation.slidedlist;
uint maxSlideId=1;
SlideId prevlideid=null;
foreach(slidedlist.ChildElements中的SlideId SlideId)
{
如果(slideId.Id>maxSlideId)
{
maxSlideId=slideId.Id;
prevSlideId=slideId;
}
}
maxSlideId++;
var newSlideId=slidedlist.InsertAfter(新的SlideId(),prevSlideId);
newSlideId.Id=maxSlideId;
newSlideId.RelationshipId=presentationPart.GetIdOfPart(newSlidePart);
返回部分;
}
void InsertContent(SlidePart SlidePart,(…))
{
交换LaceHolderText(幻灯片部分,“标题”、“替换字符串1”);
交换LaceHolderText(幻灯片部分,“文本”、“替换字符串2”);
}
void SwaplaceHolderText(SlidePart SlidePart、字符串占位符、字符串值)
{
var textList=slidePart.Slide.subjections()。其中(
t=>t.Text.Equals(占位符)).ToList();
foreach(文本列表中的Drawing.Text文本)
{
text.text=值;
}
}


回答


好的,我意识到MS Office版本是多么的不同

a)如果我尝试使用Office 2013打开.pptx文件:错误消息+完全打开,没有显示任何传统信息的徽标图像或幻灯片部分

b)如果我尝试使用Office 2007打开.pptx文件:错误消息+空幻灯片,则完全没有信息

c)如果我试图用Office 2010打开.pptx文件:错误消息+空幻灯片和我可能拥有的最重要信息:徽标位置的损坏图标

我从我的模板中删除了logo图像,瞧,这个文件是完美生成的