| |
VB.NET - Ein- und Umsteigerdatagridview 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 | |
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 | |
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... | |
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 | |
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. | |
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? | |
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. | |
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... | |
Re: datagridview in XLS speichern | | | Autor: effeff | Datum: 31.10.18 17:59 |
| xlsWorksheet.Columns(i).Width EALA FREYA FRESENA | |
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 | |
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. | |
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 | |
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? | |
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? | |
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 | |
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 | |
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 | |
| 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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats sevZIP40 Pro DLL
Zippen und Unzippen wie die Profis!
Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Weitere Infos
|