vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Brandneu! sevEingabe v3.0 - Das Eingabecontrol der Superlative!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
datagridview in XLS speichern 
Autor: Ortech
Datum: 30.10.18 10:45

Hallo!

ich habe ein Performance-Problem mit dem SPeichern eines Datagridview in eine XLS Datei.
Das datagridview hat 22 Spalten und knapp 3000 Zeilen.
Ich lade die Daten aus einer XLS Datei in das datagridview, was schnell genug passiert.
Dann modifiziere ich die Daten in der letzten Spalte.
Jedesmal, wenn ich eine Zelle in der letzten (also 22.) Spalte modifiere, möchte ich automatisch speichern.
Da es aber so viele Daten sind, dauert das viele Minuten.

Private Sub saveInventurliste()
 
        Dim xlsApp2 As Excel.Application = New Excel.Application
        Dim xlsWorkBook2 As Excel.Workbook
        Dim xlsWorkSheet2 As Excel.Worksheet
 
        xlsWorkBook2 = xlsApp2.Workbooks.Add()
        xlsWorkSheet2 = xlsWorkBook2.ActiveSheet 'Sheets("sheet1")
 
 
        For Zeile = 0 To DataGridView1.RowCount - 1
            For Spalte = 0 To DataGridView1.ColumnCount - 1
                xlsWorkSheet2.Cells(Zeile + 2, Spalte + 1).Value() = _
                  DataGridView1.Rows(Zeile).Cells(Spalte).Value.ToString
            Next
        Next
 
        xlsWorkSheet2.SaveAs("D:\vbexcel.xlsx")
        xlsWorkBook2.Close()
        xlsApp2.Quit()
 
    End Sub
Gibt es denn nicht eine schnellere Möglichkeit? Muss ich immer alle Zellen speichern oder kann ich ev. auch nur die geänderte Zelle speichern?

Zur Info: Ich habe die Sourcedaten in einem 2-dim Array as Object gespeichert. Soll ich besser dieses ändern und dann in ein XLS speichern?




Ein Dankeschön vorab für eure Inputs.
Alois
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: datagridview in XLS speichern 
Autor: effeff
Datum: 30.10.18 11:14

Wenn Du nur den Inhalt einer einzigen Zelle des DataGridViews veränderst, brauchst Du doch auch nur deren Inhalt in das Pendant der Excel-Tabelle übertragen und diese dann speichern...

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: datagridview in XLS speichern 
Autor: Ortech
Datum: 30.10.18 11:31

schön gesagt, aber ich habe keine Ahnung wie. MAche das erste Mal was mit XLS Dateien...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: datagridview in XLS speichern 
Autor: effeff
Datum: 30.10.18 13:13

Okay...

Du hast mehrere Möglichkeiten; Momentan schreibst Du die Daten direkt in das DataGridView und schreibst sie auch komplett wieder zurück nach jeder Aktion. Wenn Du weiterhin damit arbeiten möchtest, die Daten komplett in das DataGridView zu schreiben, wäre es sinnvoll, erst am Ende aller Aktionen zu speichern und nicht nach jeder Änderung.

Die zweite Möglichkeit ist, dass Du die Daten in eine DataTable schreibst, die an Dein DataGridView gebunden wird. Beim Speichern erstellst Du dann keine XLS-Datei, sondern eine XLM. Diese kannst Du bei Bedarf problemlos in Excel öffnen und konvertieren.

Die dritte Möglichkeit ist, mit einem Datenprovider auf die Excel-Datei zuzugreifen und dann die Excel-Datei wie eine Datenbank zu benutzen.

Die vierte Möglichkeit könnte sein, die Daten aus der Excel-Datei in das DataGridView zu schreiben; Sofern die Daten nicht umsortiert werden (das musst Du dann sperren), hast Du die Daten ja 1:1 übertragen. Wenn also die 22. Spalte in der 49. Zeile geändert wird, brauchst du den Inhalt nur in die 22. Spalte 48. Zeile (wenn Du eine Überschrift hast) zu kopieren und die Excel-Datei dann speichern.

Gemeinhin wird das DataGridView nicht zum direkten Anzeigen von Daten verwendet, sondern wird an eine Datenquelle gehängt.

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: datagridview in XLS speichern 
Autor: Ortech
Datum: 30.10.18 13:59

danke für deine Auflistung.

Prinzipiell stimmt es, dass es ev. Sinn macht, die XLS Datei erst dann zu speichern, wenn man damit auch fertig ist mit der Editierung. Aber es gibt auch ängstliche User, die lieber nach jeder einzelnen Modifikation speichern.

Aktuell lese ich die Daten der XLS Datei in eine datatable ein und binde sie an das datagridview.
Die Daten selber sind noch zusätzlich in einem 2-dimensionalen Object-Array gespeichert.

Nach einer Zellinhalt-Änderung wird auch die datatable angepasst, ich kann auch das Object-Array anpassen.
JE nachdem, was gescheiter ist, dann in eine "andere" Excel Datei wieder zu speichern.

Aber egal ob ich nur eine einzelne Zelle ändere und dann speichere oder alle notwenigen Zellen auf einmal ändere und dann speichere. Der Speichervorgang selber ist ja der gleiche (ich speichere ja imme alle Zellen), und dieser dauert einfach einige Sekunden bei 3000 Zeilen und 22 Spalten.

Prinzipiell funioniert das Speichern ja mittlerweile, aber es dauert rel. lange.




P.S: Die Daten werden nicht umsortiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: datagridview in XLS speichern 
Autor: effeff
Datum: 30.10.18 15:23

Schau Dir mal dieses Beispiel an: https://www.dreamincode.net/forums/topic/368618-using-microsoft-excel-as-a-data-store/

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: datagridview in XLS speichern 
Autor: Ortech
Datum: 31.10.18 11:35

danke für den Link.
Es arbeitet soweit.

Eine andere Frage habe ich:
Ich habe eine Textbox, in welche ich einen Text eingebe.
Nah dem ich einen "suche" Button gedrückt habe, wird der Text in der datatabel gesucht. Funktioniert soweit.

Wenn ich nun einen Barcode-Scanner über USB anschließe und damit einen BC einlese, wird der Code in der Textbox angezeigt und gesucht.
Allerdings nur, wenn die Textbox auch den Focus hat.

Was mache ich, wenn der Focus wo anders liegt?

Wie bekomme ich den Focus auf die Textbox, sobald ich die Barcodescanner-Taste gedrückt habe?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: datagridview in XLS speichern 
Autor: Ortech
Datum: 31.10.18 15:34

Ich habe letztes Problem lösen können, ev. etwas kompliziert, aber es läuft.

Bitte noch eine Frage zu Excel:

Ich lese ja eine XLS Datei ein, diese hat 22 Spalten.
Wie kann ich rausfinden (und abspeichern) die Spaltenbreiten?

 Dim Spaltenbreiten() As Double
 
 For i As Integer = 1 To Spaltenanzahl
   Spaltenbreiten(i) = xlsWorkSheet.Range(i).Columns.Width
 Next
...das funktioniert net...

Beitrag wurde zuletzt am 31.10.18 um 15:43:48 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: datagridview in XLS speichern 
Autor: Ortech
Datum: 31.10.18 16:57

noch eine Hürde: ich habe eine currentCell und möchte die dazugehörige ROW rausfinden...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: datagridview in XLS speichern 
Autor: effeff
Datum: 31.10.18 17:59

xlsWorksheet.Columns(i).Width

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: datagridview in XLS speichern 
Autor: effeff
Datum: 31.10.18 18:08

Wie wäre es, beim Einlesen der Excel-Daten für jede Zeile am Anfang des Einfügens der Daten in die DataTable eine Spalte zu haben, in der Du die Zeilennummer einträgst? Somit hast Du dann 23 Spalten und nicht mehr 22, hast aber einen eindeutigen Bezug zur Excel-Tabelle; Es ist also dann egal, wenn die Daten im DataGridView umsortiert werden oder in der DataTable nicht so in der Reihenfolge stehen, wie Du sie aus der Excel-Datei stammend erwartest...

Diese Index-Spalte brauchst Du ja nicht anzeigen zu lassen; Du setzt einfach die Spaltenbreite im DataGridView für die Index-Spalte auf "0", kannst dann aber schon über die CurrentRow auf die Spalte zugreifen.

Die Zeile der Excel-Datei ergibt sich dann z. B. aus

 Dim Suchwert As Integer = DataGridView1.Rows( _
   DataGridView1.CurrentRow.Index).Cells(0).Value

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: datagridview in XLS speichern 
Autor: Ortech
Datum: 05.11.18 09:02

Guten Morgen,


Ich frag mal anders, ich habe folg. Code:

 
 xlsApp = New Excel.Application 'original Inventurliste
            xlsWorkBook = xlsApp.Workbooks.Open(File_InventurListe)
            xlsWorkSheet = xlsWorkBook.Sheets(1) 'es gibt nur ein Sheet in der 
            ' Inventurliste XLS
 
            Dim r As Excel.Range = xlsWorkSheet.UsedRange
 
            ' lade alle Zellen ins 2d array.
            xlsDaten = r.Value(Excel.XlRangeValueDataType.xlRangeValueDefault) _
              '2d array vom Typ object
 
            xlsBreite = r.ColumnWidth '...xlsBreite ist 1d array vom Typ 
            ' double, aber diese Zeile liefert einen Fehler,
Hier lade ich die Zellinhalte eine XLS Liste inein 2 dim Object. Gleichzeitig möchte ich die SPaltenbreiten wegsichern. Letzteres gelingt mir einfach nicht...

Beitrag wurde zuletzt am 05.11.18 um 09:05:06 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: datagridview in XLS speichern 
Autor: effeff
Datum: 05.11.18 10:07

Die Variable "r" ist in Deinem Fall ja auch ein Range, welches über mehrere Columns geht. Du musst für jede Columns einzeln die Breite abfragen, so ala "For Each Column in Range".

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: datagridview in XLS speichern 
Autor: Ortech
Datum: 05.11.18 11:20

Ich verstehs net.

hab folg. versucht:

 For Each Spalte As Integer In r
                xlsBreite(i) = Spalte
                i += 1
            Next
Es kann hier net konvertiert werden. Welcher Datentyp muss denn für "Spalte" verwendet werden?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: datagridview in XLS speichern 
Autor: Ortech
Datum: 05.11.18 13:57

Vielleicht nochmal anders formuliert, was meine Absicht ist:

Ich öffne eine XLS Datei (abc.xls) in meinem VB-Programm.
Diese Datei ist formatiert (einiges fett geschrieben, u.s.w.)

Ich ändere ein paar Werte in einer (letzten) Spalte und speiche nun alles wieder ab unter einem andern NAmen (xxx.xls).
Die Formatierung ist nun nicht mehr vorhanden.
Wie kann ich erreichen, dass mein xxx.xls genau so aussieht wie das abc.xls?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: datagridview in XLS speichern 
Autor: Franki
Datum: 06.11.18 01:56

Hallo,
Zitat:

Vielleicht nochmal anders formuliert, was meine Absicht ist:


Das ist ein guter Vorschlag, erst ging es um Performance, dann um Ahnungslosigkeit in Sachen Excel, zwischendurch noch um Barcodescanner, Spaltenbreiten usw. Viele Baustellen...

Zitat:


Ich öffne eine XLS Datei (abc.xls) in meinem VB-Programm.
speicher nun alles wieder ab unter einem andern NAmen (xxx.xls).
Die Formatierung ist nun nicht mehr vorhanden.


Probiere doch mal genau das: Datei öffnen, KEINE Änderung und nur unter anderem Namen speichern. Funktioniert das? Bzw. sind die Formatiierungen beim erneuten öffnen noch vorhanden?

Ich vermute mal, dass es nicht so ist. Oder doch? Du wirst berichten hoffe ich.
Denn bei einem solchen Problem muss man Schritt für Schritt analytisch (am besten mit einem kleinen Testprojekt) vorgehen und den/die Fehler zu finden. Mehrere Fehler gleichzeitig suchen zu wollen bringt nichts.

Aber unabhängig davon:
Excel ist ja ein mächtiges Werkzeug, was macht deine Anwendung die mit Excel alleine nicht machbar ist? Excel beinhaltet ja auch VBA womit man sehr viel machen kann. Um ein paar Änderungen in einer Excel Tabelle zu machen braucht man eigentlich keine zusätzliche VB Anwendung wenn es nur um diese Änderungen geht. Alle Logik würde auch in VBA gehen.

Wenn es nur um die Daten der Exel Tabelle geht, dann spielt die Formatierung / Spaltenbreite / Optik sowieso keine Rolle innerhalb der eigenen Anwendung. Bzw. ist die Optik unabhängig von der in der Excel Tabelle.

Vielleicht beschreibst du mal etwas genauer warum das machen möchtest was du machst.

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: datagridview in XLS speichern 
Autor: effeff
Datum: 06.11.18 21:31

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles _
      Button1.Click
        Dim excel As Object = Nothing
        Dim workbook As Object = Nothing
        Dim sheet As Object = Nothing
 
        excel = CreateObject("Excel.Application")
        workbook = excel.workbooks.open("d:\spaltenbreite.xls")
        sheet = workbook.sheets("Tabelle1")
 
        Dim SpaltenbreiteSpalte1 As Integer = sheet.columns(1).width
        Dim SpaltenbreiteSpalte2 As Integer = sheet.columns(2).width
 
        MessageBox.Show("Die Spalte 1 hat die Länge: " & SpaltenbreiteSpalte1 & _
          vbCrLf & "Die Spalte 1 hat die Länge: " & SpaltenbreiteSpalte2)
 
        workbook.close(False)
 
        sheet = Nothing
        workbook = Nothing
        excel.quit
        excel = Nothing
 
    End Sub

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: datagridview in XLS speichern 
Autor: Franki
Datum: 07.11.18 01:57

Hallo,

gute Antwort, ganz im Ernst, du hast super reagiert mit deiner Antwort.
Ich bin gespannt was Ortech antworten wird. (Vermute aber, dass das nicht verstanden wird und keine Antwort kommt)

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel