上次學習到創建一個EXCEL活頁簿專案,並且開始增加按鈕,這次要對EXCEL的函數來做介紹
還需要using以下兩個模組才能調用函數
using Excel = Microsoft.Office.Interop.Excel;
using Microsoft.Office.Tools.Ribbon;
從上一篇開啟最後可以看到我們新建立的專案有兩個方法已經幫我們建立好了,一個是Ribbon(就是前一篇提到的空白區域),另一個是button(就是我們建立的按鈕),此時我們就可從這兩個區塊去寫入我們要的方法
RIBBON
先來介紹RIBBON
RIBBON這個方法寫入方法後會在後續打開EXCEL時就先默認載入運行,所以有甚麼操作需要在打開時就要先載入就必須寫在這裡面
寫入
舉個例子,實務上在使用VSTO會搭配SQL,所以有些資料在打開時就會去和SQL連接接資料,這樣就可以要把要給USER選擇的條件在EXCEL載入時也就一併一起載入
載入方法以DROP DOWN來當作範例,要怎麼載入呢?
public void Ribbon1_Load(object sender, RibbonUIEventArgs e)
{
//先使用SQL載入資料,以下省略SQL函數,只留下QUERY字串
string sql_period = @"SELECT A.* FROM (SELECT DISTINCT DATA_VERSION FROM DATA_SQL
ORDER BY DATA_VERSION DESC
)A WHERE ROWNUM <= 9";
//Period_list是一個裝載20240101、20240201、20240301這樣的日期格式,使用foreach 方法來寫入DROP DOWN裡面
foreach (string s in Period_list)
{
//常常要控制RIBBON都會使用到 this.Factory這個函數,第一個RibbonDropDownItem
RibbonDropDownItem item = this.Factory.CreateRibbonDropDownItem();
//把每個日期賦予到上面的DropDownItem item中
item.Label = s;
//dropDown_Period_start是dropDown下拉選單這個物件的Name
dropDown_Period_start.Items.Add(item);
}
//第二個RibbonDropDownItem
RibbonDropDownItem item2 = this.Factory.CreateRibbonDropDownItem();
item2.Label = Period_list[0];
dropDown_Period_end.Items.Add(item2);
//這是自行定義的函數,放在RIBBON中只要dropDown_Period_start這個物件有數值上的變動就會觸發函數,也就是dropDown日期我們在選擇時只要變換就會觸發,算是一種監控機制,放在下面
dropDown_Period_start.SelectionChanged += dropDown1_SelectionChanged;
}
監控函數,在選擇日期區間時兩個RibbonDropDownItem會因為選擇DropDown而去限制另一個DropDown可選擇的日期
//LOAD日期到Dropdown
private void dropDown1_SelectionChanged(object sender, RibbonControlEventArgs e)
{
// 選擇日期
string selectedDate = dropDown_Period_start.SelectedItem.Label;
// 選擇INDEX
int selectedIndex = Period_list.IndexOf(selectedDate);
dropDown_Period_end.Items.Clear();
for (int i = 0; i <= selectedIndex; i++)
{
RibbonDropDownItem item = this.Factory.CreateRibbonDropDownItem();
item.Label = Period_list[i];
dropDown_Period_end.Items.Add(item);
}
}
讀取
當然單單只是選擇但是如果不能讀取出來做使用那就沒意義了,讀取方法很簡單,僅僅一行代碼
var date = dropDown_Period_start.SelectedItem.ToString();
RIBBON對應的sheet切換
有時我們EXCEL會有好幾個sheet每一個對應的功能都會不一樣,但是上方RIBBON的按鈕又想只單獨給那個sheet使用而已,這邊就是介紹sheet在切換時可將上面RIBBON部分區域隱藏的方法
首先要先自定義函數這邊取名為UpdateButton3Visibility,假設有3個EXCEL分頁分別是ALL、GAP、Developing,三個分頁分別能看到的BUTTON都是不一樣的,設置可以定義GROUP是否可被看見
按鈕有4個分別是 : btn_Query、button1、alarm、group1(這是一個群組),先寫好函數,看哪個頁面應該能看到哪些按鈕
private void UpdateButton3Visibility()
{
// 取得當前sheet名稱,代表當前正在被使用的工作表
Worksheet activeWorksheet = (Worksheet)Globals.ThisWorkbook.ActiveSheet;
// 根據sheet決定可視化,如果切換到ALL頁面
if (activeWorksheet.Name == "ALL")
{
//Visible代表能不能看見,
btn_Query.Visible = true;
button1.Visible = false;
alarm.Visible = false;
//這邊甚至可以是一個GROUP能不能看見,而非單一按鈕而已
group1.Visible = false;
}
//如果切換到GAP頁面
else if (activeWorksheet.Name == "GAP")
{
btn_Query.Visible = false;
button1.Visible = true;
alarm.Visible = false;
group1.Visible = false;
}
//如果切換到Developing頁面
else if (activeWorksheet.Name == "Developing")
{
btn_Query.Visible = false;
button1.Visible = false;
alarm.Visible = false;
group1.Visible = true;
}
else
{
btn_Query.Visible = false;
button1.Visible = false;
alarm.Visible = true;
group1.Visible = false;
}
}
private void ThisWorkbook_SheetActivate(object Sh)
{
// 可視化
UpdateButton3Visibility();
}
寫好後在RIBBON裡面調用,一開始執行時先運行一次UpdateButton3Visibility
後面切換sheet時使用監控的方法
Globals.ThisWorkbook.SheetActivate += ThisWorkbook_SheetActivate;
private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
{
UpdateButton3Visibility();
Globals.ThisWorkbook.SheetActivate += ThisWorkbook_SheetActivate;
}
Day2目前就先介紹到這邊,既然讀取出來那就要寫入到EXCEL中了
後續在來紀錄怎麼寫入EXCEL中~