2017-06-06 21 views
0

私はC#VSTOアドインを構築していて、System.Data.DataTableをExcelスプレッドシート(​​データソースのバインディングなど)に直接バインドし、スプレッドシート内のユーザー変更セルを追跡する方法を探していますC#で変更を読み戻してください。C#で直接Excelスプレッドシートにバインドする

ありがとうございました。

答えて

0

DataTableをExcelスプレッドシートに直接バインドする方法はありません。

DataTableの行と列を列挙し、ワークシートにデータを挿入する必要があります。

次に、ワークブックを保存しているときに、ワークブックを保存してから、イベントハンドラを作成してBeforeSaveイベントのイベントハンドラを作成するタイミングを決定し、ワークシートの値をDataTableに戻してデータベースを更新する必要があります。

+0

、ありがとうございます。 私はデータベースからAPIとバインドを使用して取得した1万以上の行をDataTableの行/列を列挙することに優れています。このうち、ユーザーは500行しか更新せずに公開することができます。この場合、元の値と変更された値を追跡して変更/汚れた行を見つける必要があります。 C#Excel VSTOを使用してこれを処理する効率的な方法はありますか? – user7386331

+0

3つのアイデア - a)オリジナルのDataTableを保存し、Excelに書き込んだものとExcelの値をDataTable内の値と比較する - 本当に変更された行を更新することができますb)メモリにDataTableを保存できないDataSetをExcelファイルの隣のバイナリファイルにシリアル化することもできます。c)Worksheetにデータを書き込んでコピーし、元の値を保持するようにします。2番目のシート - 次に比較して、変更した行を見つけることができます。 – smartobelix

+0

共有するため。 – user7386331

1

ListObjectを使用してみるとよいでしょう。メモリ内のデータテーブルを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の変更に応じて発生するイベントを設定します。

関連する問題