遇到乙個資料處理自動化的問題,於是打算開發乙個基於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屬性進行賦值...