Excel Tabellenzeile auslesen und anzeigen

S

Schicker

Hallo

ich möchte eine Zeile aus einer Excel-Tabelle auslesen lassen. Das klappt ja noch ganz gut. Wenn ich allerdings der Wert einer Zelle in einer MessageBox ausgeben lassen will dann klappt das nicht. Habe schon versucht eine Typumwandlung mit COleVariant::ChangeType(VT_BSTR) allerdings bekomme ich dann zur Laufzeit eine Exception mit Typkonflikt. Was ich auch schon versucht habe ist mir den jeweiligen Typ den "vData" gerade verwendet anzeigen zu lassen (siehe auskommentierte Switch-Anweisung). Wenn ich vData.vt abfragen lasse, dann kommen etliche Datentypen obwohl die Zelle, die gerade gelesen wird leer ist.
Code:
void CAutoProjektDlg::OnRun() 
{ 
    // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen 
    _Application app;  // app is the Excel _Application object 
    Workbooks books; 
    _Workbook book; 
    _Worksheet sheet; 
    Worksheets sheets; 
    Range range; 
        
    CFile file; 
    file.Open("temp.dat",CFile::modeCreate | CFile::modeWrite); 
    CArchive archive(&file, CArchive::store); 

   // Start Excel and get Application object. 

   if(!app.CreateDispatch("Excel.Application")) 
   { 
      AfxMessageBox("Cannot start Excel and get Application object."); 
      return; 
   } 
   else 
   { 
      //Make the application visible and give the user control of 
      //Microsoft Excel. 
      //app.put_Visible(TRUE); 
      //app.put_UserControl(TRUE); 
      app.SetVisible(FALSE); 
      app.SetUserControl(FALSE); 
      
      books=app.GetWorkbooks(); 
      CFileDialog FileDlg(TRUE, ".xls", NULL, OFN_HIDEREADONLY, NULL, NULL); 
      if(FileDlg.DoModal()==IDOK) 
      { 
        CString name = FileDlg.GetPathName(); 
        name.Replace("\\","\\\\"); 
      book= books.Open(name ,vOpt,vOpt, vOpt, vOpt, vOpt, vOpt, vOpt ,vOpt , vOpt, vOpt, vOpt, vOpt ,vOpt, vOpt); 
      } 
      sheets = book.GetWorksheets(); 
      sheet = sheets.GetItem(COleVariant((short)1)); 
      sheet.Activate(); 
        
      range = sheet.GetRange(COleVariant("A35"),COleVariant("AP35")); 

//////////////////////////////////////////////////////////////////////////////////////////// 
      COleSafeArray saRet; 
        saRet = range.GetValue2(); 
        long iRows; 
        long iCols; 
        saRet.GetUBound(1, &iRows); 
        saRet.GetUBound(2, &iCols); 
    
    CString valueString = "Array Data:\r\n"; 
    long index[2]; 
    // Loop through the data and report the contents. 
    for (int rowCounter = 1; rowCounter <= iRows; rowCounter++) { 
        for (int colCounter = 1; colCounter <= iCols; colCounter++) { 
            index[0]=rowCounter; 
            index[1]=colCounter; 
            COleVariant vData; 
            
            saRet.GetElement(index, vData); 
            vData.ChangeType(VT_INT); 
            int x = rowCounter; 
            int y = colCounter; 
            
            TRACE( "x hat den Wert %d\n", x ); 
            TRACE( "y hat den Wert %d\n", y ); 
/* 
            switch (vData.vt) 
            { 
                case VT_INT: 
                AfxMessageBox("VT_INT"); 
                case VT_BSTR: 
                AfxMessageBox("VT_BSTR"); 
                case VT_EMPTY: 
                AfxMessageBox("leer"); 
                case VT_PTR: 
                AfxMessageBox("Zeiger"); 
                case VT_I2: 
                AfxMessageBox("VT_I2"); 
                case VT_I4: 
                AfxMessageBox("VT_I4"); 
                case VT_R4: 
                AfxMessageBox("VT_R4"); 
                case VT_R8: 
                AfxMessageBox("VT_R8"); 
                case VT_DISPATCH: 
                AfxMessageBox("VT_DISPATCH"); 
                case VT_ERROR: 
                AfxMessageBox("VT_ERROR"); 
                case VT_BOOL: 
                AfxMessageBox("VT_BOOL"); 
                case VT_VARIANT: 
                AfxMessageBox("VT_VARIANT"); 
                case VT_DECIMAL: 
                AfxMessageBox("VT_DECIMAL"); 
                case VT_I1: 
                AfxMessageBox("VT_I1"); 
                case VT_UI1: 
                AfxMessageBox("VT_UI1"); 
                case VT_UI2: 
                AfxMessageBox("VT_UI2"); 
                case VT_UI4: 
                AfxMessageBox("VT_UI4");                
                case VT_UINT: 
                AfxMessageBox("VT_UINT");                
                case VT_VOID: 
                AfxMessageBox("VT_VOID"); 
                case VT_HRESULT: 
                AfxMessageBox("VT_HRESULT"); 
                case VT_SAFEARRAY: 
                AfxMessageBox("VT_SAFEARRAY"); 
                case VT_CARRAY: 
                AfxMessageBox("VT_CARRAY"); 
                case VT_USERDEFINED: 
                AfxMessageBox("VT_USERDEFINED"); 
                case VT_LPSTR: 
                AfxMessageBox("VT_LPSTR"); 
                case VT_LPWSTR: 
                AfxMessageBox("VT_LPWSTR"); 
                case VT_BLOB: 
                AfxMessageBox("VT_BLOB"); 
                case VT_STREAM: 
                AfxMessageBox("VT_STREAM"); 
                case VT_STORED_OBJECT: 
                AfxMessageBox("VT_STORED_OBJECT"); 
                case VT_BLOB_OBJECT: 
                AfxMessageBox("VT_BLOB_OBJECT"); 
                case VT_CF: 
                AfxMessageBox("VT_CF"); 
                case VT_CLSID: 
                AfxMessageBox("VT_CLSID"); 
                case VT_VECTOR: 
                AfxMessageBox("VT_VECTOR"); 
                case VT_ARRAY: 
                AfxMessageBox("VT_ARRAY"); 
                case VT_BYREF: 
                AfxMessageBox("VT_BYREF"); 
                case VT_RESERVED: 
                AfxMessageBox("VT_RESERVED"); 
                
                
            } 
            */ 
            
            valueString += "\t"; 
        } 
        valueString += "\r\n"; 
    } 
    AfxMessageBox(valueString,MB_SETFOREGROUND,NULL); 

   app.Quit(); 
}
Kann mir wer helfen


mfg
Chris
 
Hallo,

Zitat: "Was ich auch schon versucht habe ist mir den jeweiligen Typ den "vData" gerade verwendet anzeigen zu lassen (siehe auskommentierte Switch-Anweisung). Wenn ich vData.vt abfragen lasse, dann kommen etliche Datentypen obwohl die Zelle, die gerade gelesen wird leer ist."

Antwort: Bei einer switch{ case: ... case: } muß hinter jedem case: { ... ; break;} stehen, sonst werden alle case ausgeführt.

Und ich habe Dein Problem gelöst siehe Anhang A35-AP35.zip .

Das Entscheidenste hier nochmal:
Code:
void CAutoProjectDlg::OnRun() 
{ 
    // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen 
  try
  { _Application app;  // app is the Excel _Application object 
    Workbooks books; 
    _Workbook book; 
    _Worksheet sheet; 
    Worksheets sheets; 
    Range range; 
    COleVariant   vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);        

    CFile file; 
    file.Open("temp.dat",CFile::modeCreate | CFile::modeWrite); 
    CArchive archive(&file, CArchive::store); 

   // Start Excel and get Application object. 

   if(!app.CreateDispatch("Excel.Application")) 
   { 
      AfxMessageBox("Cannot start Excel and get Application object."); 
      return; 
   } 
   else 
   { 
      //Make the application visible and give the user control of 
      //Microsoft Excel. 
      
       
      app.put_Visible(FALSE); //app.SetVisible(FALSE); 
      app.put_UserControl(TRUE); //app.SetUserControl(FALSE); 
      
      books=app.get_Workbooks(); //app.GetWorkbooks(); 
      static char BASED_CODE szFilterXls[] = "Excel (*.xls)|*.xls|Alle (*.*)|*.*||";
      CFileDialog FileDlg(TRUE, 0, 0, OFN_HIDEREADONLY, szFilterXls ); // Dialogfeld Öffnen erzeugen
      if( (FileDlg.DoModal()==IDOK) && !(FileDlg.GetFileName().IsEmpty()) ) // Dialogfeld Öffnen anzeigen und Ergebnis übernehmen
      { // Gewählten Dateinamen ermitteln
        CString name = FileDlg.GetPathName(); //==Laufwerk+Pfad+Dateiname
      //name.Replace("\\","\\\\"); 
      //book= books.Open(name ,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt); 
        book= books.Open(name ,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt); 
      } else { app.Quit(); return; }
      sheets = book.get_Worksheets(); //.GetWorksheets(); 
      sheet = sheets.get_Item( COleVariant((short)1) ); //.GetItem(COleVariant((short)1)); 
      sheet.Activate(); 
        
      range = sheet.get_Range( COleVariant("A35"), COleVariant("AP35") ); //.GetRange(COleVariant("A35"),COleVariant("AP35")); 

//////////////////////////////////////////////////////////////////////////////////////////// 
      COleSafeArray saRet; 
        saRet = range.get_Value2(); //.GetValue2(); 
        long iRows; 
        long iCols; 
        saRet.GetUBound(1, &iRows); 
        saRet.GetUBound(2, &iCols); 
    
    CString valueString = "Array Data:\r\n"; 
    long index[2]; int iRet=0; CString sVal = "(leer)";
    // Loop through the data and report the contents. 
    for (int rowCounter = 1; rowCounter <= iRows; rowCounter++) { 
        for (int colCounter = 1; colCounter <= iCols; colCounter++) { 
            index[0]=rowCounter; 
            index[1]=colCounter; 
            COleVariant vData; 
            
            saRet.GetElement(index, vData); 
         // vData.ChangeType(VT_INT); 
/*          if( vData.vt != VT_EMPTY ) 
            { vData.ChangeType( VT_INT );
              iRet = vData.intVal;
            }
*/
            int x = rowCounter; 
            int y = colCounter; 
            
            // TRACE( "x hat den Wert %d\n", x ); 
            // TRACE( "y hat den Wert %d\n", y ); 
 

            CString sRet="nix";
            switch (vData.vt) 
            { 
                case VT_INT:           { sRet="VT_INT"          ; break; }
                case VT_BSTR:          { sRet="VT_BSTR"         ; break; }
                case VT_EMPTY:         { sRet="leer"            ; break; }
                case VT_PTR:           { sRet="Zeiger"          ; break; }
                case VT_I2:            { sRet="VT_I2"           ; break; }
                case VT_I4:            { sRet="VT_I4"           ; break; }
                case VT_R4:            { sRet="VT_R4"           ; break; }
                case VT_R8:            { sRet="VT_R8"           ; break; }
                case VT_DISPATCH:      { sRet="VT_DISPATCH"     ; break; }
                case VT_ERROR:         { sRet="VT_ERROR"        ; break; }
                case VT_BOOL:          { sRet="VT_BOOL"         ; break; }
                case VT_VARIANT:       { sRet="VT_VARIANT"      ; break; }
                case VT_DECIMAL:       { sRet="VT_DECIMAL"      ; break; }
                case VT_I1:            { sRet="VT_I1"           ; break; }
                case VT_UI1:           { sRet="VT_UI1"          ; break; }
                case VT_UI2:           { sRet="VT_UI2"          ; break; }
                case VT_UI4:           { sRet="VT_UI4"          ; break; }
                case VT_UINT:          { sRet="VT_UINT"         ; break; }
                case VT_VOID:          { sRet="VT_VOID"         ; break; }
                case VT_HRESULT:       { sRet="VT_HRESULT"      ; break; }
                case VT_SAFEARRAY:     { sRet="VT_SAFEARRAY"    ; break; }
                case VT_CARRAY:        { sRet="VT_CARRAY"       ; break; }
                case VT_USERDEFINED:   { sRet="VT_USERDEFINED"  ; break; }
                case VT_LPSTR:         { sRet="VT_LPSTR"        ; break; }
                case VT_LPWSTR:        { sRet="VT_LPWSTR"       ; break; }
                case VT_BLOB:          { sRet="VT_BLOB"         ; break; }
                case VT_STREAM:        { sRet="VT_STREAM"       ; break; }
                case VT_STORED_OBJECT: { sRet="VT_STORED_OBJECT"; break; }
                case VT_BLOB_OBJECT:   { sRet="VT_BLOB_OBJECT"  ; break; }
                case VT_CF:            { sRet="VT_CF"           ; break; }
                case VT_CLSID:         { sRet="VT_CLSID"        ; break; }
                case VT_VECTOR:        { sRet="VT_VECTOR"       ; break; }
                case VT_ARRAY:         { sRet="VT_ARRAY"        ; break; }
                case VT_BYREF:         { sRet="VT_BYREF"        ; break; }
                case VT_RESERVED:      { sRet="VT_RESERVED"     ; break; }
                default: { sRet="unbekannt (oder vergessen)"    ; break; }
            }

            sVal = "(leer)";
            if( vData.vt != VT_EMPTY ) 
            {  vData.ChangeType( VT_BSTR );
               sVal = vData.bstrVal;
            }
            TRACE("Zelle x=%i y=%i Typ=%s Text=\"%s\"\n",x,y,sRet,sVal); // AfxMessageBox( sRet );
            valueString += sVal + "\t";    
        } // 2.for
        valueString += "\r\n";      
    } // 1.for
    AfxMessageBox(valueString,MB_SETFOREGROUND,NULL); 
                                    
   app.Quit();
   } // if(!app.CreateDispatch("Excel.Application"))...else

  } // Ende: try
  catch(COleException *e)
  { char buf[1024];
    sprintf(buf, "COleException. SCODE: %08lx.", (long)e->m_sc ); 
    ::MessageBox(NULL, buf, "COleException", MB_SETFOREGROUND | MB_OK);
  }
  catch(COleDispatchException *e)
  { char buf[1024];
    sprintf(buf, "COleDispatchException. SCODE: %08lx, Beschreibung: \"%s\".", (long)e->m_wCode, (LPSTR)e->m_strDescription.GetBuffer(1024)); 
    ::MessageBox(NULL, buf, "COleDispatchException", MB_SETFOREGROUND | MB_OK);
  }
  catch(...)
  { ::MessageBox(NULL, "Allgemeiner Exception Fehler.", "Catch-All", MB_SETFOREGROUND | MB_OK);
  }
}

Gruß Ekke
---------------------------------------
HTML-Validator , HTML-Debugger mit
HTML Tidy in Deutsch http://www.kronos-titan.privat.t-online.de/tidy.sourceforge.net/index.html
 

Anhänge

Zurück