2009年9月27日 星期日

VSTO -Excel+ActionsPane+WebService

這一個主題我實在想不到該如何做成一個PPT檔。

所以直接做一個Sample比較快。

為了簡化範例,所以我都Default的命名。

以下的範例是用VS2008+Excel2007

這個Sample Sheet1的功能:

1.輸入一SQL string。

2.透過Web Service去執行這段sql

3.把回傳的結果show在excel中

Step1:新增一個VSTO的Excel 2007 Workbook專案

createproject

專案成功建立後畫面會長的像這樣

VS2008裡面為什麼辦法把Excel檔開起來呢?當然是開發的機器也要安裝Excel

你會發現到在這個Project中有一個Excel檔。也就是說我們開發的程式是跟著這個Excel走的。

如果你希望你開發的是Excel外掛,請用Excel 2007 Add-in。

不過它沒有支持像下圖一樣的圖形化開發介面。所以我們先用Excel 2007 Workbook專案來當sample。

aftercreate

Step2:新增一個Actions Pane Control

add Actions Pane

你可以發現其實Actions Pane他是繼承Windows Form的UserControl而已。沒有很複雜

Actions Panecode 

加入一個TextBox1和一個Button。(允許TextBox輸入多行,不做也沒關系)

AddControlOnActionsPane

Step3. coding

到ActionsPaneControl1.cs的程式碼裡面去吧

加入2個using

using Excel = Microsoft.Office.Tools.Excel; 
using System.Data;


為button1 click的事件 加入code



        private void button1_Click(object sender, EventArgs e)
{
//停止Excel畫面上 即時的變化。
Globals.Sheet1.Application.ScreenUpdating = false;
Microsoft.Office.Tools.Excel.ListObject list1;
Microsoft.Office.Interop.Excel.Range cell = Globals.Sheet1.Range["$A$1", System.Reflection.Missing.Value];
if (Globals.Sheet1.Controls.Contains("list1"))
{
list1 = Globals.Sheet1.Controls["list1"] as Excel.ListObject;
}
else
{
list1 = Globals.Sheet1.Controls.AddListObject(cell, "list1");
}

//事先準備好的Web Service。用Add Web Reference加入
ServiceReference1.Service1SoapClient client = new ServiceReference1.Service1SoapClient();
//呼叫Web Service回傳結果dt
DataTable dt = client.ExecuteSql(textBox1.Text);

list1.AutoSetDataBoundColumnHeaders = true;
list1.SetDataBinding(dt, null);
Globals.Sheet1.Application.ScreenUpdating = true;
}


最後到sheet1.cs找到Sheet1_Startup方法加入以下的code



     private void Sheet1_Startup(object sender, System.EventArgs e)
{
Globals.ThisWorkbook.ActionsPane.Controls.Add(new ActionsPaneControl1());
}


Step4:Config



maxReceivedMessageSize="6553600"



maxBufferSize="6553600"



這是Web Service的config



預設的size有點小



所以我把他加大了



這2個config的用一樣大 。



不然會error。



想知道為什麼,可以自己試試看。



在這裡先不討論這個問題



Step5:Testing



可以看到右邊長出一個Actions Pane



test



我在TextBox輸入Select * From Orders。我的Service撈的資料是NorthWind的範例資料



test2

沒有留言: