Office客製化開發!VSTO開發 ( 1 )- Excel 的 DataBinding 和 取出
一般的使用者可能對於 Office 2007 / 2010 的介面改變有某些抗拒
但,它不單單只是為了改介面已推出新的版本
更是讓企業用戶來說,可以更方便地直接用 物件的方式整合流程、資料
之前跟一些朋友討論後,發現對於 Excel 的資料寫入都以為就只能 一格一格地更新
這樣子顯示資料就會非常的麻煩,而且程式碼爆多的!
就跟 ASP 中用跑迴圈的方式更新 Table / TR / TD 那樣子的鎖碎
不只程式碼多!
連效能都不太好! 可以看到 資料是一格一格地更新
資料越多筆!就會越慘
這種舊的方式在開發上是一種非常重的負擔!而且要套公式、下拉選單也不方便
即然我們都用 .NET 來開發了!
是不是有方法可以像 ASP.NET 的 GridView 那樣子直接做 Data Binding ?
其實是可以的,方法也很簡單
固定的方式最簡單!只要在 VS 2010 開啟 Excel 工作表1
選擇指定的範圍後,再選擇「格式化為表格」( 選一個自已喜歡的風格 ) 就可以了!
這個動作其實就跟在網頁上拉一個 GridView 是一樣的意思
當然最後要將取得來的 資料直接做 Data Binding
可以看到 Sheet1 的 EmployeeList 是一開始指定的名稱,這裡用的物件型別是 ListObject
將 GetEmployeeListObjectSheet1 的 ListObject 傳入後就可以做 DataBinding !
oService 是從遠端抓資料下來的,取得 DataTable 的程式碼可以換成自已的程式
其實,這裡的重點是最後的 SetDataBinding Method !
和以往 直接指定 DataSource 不同!載入時是要用 SetDataBinding
若是設定 AutoSetDataBoundColumnHeaders = True 的話!
ListObject 的抬頭會自已依 DataTable 裡的欄位名稱為主 ( 若有特別命名的方式就不要用自動產生 )
可以看到!只要一行就可以把資料 Binding 到 Excel 的 清單中!
當然,使用者修改完資料後就會想要再把資料更新回資料庫中
這時就要再把 ListObject 的資料取出即可
很簡單!使用 DataSource 並轉型成 DataTable 就可以了!
但這裡要特別說明 Excel 上的 介面顯示 和 背後的資料 是分開來的
也就是說,介面清單中修改的資料 , 可以跟 Datasource 不一樣
只是若用 DataTable 的話!就不需要特別處理同步問題
用 List<> 物件 則是新增、修改的資料不會同步到 DataSource
用 Array<> 物件 則是無法在清單中新增,但修改的資料會同步到 DataSource
所以,若只是要把資料顯示至 Excel 的話!則以上三種都沒有問題
但要把資料更新,資料同步的問題就要特別處理,或是 轉成 DataTable
當然用 現成的 DataTable 最大的好處就是,可以直接判斷 DataRowState 是否為新增、修改
這裡是用 Linq 的語法後再用 CopyToDataTable 就可以只取得有異動的資料清單
就可以有效地縮小上傳的資料量了! ( 只傳有異動過的 !尤其是透過 HTTP 更有差異 )
若要用 List<> 或是 Array<> 就要自已特別再實作這個參數或另外的判斷方式了
可以看到,把 Excel 物件了解清楚後,程式碼只要兩行就可以搞定以前在 VBA 一堆的迴圈
PS:ListObject 在 Office 2003 之後才有的
ps2:Linq 的 CopyToDataTable 必須要用 .NET Framework 3.5 / 4 才有 ( 這裡用的是 4 )