VSTO Office二次开发对PPT自定义任务窗格测试

简介:

VSTO Office二次开发对PPT自定义任务窗格测试

  上篇文章对VSTO Office二次开发操作PPT功能做了简单测试,主要是如何创建一个外接程序并在新建PPT幻灯片时添加自定义文本信息、如何简单自定义任务窗格、如何添加可视化功能区的简单介绍,应该对于VSTO如何操作PPT有简单了解,本篇分享对于自定义任务窗格的相关测试。

一、功能区按钮控制CustomTaskPane的显示隐藏
1.新建一个外接程序,添加可视化功能区和用户自定义控件,在可视化功能区添加两个按钮,一个用来控制自定义任务窗格显示,一个用来控制自定义任务窗格隐藏的。
2.先将自定义任务窗格关联到外接程序,在ThisAddIn.cs文件添加如下代码:

复制代码
      public CustomTaskPane myCustomTaskPanel = null;//自定义
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            AddTaskPane();//添加自定义Task Pane
        }

     /// <summary>
        /// 添加自定义的Task Pane
        /// </summary>
        private void AddTaskPane()
        {
            UCTaskPane taskPane = new UCTaskPane();//自定义用户控件名称
            myCustomTaskPanel = this.CustomTaskPanes.Add(taskPane, "My Task Pane");
            myCustomTaskPanel.Width = 200;
            myCustomTaskPanel.Visible = true;
        }
复制代码

3.在可视化功能区的两个按钮添加如下代码:

复制代码
/// <summary>
        /// 打开自定义任务窗格
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOpenTask_Click(object sender, RibbonControlEventArgs e)
        {
            if (Globals.ThisAddIn.myCustomTaskPanel != null)
            {
                Globals.ThisAddIn.myCustomTaskPanel.Visible = true;
            }
        }
        /// <summary>
        /// 关闭自定义任务窗格
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnClosePanel_Click(object sender, RibbonControlEventArgs e)
        {
            if (Globals.ThisAddIn.myCustomTaskPanel != null)
            {
                Globals.ThisAddIn.myCustomTaskPanel.Visible = false;
            }
        }
复制代码

F5运行,看看效果。也可以在可视化功能区只需添加一个切换按钮(ToggleButton),在按钮点击事件添加一行代码也能很好的控制任务窗格的显示与隐藏:
Globals.ThisAddIn.myCustomTaskPanel.Visible = toggleBtn.Checked;
主要是如何去调用自定义任务窗格:Globals.ThisAddIn.myCustomTaskPanel,然后就是对其进行控制操作(自定义任务窗格可以很好的实现类似WPS的素材库呈现的功能)。

二、自定义任务窗格对幻灯片的相关操作
功能:在自定义任务窗格中,添加一个日期控件,通过其DateChanged事件实现对PPT中对应幻灯片的相关操作,添加文字、添加图片、添加多媒体对象
1.新添加一个用户自定义控件,添加一个日期控件,在其DateChanged事件添加如下代码:

复制代码
 private PowerPoint.Shape textbox;
 private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e)
        {
            if (textbox != null)
            {
                textbox.Delete();
            }

PowerPoint.Slides slides = Globals.ThisAddIn.Application.ActivePresentation.Slides;//获取当前应用程序的所有PPT文档 for (int i = 1; i <= slides.Count; i++)//遍历该文档集合,添加文本框 { PowerPoint.Slide slide = slides[i]; textbox = slide.Shapes.AddTextbox(Office.MsoTextOrientation.msoTextOrientationHorizontal, 50, 100, 600, 50);//向当前PPT添加文本框    textbox.TextFrame.TextRange.Text = textContent;//设置文本框的内容    textbox.TextFrame.TextRange.Font.Size = 48;//设置文本字体大小    textbox.TextFrame.TextRange.Font.Color.RGB = Color.DarkViolet.ToArgb();//设置文本颜色 } }
复制代码

2.F5运行,点击日期就会在PPT中每一个的幻灯片中将添加一个TextBox对象,位置在(左50,顶100),大小(宽600,高50)。
主要是如何去获取当前演示文稿的所有幻灯片:Globals.ThisAddIn.Application.ActivePresentation.Slides
3.简单封装扩展:添加文字、添加图片、添加多媒体对象、OLE对象

复制代码
 /// <summary>
        /// 添加TextBox文本框
        /// </summary>
        /// <param name="slide">要添加文本框的幻灯片</param>
        /// <param name="textContent">文本框显示内容</param>
        private void AddTextBox(PowerPoint.Slide slide, string textContent)
        {
            PowerPoint.Shape textbox;
            textbox = slide.Shapes.AddTextbox(Office.MsoTextOrientation.msoTextOrientationHorizontal, 50, 100, 600, 50);//向当前PPT添加文本框
            textbox.TextFrame.TextRange.Text = textContent;//设置文本框的内容
            textbox.TextFrame.TextRange.Font.Size = 48;//设置文本字体大小
            textbox.TextFrame.TextRange.Font.Color.RGB = Color.DarkViolet.ToArgb();//设置文本颜色
        }

        /// <summary>
        /// 添加图片
        /// </summary>
        /// <param name="slide"></param>
        /// <param name="shape"></param>
        /// <param name="filePath"></param>
        private void AddADPicture(PowerPoint.Slide slide, PowerPoint.Shape shape, string filePath)
        {
            PowerPoint.Shape pic;
            pic = slide.Shapes.AddPicture(filePath, Office.MsoTriState.msoFalse, Office.MsoTriState.msoTrue, shape.Left, shape.Top, shape.Width, shape.Height);
            pic.Name = "AD" + shape.Name;//
        }

        /// <summary>
        /// 添加音频\视频文件
        /// </summary>
        /// <param name="slide"></param>
        /// <param name="shape"></param>
        /// <param name="filePath"></param>
        private void AddMediaObj(PowerPoint.Slide slide, PowerPoint.Shape shape, string filePath)
        {
            PowerPoint.Shape media;
            media = slide.Shapes.AddMediaObject(filePath, shape.Left, shape.Top, shape.Width, shape.Height);
            media.Name = shape.Name;
        }

        /// <summary>
        /// 通过文件路径添加OLE对象
        /// </summary>
        /// <param name="slide"></param>
        /// <param name="shape"></param>
        /// <param name="className"></param>
        private void AddClassOLEObj(PowerPoint.Slide slide, PowerPoint.Shape shape,string className)
        {
            PowerPoint.Shape oleObj;
            oleObj=slide.Shapes.AddOLEObject(Left:shape.Left,Top:shape.Top,Width:shape.Width,Height:shape.Height,ClassName:className);
            oleObj.Name = shape.Name;
        }

        /// <summary>
        /// 通过ClassName添加OLE对象
        /// </summary>
        /// <param name="slide"></param>
        /// <param name="shape"></param>
        /// <param name="fileName"></param>
        private void AddFileOLEObj(PowerPoint.Slide slide, PowerPoint.Shape shape, string fileName)
        {
            PowerPoint.Shape oleObj;
            oleObj = slide.Shapes.AddOLEObject(Left: shape.Left, Top: shape.Top, Width: shape.Width, Height: shape.Height,FileName:fileName);
            oleObj.Name = shape.Name;
        }
复制代码

添加OLE调用:(OLE识别符:http://msdn.microsoft.com/zh-cn/library/ff746158.aspx)

复制代码
string filePath = "E:\\FF.doc";
                filePath = "E:\\FF.ppt";
                filePath = "E:\\FF.xls";

                filePath = @"C:\Users\Administrator\Videos\广联达PB043926.AVI";
                filePath = @"C:\Users\Administrator\Videos\广联达轻轻的问候.swf";

                //AddMedia(slide, filePath);

                AddOLEDPath(slide, filePath);

                string className = "Excel.Sheet";
                className = "Word.Document";
                className = "PowerPoint.Slide";
                // AddOLEDClass(slide, className);
复制代码

4.对于幻灯片中shapes的遍历处理:(可以根据不同的业务需要对对应的幻灯片 中的一些形状进行处理)

复制代码
PowerPoint.Slides slides = Application.ActivePresentation.Slides;//获取当前演示文稿所有幻灯片
            if (!IsHandler(slides))//所有对象是否处理过
            {
                for (int i = 1; i <= slides.Count; i++)
                {
                    PowerPoint.Slide slide = slides[i];
                    PowerPoint.Shapes shapes = slide.Shapes;
                    int count = shapes.Count;//元素集合总数是变化的
                    for (int j = 1; j <= count; j++)
                    {
                        if (shapes[i].Name.Contains("PPT"))
                        {
                            shapes[j].Visible = Office.MsoTriState.msoFalse;//将其隐藏
                            string picPath = "c:\\AD.jpg";//
                            AddPicture(slide, shapes[j], picPath);//替换图片
                        }
                    }
                }
            }
 private void AddPicture(PowerPoint.Slide slide, PowerPoint.Shape shape, string filePath)
        {
            PowerPoint.Shape pic;
            pic = slide.Shapes.AddPicture(filePath, Office.MsoTriState.msoFalse, Office.MsoTriState.msoTrue, shape.Left, shape.Top, shape.Width, shape.Height);
            pic.Name = "AD" + shape.Name;
        }
复制代码

三、相关资料参考

MSDN参考资料:
PowerPoint 2013 开发
http://msdn.microsoft.com/zh-cn/library/office/fp161225.aspx

PowerPoint 2013 开发人员参考 (机器翻译)
http://msdn.microsoft.com/zh-cn/library/office/ee861525.aspx

PowerPoint 2013对象模型引用 
http://msdn.microsoft.com/zh-cn/library/office/ee861525.aspx

PowerPoint 解决方案 
http://msdn.microsoft.com/zh-cn/library/vstudio/bb772069.aspx

 

相关博客资料:
C# PowerPoint操作的基本用法
http://www.cnblogs.com/hyruur/archive/2011/02/14/1954118.html

VSTO简介及其部署
http://blog.csdn.net/v_jzho/article/category/339472

我的VSTO之路系列
http://www.cnblogs.com/izualx/tag/VSTO/

探索 Word 2007 开发
http://www.cnblogs.com/allenlooplee/category/104575.html

Excel 二次开发系列
http://www.cnblogs.com/tomin/category/209011.html

VSTO项目开发
http://www.cnblogs.com/2018/category/249767.html

VSTO对象操作
http://blog.csdn.net/tianyu0910/article/category/703094

VSTO学习笔记
http://www.cnblogs.com/brooks-dotnet/category/233027.html


本文转自SanMaoSpace博客园博客,原文链接:http://www.cnblogs.com/SanMaoSpace/archive/2013/02/19/2917739.html,如需转载请自行联系原作者

 

相关文章
|
9天前
|
测试技术 Android开发 Python
探索软件测试的艺术:从基础到高级安卓应用开发中的自定义视图
【8月更文挑战第29天】在软件开发的世界中,测试是不可或缺的一环。它如同艺术一般,需要精细的技巧和深厚的知识。本文旨在通过浅显易懂的语言,引领读者从软件测试的基础出发,逐步深入到更复杂的测试策略和工具的使用,最终达到能够独立进行高效测试的水平。我们将一起探索如何通过不同的测试方法来确保软件的质量和性能,就像艺术家通过不同的色彩和笔触来完成一幅画作一样。
|
23天前
|
资源调度 Java 调度
项目环境测试问题之Schedulerx2.0通过分布式分片任务解决单机计算瓶颈如何解决
项目环境测试问题之Schedulerx2.0通过分布式分片任务解决单机计算瓶颈如何解决
项目环境测试问题之Schedulerx2.0通过分布式分片任务解决单机计算瓶颈如何解决
|
23天前
|
Cloud Native Java 调度
项目环境测试问题之线程同步器会造成执行完任务的worker等待的情况如何解决
项目环境测试问题之线程同步器会造成执行完任务的worker等待的情况如何解决
|
24天前
PPT 放映电脑Office版本低怎么办
PPT 放映电脑Office版本低怎么办
10 0
|
2月前
|
存储 Web App开发 Java
《手把手教你》系列基础篇(九十五)-java+ selenium自动化测试-框架之设计篇-java实现自定义日志输出(详解教程)
【7月更文挑战第13天】这篇文章介绍了如何在Java中创建一个简单的自定义日志系统,以替代Log4j或logback。
220 5
|
2月前
|
SQL DataWorks Java
DataWorks操作报错合集之在本地任务和冒烟测试中可以正常运行,但在调度任务中报错,是什么原因
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
2月前
|
XML 测试技术 数据格式
《手把手教你》系列基础篇(八十五)-java+ selenium自动化测试-框架设计基础-TestNG自定义日志-下篇(详解教程)
【7月更文挑战第3天】TestNG教程展示了如何自定义日志记录。首先创建一个名为`TestLog`的测试类,包含3个测试方法,其中一个故意失败以展示日志。使用`Assert.assertTrue`和`Reporter.log`来记录信息。接着创建`CustomReporter`类,继承`TestListenerAdapter`,覆盖`onTestFailure`, `onTestSkipped`, 和 `onTestSuccess`,在这些方法中自定义日志输出。
40 6
|
3月前
|
存储 测试技术
【工作实践(多线程)】十个线程任务生成720w测试数据对系统进行性能测试
【工作实践(多线程)】十个线程任务生成720w测试数据对系统进行性能测试
42 0
【工作实践(多线程)】十个线程任务生成720w测试数据对系统进行性能测试
|
3月前
|
JavaScript Java 测试技术
《手把手教你》系列技巧篇(七十一)-java+ selenium自动化测试-自定义类解决元素同步问题(详解教程)
【6月更文挑战第12天】本文介绍了如何创建一个自定义类库来解决自动化测试中的元素同步问题。作者指出,大部分错误源于元素因时间不同步而引发,为此提供了一种解决方案。在项目实践中,首先在`library`包下创建名为`MyWait`的类,包含一个方法`isElementPresent`,该方法通过循环尝试并等待指定元素出现,避免了直接使用时间等待可能导致的不准确性。之后,在测试类中调用此自定义方法,成功实现了元素同步。代码示例展示了如何在Java+Selenium自动化测试中应用这个自定义类。
50 2
|
3月前
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之任务通过了测试但无法执行,该如何处理
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
20 0
下一篇
DDNS