Office客製化開發!VSTO開發 (1)- Excel 的 DataBinding 和 取出

Office客製化開發!VSTO開發 ( 1 )- Excel 的 DataBinding 和 取出

一般的使用者可能對於 Office 2007 / 2010 的介面改變有某些抗拒

但,它不單單只是為了改介面已推出新的版本

更是讓企業用戶來說,可以更方便地直接用 物件的方式整合流程、資料

 

之前跟一些朋友討論後,發現對於 Excel 的資料寫入都以為就只能 一格一格地更新

這樣子顯示資料就會非常的麻煩,而且程式碼爆多的! 

就跟 ASP 中用跑迴圈的方式更新 Table / TR / TD 那樣子的鎖碎

不只程式碼多!

連效能都不太好! 可以看到 資料是一格一格地更新

資料越多筆!就會越慘

image 
這種舊的方式在開發上是一種非常重的負擔!而且要套公式、下拉選單也不方便

 

即然我們都用 .NET 來開發了!

是不是有方法可以像 ASP.NET 的 GridView 那樣子直接做 Data Binding ?

其實是可以的,方法也很簡單

 

固定的方式最簡單!只要在 VS 2010 開啟 Excel 工作表1

選擇指定的範圍後,再選擇「格式化為表格」( 選一個自已喜歡的風格 ) 就可以了!

image

image 
確認範圍,確定後就會長得下

image 
最後只要指定 物件名稱就可以了!

這個動作其實就跟在網頁上拉一個 GridView 是一樣的意思

 

當然最後要將取得來的 資料直接做 Data Binding

image 
可以看到 Sheet1 的 EmployeeList 是一開始指定的名稱,這裡用的物件型別是 ListObject

 

 image
將 GetEmployeeListObjectSheet1 的 ListObject 傳入後就可以做 DataBinding !

oService 是從遠端抓資料下來的,取得 DataTable 的程式碼可以換成自已的程式

其實,這裡的重點是最後的 SetDataBinding Method !

和以往 直接指定 DataSource 不同!載入時是要用 SetDataBinding

若是設定 AutoSetDataBoundColumnHeaders = True 的話!

ListObject 的抬頭會自已依 DataTable 裡的欄位名稱為主 ( 若有特別命名的方式就不要用自動產生 )

 

image
可以看到!只要一行就可以把資料 Binding 到 Excel 的 清單中!

 

 

當然,使用者修改完資料後就會想要再把資料更新回資料庫中

這時就要再把 ListObject 的資料取出即可

 

image

很簡單!使用 DataSource 並轉型成 DataTable 就可以了!

 

但這裡要特別說明 Excel 上的 介面顯示 和 背後的資料 是分開來的

也就是說,介面清單中修改的資料 , 可以跟 Datasource 不一樣

 

只是若用 DataTable 的話!就不需要特別處理同步問題

用 List<> 物件 則是新增、修改的資料不會同步到 DataSource

用 Array<> 物件 則是無法在清單中新增,但修改的資料會同步到 DataSource

 

所以,若只是要把資料顯示至 Excel 的話!則以上三種都沒有問題

但要把資料更新,資料同步的問題就要特別處理,或是 轉成 DataTable

 

image

當然用 現成的 DataTable 最大的好處就是,可以直接判斷 DataRowState 是否為新增、修改

這裡是用 Linq 的語法後再用 CopyToDataTable 就可以只取得有異動的資料清單

就可以有效地縮小上傳的資料量了! ( 只傳有異動過的 !尤其是透過 HTTP 更有差異 )

 

若要用 List<> 或是 Array<>  就要自已特別再實作這個參數或另外的判斷方式了 

 

可以看到,把 Excel 物件了解清楚後,程式碼只要兩行就可以搞定以前在 VBA 一堆的迴圈 

 

PS:ListObject 在 Office 2003 之後才有的

ps2:Linq 的 CopyToDataTable 必須要用 .NET Framework 3.5 / 4 才有  ( 這裡用的是 4 )