【发布时间】:2017-06-06 00:13:46
【问题描述】:
我正在构建一个 C# VSTO 插件,并寻找将 System.Data.DataTable 直接绑定到 Excel 电子表格(如绑定数据源)并跟踪电子表格中用户修改的单元格并在 C# 中读回更改的方法。
感谢您的帮助。
【问题讨论】:
标签: c# excel data-binding datatable
我正在构建一个 C# VSTO 插件,并寻找将 System.Data.DataTable 直接绑定到 Excel 电子表格(如绑定数据源)并跟踪电子表格中用户修改的单元格并在 C# 中读回更改的方法。
感谢您的帮助。
【问题讨论】:
标签: c# excel data-binding 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 发生任何更改时触发的事件。
【讨论】:
没有将DataTable 绑定到Excel 电子表格的直接方法。
您必须枚举DataTable 中的行和列,并将数据插入到工作表中。
然后您必须决定何时更新回来(即在保存 Workbook 期间 - 然后为 BeforeSave 事件创建事件处理程序)并枚举 Worksheet 中的行和列,将值移回 DataTable 并更新数据库。
【讨论】: