我正在構建C#VSTO加載項,並尋找將System.Data.DataTable直接綁定到Excel電子表格(如綁定數據源)並跟蹤用戶修改過的單元格的方法並在C#中讀取更改。將DataTable直接綁定到Excel電子表格中#
感謝您的幫助。
我正在構建C#VSTO加載項,並尋找將System.Data.DataTable直接綁定到Excel電子表格(如綁定數據源)並跟蹤用戶修改過的單元格的方法並在C#中讀取更改。將DataTable直接綁定到Excel電子表格中#
感謝您的幫助。
沒有直接的方法將DataTable
綁定到Excel電子表格。
您必須枚舉DataTable
中的行和列並將數據插入到工作表中。
然後,您必須決定何時更新回來(即在保存工作簿期間 - 然後爲BeforeSave
事件創建事件處理程序)並枚舉Worksheet中的行和列,將值移回DataTable
並更新數據庫。
你可能想看看使用ListObjects。您可以直接將內存中的數據表綁定到ListObject。將此列表對象(表)添加到工作表時,不必顯示所有字段。
例如:
Public WithEvents decideList As Microsoft.Office.Tools.Excel.ListObject
Public dt As System.Data.DataTable = New System.Data.DataTable("MasterData")
' Load data into the datatable dt
Dim worksheet As Microsoft.Office.Tools.Excel.Worksheet = Globals.Factory.GetVstoObject(sheet) 'where sheet is the native worksheet where you are locating the ListObject
Dim cell As Excel.Range = worksheet.Range("$A$1:$D$4")
decideList = worksheet.Controls.AddListObject(cell, "decideList")
decideList.AutoSetDataBoundColumnHeaders = True
decideList.SetDataBinding(dt, Nothing, { "FirstName", "LastName", "Company" })
唯一的問題是持久性。在關閉電子表格之前,您需要儲存完整的數據表格(除非在ListObject中顯示整個數據表格)。
當您重新打開工作表時,您需要一種方法將表加載到內存數據表中,然後重新綁定它。
我希望有幫助!
在線有幾個鏈接。 https://msdn.microsoft.com/en-us/library/cc668212.aspx
我遇到的唯一問題是有時更新底層數據表,而不是使用Excel工作表。要做到這一點,你可以設置事件來觸發對ListObject的任何改變。
,謝謝你的迴應。 我有超過10,000行,我通過API從數據庫中檢索並綁定到excel枚舉DataTable中的行/列。其中,用戶只能更新500行併發布,在這種情況下,我需要通過跟蹤原始值和修改值來查找修改/髒行。 有沒有一種有效的方式來處理這個使用C#Excel VSTO。 – user7386331
3個想法 - a)存儲原始DataTable,然後將您寫入Excel的內容與Excel中的內容與DataTable中的值進行比較 - 然後可以更新真正修改的行。b)如果無法將DataTable存儲在內存中(程序關閉並打開)您還可以將DataSet序列化到Excel文件旁邊的二進制文件中c)您可以將數據寫入Worksheet,然後將其複製並保護您的原始值爲第二張 - 然後通過比較它們可以找到更改的行 – smartobelix
這些是有趣的想法,謝謝共享的。 – user7386331