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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM