如何使用Excel图表更新PowerPoint幻灯片

时间:2012-04-21 13:45:20

标签: openxml spreadsheetml drawingml presentationml

我有一个带有图表(条形图)的Excel文件。我还有一个包含3张幻灯片的Powerpoint演示文稿。请注意,Powerpoint幻灯片上的Excel表格上没有图表“标题”。我需要使用excel文件中的图表更新幻灯片#2中的图表。

请注意,我搜索了这个论坛,我发现的是创建新幻灯片以及使用tittle更新图表的方法。

任何帮助将不胜感激。谢谢你的时间

编辑:你的解决方案很好,但对于如何替换特定幻灯片中的图表没有帮助。在我的问题中,我已经说过有3张幻灯片。我想专门更新幻灯片2中的图表。没有图表标题所以我需要根据幻灯片编号找到要替换的图表。这是怎么做到的?再次感谢。

1 个答案:

答案 0 :(得分:1)

这可以通过以下步骤来完成:(注意:powerpoint是目标,而excel是源)

  1. 打开目标并找到要替换的ChartPart。保留对ChartPart所在的父SlidePart的引用,并将ChartPart的RelationshipId复制到SlidePart,然后从目标中删除ChartPart。
  2. 保存来源并保持文件打开。

            foreach (var slidePart in targetPPT.PresentationPart.SlideParts)
            {
                if (slidePart.ChartParts.Any())
                {
                    slidePartBookMark = slidePart;
    
                    var chartPart = slidePart.ChartParts.First();
                    chartPartIdBookMark = slidePart.GetIdOfPart(chartPart);
                    slidePart.DeletePart(chartPart);
                    slidePart.Slide.Save();
                    return;
                }
            }
    
  3. 打开源并找到要复制到目标的ChartPart。它将位于源代码中某个WorksheetPart的DrawingsPart中。保留对ChartPart的引用并保持文件处于打开状态。

            foreach (var worksheetPart in sourceXls.WorkbookPart.WorksheetParts)
            {
                if (worksheetPart.DrawingsPart != null)
                    if (worksheetPart.DrawingsPart.ChartParts.Any())
                    {
                        saveXlsChart = worksheetPart.DrawingsPart.ChartParts.First();
                        return;
                    }
    
            }
    
  4. 在步骤1的SlidePart参考中,使用RelationshipId创建一个带有AddNewPart调用的新ChartPart

        var newChartPart = slidePartBookMark.AddNewPart<ChartPart>(chartPartIdBookMark);
    
  5. 将源图表的内容复制到您在步骤4中创建的新图表部分,其中找到FeedData / GetStream构思here。保存幻灯片,然后关闭文件。

        newChartPart.FeedData(saveXlsChart.GetStream());
        slidePartBookMark.Slide.Save();
        sourceXls.Close();
        targetPPT.Close();
    
  6. 我能够使用一个只包含一个图表的简单源/目标。如果您的文件更复杂,您的定位逻辑将不仅仅是First()。

    希望这有帮助。