PowerPoint(PPT)是一款非常優(yōu)秀的工具軟件,,可能大家對(duì)它的第一印象的是用來播放映幻燈片,給客戶展示用,。當(dāng)然,,這是它最本質(zhì)的功能。除此之外,,有少部分人把它當(dāng)作輕量化的矢量繪圖軟件(比如作者),。實(shí)際上,ppt的繪圖能力一點(diǎn)都不差,,除了能夠繪制一些基本的形狀之外,,2013及之后的版本添加了合并形狀的功能,能夠?qū)崿F(xiàn)形狀的聯(lián)合,、組合,、拆分、相交和剪除,,進(jìn)一步增強(qiáng)了其繪圖能力,。 用過其他繪圖軟件的網(wǎng)友應(yīng)該知道,繪制矢量圖時(shí)有一個(gè)非常常用的功能——陣列,。遺憾的是,,直到2016版的PPT都沒有將這個(gè)功能添加進(jìn)去(可能有,作者沒找到),,難道是因?yàn)闆]有人需要這種功能嗎?也許有網(wǎng)友的動(dòng)手能力比較強(qiáng),,直接復(fù)制后再對(duì)齊,非常暴力,。作者屬于比較懶的,,像這種規(guī)則的排列是懶得動(dòng)手的。而且,,常用的陣列有三種:矩形,、環(huán)形、環(huán)形并旋轉(zhuǎn),。第一種可以暴力解決,,后兩種呢?沒有一定的三角函數(shù)的知識(shí)是解決不了的。因此,,作者認(rèn)為,,用程序自動(dòng)陣列是很有必要的。有高手能用VBA解決,缺點(diǎn)是VBA得跟著文檔走,,PPT默認(rèn)還會(huì)禁用宏,,一般用戶不打開開發(fā)工具還找不著它。在PPT的功能界面添加這么一個(gè)功能,,既方便又實(shí)用,。 無圖無真相,先上圖 ▲三種不同類型的陣列 ▲PPT陣列加載項(xiàng) “陣列”選項(xiàng)卡完全和內(nèi)置的選項(xiàng)卡融為一體了,,不知道的人還以為是軟件自帶的功能呢,,哈哈。本著能網(wǎng)上下載就不自己動(dòng)手的原則,,先附上下載鏈接(需要.net 4.0),。 下面開始教程: 序言:作者用的是VS2017,PowerPoint 2016,,理論上別的版本也適合,。 1、安裝開發(fā)環(huán)境 ▲添加Office/SharePoint開發(fā) 2,、新建PowerPoint 2013和2016 VSTO外接程序 作者用的是C#,,.Net版本需要4.0以上,選中PowerPoint 2013和2016 VSTO外接程序,,給你的工程取個(gè)名字,,如PowerPointArray,單擊確定,。 3,、界面設(shè)計(jì) 3.1 添加一個(gè)Ribbon界面,項(xiàng)目——添加新項(xiàng)——功能區(qū)(可視化設(shè)計(jì)器),,隨便起個(gè)名稱,,如RibbonArray.cs,如圖 3.2 界面設(shè)計(jì) 單擊TadAddIns(內(nèi)置),,在右邊修改成屬性,。ControlldType改成Custom,Label改成陣列,。單擊group1,,其Label改成陣列。在陣列這個(gè)group上拉控件: Dropdown——1個(gè),,用來存放不同的陣列類型,添加3個(gè)Items,,Label分別設(shè)置為矩形,、環(huán)形、環(huán)形(旋轉(zhuǎn)) EditBox——4個(gè),用來給用戶輸入?yún)?shù) Button——1個(gè),,生成陣列 最終效果如下圖 4,、開始寫代碼 4.1 雙擊Label為“類型”的DropDown控件,生成SelectionChanged事件,,主要用來更改四個(gè)EditBox的Label,。 private void dropDown1_SelectionChanged(object sender, RibbonControlEventArgs e) { switch (dropDown1.SelectedItemIndex) { case 0: editBox1.Label = '水平間距'; editBox2.Label = '水平數(shù)量'; editBox3.Label = '豎直間距'; editBox4.Label = '豎直數(shù)量'; break; case 1: case 2: editBox1.Label = '角度'; editBox2.Label = '數(shù)量'; editBox3.Label = '中心X'; editBox4.Label = '中心Y'; break; default: break; } }
在RibbonArray_Load事件中添加如下代碼,讓加載項(xiàng)加載時(shí)選中矩形的陣列類型,。 dropDown1.SelectedItemIndex = 0;
4.2雙擊Label為“生成”的Button控件,,生成Click事件,為生成陣列的主程序,,下面以矩形陣列為例介紹,,各行的含義在代碼中注釋了。 try { if (dropDown1.SelectedItemIndex == 0) { float xInterval = Convert.ToSingle(editBox1.Text) * 72 / 2.54f;//水平方向間距,,默認(rèn)單位為磅,,需要轉(zhuǎn)換成厘米 int xNum = Convert.ToInt32(editBox2.Text);//水平方向陣列個(gè)數(shù) float yInterval = Convert.ToSingle(editBox3.Text) * 72 / 2.54f;//豎直方向間距,默認(rèn)單位為磅,,需要轉(zhuǎn)換成厘米 int yNum = Convert.ToInt32(editBox4.Text);//豎直方向陣列個(gè)數(shù) Globals.ThisAddIn.Application.ActiveWindow.Selection.ShapeRange.Left -= 12;//選中圖形的位置向左移12磅,,復(fù)制時(shí)會(huì)自動(dòng)加12 Globals.ThisAddIn.Application.ActiveWindow.Selection.ShapeRange.Top -= 12;//選中圖形的位置向上移12磅,復(fù)制時(shí)會(huì)自動(dòng)加12 float xOriginal = Globals.ThisAddIn.Application.ActiveWindow.Selection.ShapeRange.Left;//保存下選中圖形的初始位置 float yOriginal = Globals.ThisAddIn.Application.ActiveWindow.Selection.ShapeRange.Top; //開始循環(huán)復(fù)制 for (int x = 1; x <= xnum;=""> { for (int y = 1; y <= ynum;=""> { if (x == 1 && y == 1) continue;//已經(jīng)有一個(gè)了,,少?gòu)?fù)制一個(gè)了 Globals.ThisAddIn.Application.ActiveWindow.Selection.ShapeRange.Duplicate();//復(fù)制一個(gè),,水平和豎直方向會(huì)自動(dòng)加12 Globals.ThisAddIn.Application.ActiveWindow.Selection.ShapeRange.Left = xOriginal + (x - 1) * xInterval;//更改原始圖的位置,為下一次復(fù)制做準(zhǔn)備 Globals.ThisAddIn.Application.ActiveWindow.Selection.ShapeRange.Top = yOriginal + (y - 1) * yInterval; } } //最后一個(gè)移到了右下角的位置,,不需要復(fù)制了,,直接手動(dòng)加上12 Globals.ThisAddIn.Application.ActiveWindow.Selection.ShapeRange.Left += 12; Globals.ThisAddIn.Application.ActiveWindow.Selection.ShapeRange.Top += 12; } else { //其他陣列代碼 } } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.Message); }
單擊啟動(dòng),此時(shí)會(huì)自動(dòng)啟動(dòng)PPT,,需要在此之前沒有PPT軟件沒運(yùn)行,。輸入合適的參數(shù),點(diǎn)生成就能直接生成陣列了,。效果如下圖,。 環(huán)形(旋轉(zhuǎn))陣列就屬于數(shù)學(xué)問題了,大家可以自己琢磨,。
|