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 aus

    Excel::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.aspx

    Ev. 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.


Anmelden zum Antworten