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,如需转载请自行联系原作者

 

相关文章
|
4月前
|
测试技术 Android开发 Python
探索软件测试的艺术:从基础到高级安卓应用开发中的自定义视图
【8月更文挑战第29天】在软件开发的世界中,测试是不可或缺的一环。它如同艺术一般,需要精细的技巧和深厚的知识。本文旨在通过浅显易懂的语言,引领读者从软件测试的基础出发,逐步深入到更复杂的测试策略和工具的使用,最终达到能够独立进行高效测试的水平。我们将一起探索如何通过不同的测试方法来确保软件的质量和性能,就像艺术家通过不同的色彩和笔触来完成一幅画作一样。
|
2月前
|
机器学习/深度学习 编解码 监控
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
这篇文章详细介绍了如何使用YOLOv8进行目标检测任务,包括环境搭建、数据准备、模型训练、验证测试以及模型转换等完整流程。
2293 1
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
2月前
|
机器学习/深度学习 JSON 算法
实例分割笔记(一): 使用YOLOv5-Seg对图像进行分割检测完整版(从自定义数据集到测试验证的完整流程)
本文详细介绍了使用YOLOv5-Seg模型进行图像分割的完整流程,包括图像分割的基础知识、YOLOv5-Seg模型的特点、环境搭建、数据集准备、模型训练、验证、测试以及评价指标。通过实例代码,指导读者从自定义数据集开始,直至模型的测试验证,适合深度学习领域的研究者和开发者参考。
657 3
实例分割笔记(一): 使用YOLOv5-Seg对图像进行分割检测完整版(从自定义数据集到测试验证的完整流程)
|
2月前
|
机器学习/深度学习 监控 计算机视觉
目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
本文介绍了如何使用YOLOv7进行目标检测,包括环境搭建、数据集准备、模型训练、验证、测试以及常见错误的解决方法。YOLOv7以其高效性能和准确率在目标检测领域受到关注,适用于自动驾驶、安防监控等场景。文中提供了源码和论文链接,以及详细的步骤说明,适合深度学习实践者参考。
457 0
目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
2月前
|
机器学习/深度学习 并行计算 数据可视化
目标分类笔记(二): 利用PaddleClas的框架来完成多标签分类任务(从数据准备到训练测试部署的完整流程)
这篇文章介绍了如何使用PaddleClas框架完成多标签分类任务,包括数据准备、环境搭建、模型训练、预测、评估等完整流程。
121 0
目标分类笔记(二): 利用PaddleClas的框架来完成多标签分类任务(从数据准备到训练测试部署的完整流程)
|
2月前
|
机器学习/深度学习 JSON 算法
语义分割笔记(二):DeepLab V3对图像进行分割(自定义数据集从零到一进行训练、验证和测试)
本文介绍了DeepLab V3在语义分割中的应用,包括数据集准备、模型训练、测试和评估,提供了代码和资源链接。
242 0
语义分割笔记(二):DeepLab V3对图像进行分割(自定义数据集从零到一进行训练、验证和测试)
|
2月前
|
机器学习/深度学习 数据采集 算法
目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)
这篇博客文章介绍了如何使用包含多个网络和多种训练策略的框架来完成多目标分类任务,涵盖了从数据准备到训练、测试和部署的完整流程,并提供了相关代码和配置文件。
62 0
目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)
|
2月前
|
机器学习/深度学习 XML 并行计算
目标检测实战(七): 使用YOLOX完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
这篇文章介绍了如何使用YOLOX完成图像目标检测任务的完整流程,包括数据准备、模型训练、验证和测试。
196 0
目标检测实战(七): 使用YOLOX完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
2月前
|
机器学习/深度学习 算法 PyTorch
目标检测实战(五): 使用YOLOv5-7.0版本对图像进行目标检测完整版(从自定义数据集到测试验证的完整流程)
本文详细介绍了使用YOLOv5-7.0版本进行目标检测的完整流程,包括算法介绍、环境搭建、数据集准备、模型训练、验证、测试以及评价指标。YOLOv5以其高精度、快速度和模型小尺寸在计算机视觉领域受到广泛应用。
743 0
目标检测实战(五): 使用YOLOv5-7.0版本对图像进行目标检测完整版(从自定义数据集到测试验证的完整流程)
|
2月前
|
算法 Java 测试技术
数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题
文章详细介绍了如何用Java自定义实现一个顺序表类,包括插入、删除、获取数据元素、求数据个数等功能,并对顺序表进行了测试,最后还提及了Java中自带的顺序表实现类ArrayList。
30 0