Zellen aus Excel auslesen



  • Hallo,
    ich möchte aus einer Excel-Datei eine bestimmte Zelle auslesen. Das Ganze soll mit einer "Windows Forms-Anwendung" von Visual C++ (Visual Studio 2005) und einer Excel-Datei von Office 2003 gehen.

    Ich habe bei Google schon verschiedenes gefunden, aber nichts davon wollte funktionieren.

    Hat Jemand vielleicht ein kleines Beispiel wie man einzelne Zellen ausliest?



  • Prinzipiell hat das nichts mit Windows-Forms oder C++ zu tun...
    Excel kann man via COM ansprechen. Für C# gibt es hier ein Beispiel:
    http://www.c-sharpcorner.com/Code/2004/March/ExcelReportsInNet.asp

    Das lässt sich IMHO relativ einfach nach C++/CLI übertragen.



  • Jochen Kalmbach schrieb:

    Prinzipiell hat das nichts mit Windows-Forms oder C++ zu tun...
    Excel kann man via COM ansprechen. Für C# gibt es hier ein Beispiel:
    http://www.c-sharpcorner.com/Code/2004/March/ExcelReportsInNet.asp

    Das lässt sich IMHO relativ einfach nach C++/CLI übertragen.

    Und wo finde ich das "Add Reference"?



  • VII schrieb:

    Und wo finde ich das "Add Reference"?

    "Project|Properties|Common Properties|References|Add New Reference..."



  • Also der Code lässt sich irgendwie nicht umsetzen. Und selbst wenn: Wie man nun genau eine Zelle ausliest sehe ich darin auch nicht.



  • Warum lässt sich der Code nicht umsetzen ?



  • Sorry, aber ich habe immer noch folgende Probleme:

    Ich will ne Methode mit der ich eine bestimmte Zelle aus einer Excel-Tabelle auslesen kann.

    Danke für die Antworten, aber irgendwie hat mir da noch nichts weitergeholfen.
    Der Link zeigt irgendwie nur Quellcode, von dem ich
    a) nicht weis wie und wo ich ihn in mein Projekt einbinden soll und
    b) der mir auch nicht zeigt wie so eine Methode zum auslesen einer Zelle aussehen soll.



  • Das gibt es auch nicht. Du wirst Dich schon ein wenig mit dem Quellcode auseinander setzen müssen, der Dir einen guten Einstieg liefert.

    Wenn Du der Meinung bist, das es einfach eine Methode lieseExcelZelleAus(Dokument,Reihe,Zelle); gibt und nicht mehr investieren willst will hier auch keiner mehr arbeit Investieren Dir zu helfen.

    Das Thema was Du Dir raus gesucht hast ist nun mal kein einfacher Methodenaufruf und Jochen hat Dir einen sehr schönen Link geschickt.



  • Knuddlbaer schrieb:

    lieseExcelZelleAus(Dokument,Reihe,Zelle);

    Genau sowas wollte ich!

    Aber wenn es so einfach nicht geht probier ich jetzt halt mal das Beispiel von dem Link zum laufen zu bringen.

    Also ich habe jetzt die Libary von Excel 11 hinzugefügt. (Bei dem Link ist es zwar Excel 9, aber ich hoffe mal es geht auch mit der neueren Version).

    Korrigiert mich bitte wenn ich das falsch machen, aber ich habe jetzt mal eine Klasse "clsExcelRepot" erstellt und da die beiden Methoden:

    void CreateExcelTemplateReport(void);
    void CreateExcelReport(void);
    

    erstellt.

    So weit so gut. Meine Klasse sieht bis jetzt so aus:

    using namespace Microsoft::Office::Interop;
    
    class clsExcelReport
    {
        public:
    		void CreateExcelTemplateReport(void) // template
    		{
    			Excel::_Application^ oXl;
    			Excel::Workbook^ theWorkbook;
    			Excel::Worksheet^ worksheet;
    
    			//theWorkbook = ???
    		}
    
    		void CreateExcelReport(void) // non-template
    		{
    			//
    		}
    };
    

    Ich hoffe mal ich habe die ersten drei Zeilen in der ersten Methode richtig nach C++ umgesetzt.

    Aber wie soll ich diese Zeile umsetzen?

    theWorkbook = oXL.Workbooks.Open(TemplatePath, 0, true, 5,"", "", true, Excel.XlPlatform.xlWindows, "\t", true, false, 0, true);
    


  • aber lesen kann ich auch noch nicht... ich suche noch 🙂

    // Copyright (c) Microsoft Corporation. All rights reserved.
    //
    // This source code is only intended as a supplement to the
    // Microsoft Visual C++ Language Reference and related
    // electronic documentation provided with Microsoft Visual C++.
    // See these sources for detailed information regarding the
    // Microsoft Visual C++ product.

    // NOTE: This example will only work with Excel10 in OfficeXP
    // Compile with cl /GX comexcel.cpp
    #include "stdafx.h"

    #define OFFICEXP 1
    #define OFFICE2000 2

    // Default Settings
    #define OFFICE_VER OFFICEXP
    #define USE_PROGID 1
    #define USE_LIBID 0

    #define _M2STR(x) #x
    #define M2STR(x) _M2STR(x)

    // Ignore hard wired default paths if MSDLL_PATH is
    // defined from the command line
    #ifndef MSDLL_PATH

    // Paths to required MS OFFICE files.
    // Make sure these paths are correct for your machine
    //#pragma message ("Make sure the path to MSO DLL is correct.")
    #if OFFICE_VER == OFFICEXP
    #define _MSDLL_PATH "C:\Programme\Gemeinsame Dateien\Microsoft Shared\OFFICE11\MSO.DLL"
    #elif OFFICE_VER == OFFICE2000
    #define _MSDLL_PATH "C:\Program Files\Microsoft Office\Office\MSO9.dll"
    #endif

    #else
    #define _MSDLL_PATH M2STR(MSDLL_PATH)
    #endif

    //
    // Delete the *.tlh files when changing import qualifiers
    #import _MSDLL_PATH rename("RGB", "MSRGB")

    #ifdef VBE6EXT_PATH
    #import M2STR(VBE6EXT_PATH)
    #else
    #import "C:\Programme\Gemeinsame Dateien\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB"
    #endif

    #if USE_PROGID
    #import "progid:Excel.Sheet" auto_search auto_rename rename_search_namespace("Office10")

    #elif USE_LIBID
    #import "libid:{00020813-0000-0000-C000-000000000046}" auto_search auto_rename version(1.3) lcid(0) no_search_namespace
    #else

    // Ignore hard wired default paths if MSDLL_PATH is
    // defined from the command line
    #ifndef MSEXCEL_PATH

    #pragma message ("Make sure the path to excel.exe is correct")
    #if OFFICE_VER == OFFICEXP
    #define _MSEXCEL_PATH "C:\Program Files\Microsoft Office\Office11\excel.exe"
    #elif OFFICE_VER == OFFICE2000
    #define _MSEXCEL_PATH "C:\Program Files\Microsoft Office\Office\excel.exe"
    #endif

    #else
    #define _MSEXCEL_PATH M2STR(MSEXCEL_PATH)
    #endif

    #import _MSEXCEL_PATH auto_search auto_rename dual_interfaces
    #endif // USE_LIBID

    void dump_com_error(_com_error &e)
    {
    _tprintf(_T("Oops - hit an error!\n"));
    _tprintf(_T("\a\tCode = %08lx\n"), e.Error());
    _tprintf(_T("\a\tCode meaning = %s\n"), e.ErrorMessage());
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());
    _tprintf(_T("\a\tSource = %s\n"), (LPCTSTR) bstrSource);
    _tprintf(_T("\a\tDescription = %s\n"), (LPCTSTR) bstrDescription);
    }

    struct StartOle {
    StartOle() { CoInitialize(NULL); }
    ~StartOle() { CoUninitialize(); }
    } _inst_StartOle;

    void main()
    {
    using namespace Excel;

    _ApplicationPtr pXL;

    try {
    pXL.CreateInstance(L"Excel.Application");

    pXL->Visible[0] = VARIANT_TRUE; //Mit FALSE startet Excel nicht?!!???

    WorkbooksPtr pBooks = pXL->Workbooks;
    _WorkbookPtr pBook = pBooks->Add((long)xlWorksheet);

    _WorksheetPtr pSheet = pXL->ActiveSheet;

    try {
    // This one will fail; it is done on purpose to demonstrate the error.
    pSheet->Name = "Market Share?";
    } catch (_com_error &e) {
    dump_com_error(e);
    }

    pSheet->Name = "Market Share!"; //Excel-Blatt bekommt den Namen "Market Share"

    // When using parameterized properties, optional args must be explicitly dealt with.
    //Selektion der Zeilen und Ausfüllen mit den Bezeichnern "Messplatz x"
    pSheet->Range["A2"][vtMissing]->Value2 = "Messplatz 1";
    pSheet->Range["B2"][vtMissing]->Value2 = "Messplatz 2";
    pSheet->Range["C2"][vtMissing]->Value2 = "Messplatz 3";
    pSheet->Range["D2"][vtMissing]->Value2 = "Messplatz 4";

    int x[10];
    x[2]=1;

    //Schreiben der Messdaten in die Zeilen
    pSheet->GetRange("A3:A13")->Value2 = 11; //Speichert 11 in A3 und A4
    pSheet->GetRange("B3")->Value2 = 0.998658;
    pSheet->GetRange("C3")->Value2 = 0.5005427;
    pSheet->GetRange("D3")->Value2 = 0.6785421;

    Sleep(10000); //Warteschleife

    pBook->Saved[1] = VARIANT_TRUE;
    pXL->Quit(); //Schließt Excel
    } catch(_com_error &e) {
    dump_com_error(e);
    }

    }

    mfg sonic


Anmelden zum Antworten