【问题标题】:Bind DataTable to Excel spreadsheet directly in C#在 C# 中直接将 DataTable 绑定到 Excel 电子表格
【发布时间】:2017-06-06 00:13:46
【问题描述】:

我正在构建一个 C# VSTO 插件,并寻找将 System.Data.DataTable 直接绑定到 Excel 电子表格(如绑定数据源)并跟踪电子表格中用户修改的单元格并在 C# 中读回更改的方法。

感谢您的帮助。

【问题讨论】:

    标签: c# excel data-binding datatable


    【解决方案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 发生任何更改时触发的事件。

    【讨论】:

      【解决方案2】:

      没有将DataTable 绑定到Excel 电子表格的直接方法。

      您必须枚举DataTable 中的行和列,并将数据插入到工作表中。

      然后您必须决定何时更新回来(即在保存 Workbook 期间 - 然后为 BeforeSave 事件创建事件处理程序)并枚举 Worksheet 中的行和列,将值移回 DataTable 并更新数据库。

      【讨论】:

      • ,感谢您的回复。我有超过 10,000 行,我通过 API 从数据库中检索并绑定到 excel 枚举 DataTable 中的行/列。其中,用户只能更新 500 行并发布,在这种情况下,我需要找到通过跟踪原始值和修改值来确定的修改/脏行。是否有使用 C# Excel VSTO 处理此问题的有效方法。
      • 3 个想法 - a) 存储原始 DataTable,然后将您写入 Excel 的内容与 Excel 中的内容与 DataTable 中的值进行比较 - 然后您可以更新真正修改过的行 b) 如果您无法将 DataTable 存储在内存中(程序已关闭并打开)您还可以将 DataSet 序列化为 Excel 文件旁边的二进制文件 c)您可以将数据写入工作表,然后将其复制并保护您在第二张表中具有原始值 - 然后通过比较它们,您可以找到更改的行
      • 这些想法很有趣,谢谢分享。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 2014-04-19
      • 1970-01-01
      相关资源
      最近更新 更多