ListView soll Daten aus Excel Tabelle anzeigen
-
Hallo Leute,
Ich bin noch ein Anfänger in C# daher wäre es sehr freundlich eure Hilfe in einfachen Worte zu fomulieren und auch wenns etwas umständlicher ist einsteigerfreundlich Codes zu benutzen. Danke
Jetzt zu meinem Problem:
Ziel: Bei Klick des buttons Bearbeiten wird eine Methode names Show_Kundenauswahl_Tab() aufgerufen die soll dafür sorgen das darauf hin alle anderen Komponenten ausgebledet werden(Methode Hide_All()) und nur eine Tabelle sprich eine ListView mit der View Einstellung Details anzeigen(und eine anders Label und eine groupbox, aber das ist unwichtig). Bevor diese 2 spaltige gruppenlose Tabelle angezeigt wird sollen ihr Items zugefügt werde, diese sollen aus eine Excel-Tabelle ausgelesen werden. Die Spalten der List View sollen nicht jedes Mal neu erstellt werden sondern nur einmal am Anfang. Die erste Spalte soll Kundenname und die zweite Rahmenummer heißen und beinhalten.
Die Excle Tabelle sieht wie folgt aus:0 __________A____________________B__________________C
1 _____Kundenname___________Rahmennummer-Nr
2 (leer)
3 _______Peter____________________123_______________
4 _______Anna_____________________321_______________
5 (undsoweiter Länge ändert sich..)Gut also ich fasse alles nochmal zusammen:
Bei Methodenaufruf sollen alle Items der ListView names Kundenauswahl gelöscht werden und dann die aus einer Excel-Tabelle ausgelesenen Kunden namen als Items hinzugefügt werden. Die Rahmen nummer sollen diesen als Sub-Items zugeordnet werden. Dann soll die Liste angezeigt werden.Mein bisheriger Code (Mir ist klar, dass diese Version nicht funktionieren kann da ich viel mit dieser Methode herumexperimentiert habe. Da ich aber zu keinem funktionierende Lösung fand wende ich mich jetzt an euch und liefere hiermit Code-Teile die ich schon ausprobiert habe.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Excel = Microsoft.Office.Interop.Excel;
Fehlt eine using Anweisung?
private void Show_Kundenauswahl_Tab() { Hide_All(); label_Titel.Text = "Kundenauswahl"; //Excel.Application xlApp; //Excel.Workbook xlWorkBook; //Excel.Worksheet xlWorkSheet; //object misValue = System.Reflection.Missing.Value; //xlApp = new Excel.ApplicationClass(); //xlWorkBook = xlApp.Workbooks.Open(pfad, 0, false, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); //xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); ListViewItem Kundenname = new ListViewItem(); Kundenname.Text = "Peter"; ListViewItem.ListViewSubItem Rahmennummer = new ListViewItem.ListViewSubItem(Kundenname, "0123"); Kundenname.SubItems.Add(Rahmennummer); listView_Kundenauswahl.Items.Add(Kundenname); //for (int Nr = 3; Nr < 10; Nr++) //{ //string A = "A" + Nr.ToString(); //string B = "B" + Nr.ToString(); //string Kundenname = xlWorkSheet.get_Range("A3", "A3").Value2.ToString(); //string Rahmennummer = xlWorkSheet.get_Range("B3", "B3").Value2.ToString(); //} //xlWorkBook.Close(true, misValue, misValue); //xlApp.Quit(); //releaseObject(xlWorkSheet); //releaseObject(xlWorkBook); //releaseObject(xlApp); listView_Kundenauswahl.Show(); groupBox_Kundenauswahl1.Show(); }
Beispielsweise das auslesen oder auch beschreiben der Excel Datei funktioniert einwandfrei. Einziges Problem hier: Ich weiß noch nicht genau welche Zellen ausgelesen werden müssen. Nur die beschrieben in Spalte A von Zelle A3 abwärts.(Used Range benutzen? Wie?)
Also Teilproblem A: Die Excel Range
Außerdem komme ich mit der ganzen Klasse Listview garnicht zurecht. Ich habe schon mehrfach versuscht der ListView klar definierte Items zuzuordnen doch auch diese werden mir nicht angezeigt. Ich sehe noch nicht einmal Die Spaltenköpfe. Nur Das leere weiße Viereck mit Gridlines drinnen.
Also Teilproblem B: Das Anzeigen der ausgelesenen Daten in der ListView
Ich benutze Microsoft Visual C# 2008 Express Edition und Windows 7
Wenn mir jemand mit dem Problem helfen kann schreibe mir doch bitte den passenden Code oder wirklich hilfreiche Anweisungen und keine Links (die habe ich schon alle gelesen, lesen micht schon seit 8 Stunden dadurch, aber komme einfach nicht dahinter)
Ich bedanke mich schon einmal für alle hilfreichen Antworten
Vielen Dank
Gero
-
Um auf die Excel Daten zu zu greifen kannst du z.B. folgendes tun:
List<string> kValues = new List<string>(); Excel.Range kRange = kWorksheet.get_Range( "A3:A10"); if (kRange.Count == 1) { kValues.Add( kRange.Value); } else if (kRange.Count > 1) { foreach (Excel.Range kCell in kRange.Cells) { kValues.Add( kCell.Value); Marshal.ReleaseComObject(kCell); } } Marshal.ReleaseComObject(kRange); kListView.DataSource = kValues;
Hinweis: JEDES Objekt, dass du von Excel bekommst MUSST du auch von Hand freigeben. Wenn du das nicht machst, wird der Speicher nicht freigegeben (bzw erst, wenn die Anwendung geschlossen wird).
Dazu brauchst du den Namespace System.Runtime.InteropServices.
Da muss man ziemlich gut aufpassen, denn folgendes liefert gleich 2 ComReferenzen:
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);Eine Referenz ist das WorkSheet selbst, die 2. Referenz ist die Collection xlWorkBook.Worksheets (vom Typ Excel.Sheets). Diese muss ebenfalls freigegeben werden.
Das bläht den ganzen Code etwas auf. Ist aber auf dauer notwendig.Excel.Application xlApp = new Excel.ApplicationClass(); Excel.Workbooks xlWorkbooks = xlApp.Workbooks; Excel.Workbook xlWorkBook = xlWorkbooks.Open(pfad, 0, false, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); Excel.Sheets xlWorksheets = xlWorkbook.Worksheets; xlWorkSheet = (Excel.Worksheet)xlWorksheets.get_Item(1); // ... // do stuff with excel // ... xlApp.Quit(); Marshal.ReleaseComObject(xlWorkSheet); Marshal.ReleaseComObject(xlWorksheets); Marshal.ReleaseComObject(xlWorkBook); Marshal.ReleaseComObject(xlWorkbooks); Marshal.ReleaseComObject(xlApp);
Zusätzlich ist noch wichtig zu wissen, das man ReleaseComObject keinen nullpointer übergeben darf. Die Referenzen müssen selbstverständlich auch bei Exceptions Released werden! Da ist besonders drauf zu achten.