2017-06-06 4 views
0

Ich bin ein C# VSTO-Add-in erstellen, und auf der Suche nach Möglichkeiten, System.Data.DataTable direkt an Excel-Arbeitsblatt (wie eine Datenquelle binden) und verfolgen Sie benutzerdefinierte Zellen in der Kalkulationstabelle verfolgen und lies die Änderungen in C# nach.DataTable an Excel-Tabelle direkt in C# binden

Danke für Hilfe.

Antwort

0

Es gibt keine direkte Methode zum Binden von DataTable an Excel-Tabelle.

Sie müssen Zeilen und Spalten in Ihrem DataTable auflisten und Daten in Worksheet einfügen.

Dann müssen Sie entscheiden, wann zurück zu aktualisieren (d. H. Während Arbeitsmappe speichern - dann Ereignishandler für BeforeSave Ereignis erstellen) und Zeilen und Spalten in Worksheet verschieben Werte zurück in DataTable und Datenbank aktualisieren.

+0

, Danke für die Antwort. Ich habe mehr als 10.000 Zeilen, die ich aus der Datenbank über API abrufen und an excel binden, die die Zeilen/Spalten in DataTable aufzählt. Von denen der Benutzer nur 500 Zeilen aktualisieren und veröffentlichen konnte, in diesem Fall muss ich die modifizierten/schmutzigen Zeilen finden, die durch die Verfolgung der ursprünglichen und modifizierten Werte ermittelt wurden. Gibt es eine effiziente Möglichkeit, dies mit C# Excel VSTO zu behandeln. – user7386331

+0

3 Ideen - a) Original DataTable speichern und dann vergleichen, was Sie in Excel geschrieben haben, was in Excel ist mit Werten in DataTable - dann können Sie wirklich geänderte Zeilen aktualisieren b) Wenn Sie DataTable nicht im Speicher speichern können (Programm ist geschlossen und geöffnet) Sie können DataSet auch in Binärdatei neben Excel-Datei serialisieren c) Sie können Daten in Worksheet schreiben und dann kopieren und schützen, dass Sie Originalwerte ein 2. Blatt haben - dann können Sie durch das Vergleichen sie geänderte Zeilen finden – smartobelix

+0

Das sind interessante Ideen, Danke zum Teilen. – user7386331

1

Sie möchten vielleicht mit ListObjects aussehen. Sie können eine Datentabelle im Arbeitsspeicher direkt an ein ListObject binden. Sie müssen nicht alle Felder anzeigen, wenn Sie dieses Listenobjekt (Tabelle) einem Arbeitsblatt hinzufügen.

Zum Beispiel:

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" }) 

Das einzige Problem ist Beharrlichkeit. Sie müssen die vollständige Datentabelle vor dem Schließen der Tabelle speichern (es sei denn, Sie zeigen die gesamte Datentabelle im ListObject an).

Wenn Sie das Arbeitsblatt erneut öffnen, benötigen Sie eine Methode, um die Tabelle in eine speicherinterne Datentabelle zu laden und sie erneut zu binden.

Ich hoffe, dass hilft!

Es gibt ein paar Links online. https://msdn.microsoft.com/en-us/library/cc668212.aspx

Die einzigen Probleme, die ich hatte, ist manchmal, es ist besser, die zugrunde liegende Datentabelle zu aktualisieren, anstatt das Excel-Arbeitsblatt zu verwenden. Zu diesem Zweck können Sie Ereignisse einrichten, die bei Änderungen am ListObject ausgelöst werden.

Verwandte Themen