Zelle(n) aus ExcelSheet auslesen
-
Hi,
ich versuche seit geraumer Zeit eine Zelle eines ExcelSheets auszulesen.
Google und die SuFu hier im Forum haben mir bis jetzt leider wenig geholfen.
Das Projekt schaut im Mom so ausExcel::Application^ Excel; // ExcelApplikation Excel::Workbook^ DoorsExportExcel; // Arbeitsmappe mit DoorsExport Excel::Worksheet^ Tabellenblatt; // Tabellenblatt // Pfad der DoorsExport-Datei auslesen DoorsExportdatei = this->txtDoorsExport->Text; TabellenblattName = this->txtTabellenblatt->Text; try { // Excel Starten Excel = gcnew Excel::Application(); Excel->Visible = true; //Sichtbarkeit von Excel Excel->DisplayAlerts = false; //Zeigt Warnunge innerhalb Excel an // Template laden DoorsExportExcel = Excel->Workbooks->Add(DoorsExportdatei); Tabellenblatt = (Excel::Worksheet^)Excel->Worksheets[TabellenblattName]; // Zellen schreiben/auslesen Tabellenblatt->Cells[1 , 1]="TEST"; Tabellenblatt->Cells[1 , 2]="TEST"; Tabellenblatt->Cells[2 , 2]="TEST"; String^ test = Tabellenblatt->Cells[1,1]->ToString(); MessageBox::Show(test,"Hallo",MessageBoxButtons::OK);
Excel und die richtige Arbeitsmappe mit dem richtigen Tabellenblatt öffnen funktioniert.
Auch in die Richtige Zelle einen Wert schreiben klappt wunderbar, ABER aus einer Zelle einen Wert wieder auslesen funktioniert einfach nicht.
Ich habe schon verschiedene Dinge versucht, so wie oben in Zeile 23 erschien es mir irgendwie am sinnvollsten.
Ich bekomme aber nur folgenden String zurück : System.__ComObject
Kann mir jemand weiterhelfen?
-
Hi,
Ich denke, Cells gibt eine Range zurück.
http://msdn.microsoft.com/de-de/library/microsoft.office.interop.excel.range.aspxEv. kannst Du via Value oder so darauf zugreifen.
-
Range ist doch tatsächlich das Zauberwort.
Mit folgender Zeile funktioniert es:
String^ test = Tabellenblatt->Range["C1",Type::Missing]->Value2->ToString();
Die Variable test enthält dann den Inhalt der Zelle C1.
Alternativ funktioniert auch:String^ test = Tabellenblatt->Range[Tabellenblatt->Cells[1,1],Tabellenblatt->Cells[1,1]]->Value2->ToString();
Danke für den Tipp
-
So, nochmal der Vollständigkeit halber.
Da jede Zelle einzeln einlesen ziemlich aufwendig ist, hab ich hier mal noch meine Lösung um mehrere Zellen auf einmal einzulesen und in einem Array zu speichern.Excel::Application^ Excel; // ExcelApplikation Excel::Workbook^ DoorsExportExcel; // Arbeitsmappe mit DoorsExport Excel::Worksheet^ Tabellenblatt; // Pfad der DoorsExport-Datei (Meine .xls-Datei) auslesen DoorsExportdatei = this->txtDoorsExport->Text; TabellenblattName = this->txtTabellenblatt->Text; // Excel Starten Excel = gcnew Excel::Application(); Excel->Visible = true; //Sichtbarkeit von Excel Excel->DisplayAlerts = false; //Zeigt Warnunge innerhalb Excel an // Template laden DoorsExportExcel = Excel->Workbooks->Add(DoorsExportdatei); Tabellenblatt = (Excel::Worksheet^)Excel->Worksheets[TabellenblattName]; // Abschnitt aus Tabelle auslesen, Möglichkeit 1 // Abschnitt von Zelle 1,1 bis Zelle 3,3 (Entspricht A1 bis C3) Excel::Range^ Range1 = Tabellenblatt->Range[Tabellenblatt->Cells[1,1],Tabellenblatt->Cells[3,3]]; // Object mit Dataninhalten aus Range1 extrahieren array<Object^,2>^ Zelleninhalte1 = (array<Object^,2>^)Range1->Value2; // Ein beliebiges Element ausgeben String^ Ausgabe1 = Zelleninhalte1[1 , 2]->ToString(); // Abschnitt aus Tabelle auslesen, Möglichkeit 2 // Abschnitt von A1 bis C3 Excel::Range^ Range2 = Tabellenblatt->Range["A1","C3"]; // Object mit Dataninhalten aus Range2 extrahieren array<Object^,2>^ Zelleninhalte2 = (array<Object^,2>^)Range2->Value2; // Ein beliebiges Element ausgeben String^ Ausgabe2 = Zelleninhalte2[1 , 2]->ToString(); MessageBox::Show("Ausgabe1: "+Ausgabe1+"\n"+"Ausgabe2: "+Ausgabe2,"Hallo",MessageBoxButtons::OK); Excel->Quit();
Die Range kann dabei auf verschiedene Weisen angegeben werden.
Mann könnte vorher auch die Größe der Exceltabelle abfragen und die Werte dann als Range angeben, dass hab ich allerdings noch nicht versucht.
Zu beachten ist, dass beim Auslesen von Werten aus den Arrays Zelleninhalte1/2 die Elemente bei 1,1 beginnen und nicht bei 0,0.
Ausgabe1/2 hier im Beispiel geben dann die Zelle B1 aus.