• C#操作PPT动画窗格并插入音频文件的一些思路


    目录

    系统环境

    基础配置

    设计想法

    关键代码

    组件库引入

    基础代码

    核心代码

    总结


    系统环境

    在 Windows Server 2019 操作系统上安装Office PowerPoint 2016或以上

    安装 .netFramework4.7.1以上

    开发工具 VS2019 语言 C#

    基础配置

    打开控制面板、管理工具、组件服务:

    点击组件服务、计算机、我的电脑、DCOM配置 

     找到Microsoft PowerPoint应用程序

     选择属性、打开标识选项卡、选择下列用户选项,设置启动PPT应用的用户,点确定即可。

     

    设计想法

    由用户设计PPT及每页的动画效果,并以此为模板,与给定的一组音频文件,通过程序控制进行二次合成,插入的依据则是根据提供的动画标题进行搜索定位(标题可以模糊搜索)。这个设计想法来源于我的文章 Craneoffice云PPT课件培训视频生成系统,可参考一下。

    我们假设如下图,要在两组动画效果中,执行完成一个动画效果后插入一段音频讲解词,动画效果的标题为:

    (1)组合6:对应插入P5_01.MP3讲解词。

    (1)组合30:对应插入P5_02.MP3讲解词。

    那么设计原理,就是遍历动画窗格的动画效果对象,记录对象的持续时间和延迟时间,插入音频后,则下一个动画效果的延迟时间根据上一动画效果对象的时间和音频的时间累积进行计算,并更改动画效果的开始条件,如下图:

    如图,下一个动画效果对象的延迟时间重新计算,是根据“组合6" 和 "P5_01" 的时间进行累积计算得到的,以此类推。 

    关键代码

    组件库引入

    基础代码

    1. //创建PPT应用程序
    2. POWERPOINT.Application objApp = new POWERPOINT.Application();
    3. POWERPOINT.Presentation objPresSet = null;
    4. // 不显示弹出警告等,最小化窗口应用
    5. objApp.DisplayAlerts = POWERPOINT.PpAlertLevel.ppAlertsNone;
    6. objApp.WindowState = POWERPOINT.PpWindowState.ppWindowMinimized;
    7. //打开文件,假设模板文件名为m1.pptx
    8. objPresSet = objApp.Presentations.Open("m1.pptx", Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoFalse);
    9. //创建查找字典
    10. Dictionary<string, string> Medias = new Dictionary<string, string>();
    11. Medias.Add("组合6","P5_01.MP3");
    12. Medias.Add("组合30", "P5_02.MP3");

    核心代码

    1. //遍历所有的幻灯片对象
    2. for (int i = 1; i <= objPresSet.Slides.Count; i++)
    3. {
    4. POWERPOINT.Slide slide = objPresSet.Slides[i]; //获取当前幻灯片对象
    5. if (slide.TimeLine.MainSequence.Count == 0) continue; //如果该页没有动画效果则短路
    6. ...
    7. }
    8. //按提供的字典进行查找
    9. foreach (string[] pros in Medias)
    10. {
    11. string f_likecaption = pros[0]; //要查找的动画标题
    12. mediafile = pros[1]; //对应要添加的MP3文件地址
    13. POWERPOINT.Shape wave=null; //初始化一个声音变量,在PPT里也是一个Shape对象
    14. //遍历该页动画效果
    15. for (int j = 1; j <= slide.TimeLine.MainSequence.Count; j++)
    16. {
    17. POWERPOINT.Effect effect = slide.TimeLine.MainSequence[j];
    18. //如果查找到动画标题,则添加对应的声音文件
    19. if (((effect.Shape.Name + ":" + effect.DisplayName).IndexOf(f_likecaption.Trim()) != -1
    20. {
    21. wave = slide.Shapes.AddMediaObject2(mediafile); //添加声音文件方法
    22. int singleWaveLen = wave.MediaFormat.Length; //记录声音的长度
    23. wave.Left = 60; //shape对象的位置
    24. wave.AnimationSettings.Animate = Microsoft.Office.Core.MsoTriState.msoTrue; //设置该对象要成为动画
    25. wave.AnimationSettings.PlaySettings.PlayOnEntry = Microsoft.Office.Core.MsoTriState.msoTrue; //设置为允许自动播放
    26. wave.AnimationSettings.PlaySettings.HideWhileNotPlaying = Microsoft.Office.Core.MsoTriState.msoTrue; //设置播放期间是隐藏状态
    27. wave.AnimationSettings.AdvanceMode = POWERPOINT.PpAdvanceMode.ppAdvanceOnTime;//设置与上一动画同时
    28. wave.AnimationSettings.AnimationOrder = slide.TimeLine.MainSequence.Count;
    29. //shape对象的索引位置,默认为最后一个,这个要根据业务逻辑进行调整
    30. break;
    31. }
    32. }//for
    33. ..............
    34. }//foreach pros
    35. //其它关键属性
    36. POWERPOINT.Effect effect ;
    37. effect.Timing.Duration //返回或设置以秒为单位的动画长度
    38. float WaveLen = float.Parse((singleWaveLen / 1000.0).ToString()); //声音长度需要换算成秒

    总结

    这些代码我们提供了一些操作PPT相关的关键方法、属性,我们需要根据实际的业务情况进行修改,这里仅作参考。欢迎大家评论指教!

  • 相关阅读:
    MongoDB常用的比较符号和一些功能符号
    堆结构的深度理解
    记录--h5调用手机摄像头踩坑
    uniapp——实现二维码生成+保存二维码图片——基础积累
    IT6664: 1-to-4 HDMI 2.0/MHL Dual in Active Splitter with EDID RAM
    报错:Gradle build failed.See the Console for details.(已解决)
    红米K40功能介绍
    大数据在电力行业的应用案例100讲(二十六)-分布式ID微服务实现及应用
    Spring Cloud 2023 新特性 同步网关
    const char *转 LPCWSTR
  • 原文地址:https://blog.csdn.net/michaelline/article/details/133528540