Excel開發學習筆記 介面互動與控制項的布局

2022-08-05 00:39:18 字數 3839 閱讀 2615

遇到乙個資料處理自動化的問題,於是打算開發乙個基於excel的小工具。在業餘時間一邊自學一邊實踐,抽空把一些知識寫下來以備今後參考,因為走的是盲人摸象的野路子,幼稚與錯誤請多包涵。

開發環境基於vsto,具體配置:visual studio 2010,vb .net,excel 2007,文件級別的定製程式。

除了業務邏輯之外,比較耗時耗力的就是人機互動了。在編寫excel定製程式的過程中,這次用到了以下幾種互動方式:

通過excel工作表(worksheet)獲取使用者輸入

通過按鈕控制項觸發功能**執行

通過treeview控制項顯示內容摘要及導航

通過自定義的windows窗體提供互動

工作表的操作放到後面再說,講一下按鈕控制項button和treeview控制項的布局。

放置控制項的方法:

無非視覺化放置和執行時**載入兩種。視覺化放置比較直觀,通過visual studio的toolbox工具欄拖動需要的控制項到工作表上或者自定義的windows窗體上,然後可以在設計介面設定控制項的各種引數,在程式啟動時自 動載入。**載入則需要去msdn上查詢各種控制項開放的api介面,然後寫**呼叫api,在程式執行時由這些**完成載入和引數設定。

控制項的布局:

常見的有以下幾種位置可供選擇,適用於不同情況。

excel worksheet上

操作窗格action pane(文件級自定義程式專用)

ribbon ui功能區(也就是excel2007上方的"開始"、"插入"選單的位置)

個人覺得操作窗格是很好用的乙個布局區域,它通常位於office介面的側面,類似windows資料夾介面左側的導航欄,優勢是區域夠大且不影響 excel工作表介面。很多文章提到自定義任務窗格custom task pane的用法,我迷糊了好久才明白這東西是給外接程式add-ins用的,對應文件級程式中的操作窗格action pane,顯示效果差不多。

1、工作表worksheet

最簡單粗暴而有效的布局方式,將工作表作為放置控制項的容器,直接從控制項工具欄中拖動想要的控制項到指定的位置,然後雙擊控制項就可切換到**檢視,在想要的事件中新增功能**即可。而且因為控制項的事件**是和工作表**一起的,訪問工作表的內容特別方便,很貼心。

比如下面的**響應某個按鈕的點選,直接給按鈕所在工作表的第二行第一列的單元格賦值,內容是當前工作表的名稱。

private

sub button1_click(sender as system.object, e as system.eventargs) handles button1.click

cells(2, 1).value = name

msgbox(name)

end sub

這種控制項布局方式的缺點主要是干擾了工作表介面的正常操作,與工作表隨心所欲的多變特性不般配,而且顯示效果比較醜陋。適合快速開發的小工具,簡單有效地解決業務問題即可。我最早也是將按控制項放置在工作表上,後來都移走了。

2、操作窗格action pane操作窗格沒法在設計介面編輯,無法向其中拖動控制項,只能寫**來完成控制項的載入和設定。但我們可以在工程中新增乙個使用者控制項(user control)或者操作窗格控制項(action pane control),這2個control控制項的作用就是作為其他控制項的容器,分別位於工程右鍵選單的add-->new item-->windows forms和new item-->office下面。可以向他們上面拖動你想要的其他控制項,根據喜好設定好介面後,只需要用**把control控制項載入到操作窗格即 可,所有的內容都會自動顯示出來。

載入控制項到操作窗格的**如下(以工作薄workbook中載入為例):

public

class thisworkbook

'在過程外部宣告新增到工程的control控制項,作為類變數

public actioncontrol as

new actionspanecontrol1

private

sub thisworkbook_startup() handles

me.startup

'載入control控制項到操作窗格,actionspane要通過工作簿workbook來引用

actionspane.controls.add(actioncontrol)

'設定操作窗格的顯示位置為左側,注意獲取操作窗格與新增control控制項的差別

task pane

").position = microsoft.office.core.msobarposition.msobarleft

end sub

end class

如果在worksheet**中新增控制項到操作窗格,需要通過globals.thisworkbook.actionspane來引用。

效果圖:

3、ribbon ui功能區

office2007 自帶的功能入口所在的區域,幾經調整我最終把功能按鈕放在了ribbon功能區。可以通過工程右鍵選單-->add-->new item-->office-->ribbon新增自定義ribbon功能區(我選擇了visual designer模版)。然後就可以在設計器介面往新增的自定義功能區上新增控制項了。

修改控制項的大小:

屬性視窗-->controlsize,預設小號

修改控制項的圖示:

修改功能區的位置:

這個幫助文件的內容實在太多,可以通過control type列篩選「tab」關鍵字,可以發現這些ribbon功能區的命名規則很簡單,tab+功能區英文名,明白這個規則後可以省去查詢的工作,比如「開 始」和「插入」功能區在excel英文版中顯示為「home」和「insert」,那麼我們只需要在officeid欄中輸入tabhome和 tabinsert即可。如果想把自定義功能區顯示在最前面,只需要選擇beforeofficeid,然後輸入tabhome即可。

另外,vs2010的ribbon設計器有bug,照上面的方法在介面設定beforeofficeid和tabhome屬性之後,執行會報錯「the type 'microsoft.visualstudio.tools.office.ribbon.view.genericribbonview' has no property named 'factory'.」。還好msdn社群有帖子說這個事,鏈結在此點選開啟鏈結。好像是說由於vs2010在後台自動生成的ribbon介面**不正確,報錯位於ribbon1.designer.vb中的initializecomponent函式內(ribbon1為新增ribbon功能區時的**名稱),將錯誤的語句剪下到initializecomponent 函式的呼叫之後即可,比如把「me.tab1.position = me.factory.ribbonposition.beforeofficeid("tabhome")」剪下到下圖位置。在我的工程中,這個位置就在錯誤語句的上方不遠。

_public

subnew()

mybase.new(globals.factory.getribbonfactory())

'this call is required by the component designer.

initializecomponent()

'移到這裡

me.tab1.position = me.factory.ribbonposition.beforeofficeid("

tabhome

")end sub

效果圖:

介面互動 觸控反饋

通常頁面會擺放一些button按鈕或者view區域,使用者觸控按鈕之後會觸發下一步的操作。這種情況下,我們要對觸控這個行為給予使用者一些響應。如圖4 17所示,當我們手指觸控了button文字所在的cell區域時,對應的區域底色變成淺灰色,這樣使用者就可以知道小程式是有及時響應他的這次觸控操作,使用...

android多執行緒介面互動

首先runonuithread是activity內部的方法,在運用的時候最好指明當前環境變 context new thread new runnable start new thread new runnable start 上面兩個其實原理一樣,runonuithread這個會呼叫父類中的 pu...

PHP學習筆記 PHP與Web頁面互動

一 表單 表單標記屬性如下表所示 二 在web頁面嵌入php指令碼 1 在html標記中嵌入php指令碼 通過在html標記中新增php指令碼標記 來嵌入php指令碼,兩個標記之間的所有文字都會被解釋為php語言,而標記之外的任何文字都會被認為是普通的html。2 對表單元素的value屬性進行賦值...