2017-06-06 83 views

回答

0

沒有直接的方法將DataTable綁定到Excel電子表格。

您必須枚舉DataTable中的行和列並將數據插入到工作表中。

然後,您必須決定何時更新回來(即在保存工作簿期間 - 然後爲BeforeSave事件創建事件處理程序)並枚舉Worksheet中的行和列,將值移回DataTable並更新數據庫。

+0

,謝謝你的迴應。 我有超過10,000行,我通過API從數據庫中檢索並綁定到excel枚舉DataTable中的行/列。其中,用戶只能更新500行併發布,在這種情況下,我需要通過跟蹤原始值和修改值來查找修改/髒行。 有沒有一種有效的方式來處理這個使用C#Excel VSTO。 – user7386331

+0

3個想法 - a)存儲原始DataTable,然後將您寫入Excel的內容與Excel中的內容與DataTable中的值進行比較 - 然後可以更新真正修改的行。b)如果無法將DataTable存儲在內存中(程序關閉並打開)您還可以將DataSet序列化到Excel文件旁邊的二進制文件中c)您可以將數據寫入Worksheet,然後將其複製並保護您的原始值爲第二張 - 然後通過比較它們可以找到更改的行 – smartobelix

+0

這些是有趣的想法,謝謝共享的。 – user7386331

1

你可能想看看使用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的任何改變。