Announcement

Collapse
No announcement yet.

Daten von DB in Excel importieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Daten von DB in Excel importieren

    Hallo,

    das leidige Thema, ich möchte Daten in Excel importieren. Unter Builder 5.0 hat das auch funktioniert nachdem man den Fehler in utilcls.h behoben hat.
    Unter C++ Builder 6.0 funktioniert nichtsmehr.
    <PRE>
    #include <vcl.h>
    #pragma hdrstop
    #include "ToolBoxMain.h"
    #include "DM.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma link "Excel_2K_SRVR"
    #pragma resource "*.dfm"

    ....

    void __fastcall TFormToolbox::Button1Click(TObject *Sender)
    {
    DM1->QueryLVAbfrage->Close();
    DM1->QueryLVAbfrage->Prepare();
    DM1->QueryLVAbfrage->ParamByName("ProjektNr")->AsString = EditProjektNr->Text;
    DM1->QueryLVAbfrage->Open();
    }
    //---------------------------------------------------------------------------

    void __fastcall TFormToolbox::Button2Click(TObject *Sender)
    {
    try
    {
    StatusBar1->SimpleText = "Ich starte Microsoft Excel..." ;
    OleVariant oleFalse(False);
    try
    {
    // Starte Excel (oder verbinde mit bestehendem)
    ExcelApplication->Connect();
    }
    catch(Exception& e)
    {
    Application->MessageBox(e.Message.c_str(),"OLE-Error",MB_ICONERROR);
    return;
    }
    // Mache das Fenster sichtbar
    ExcelApplication->Visible[0] = True;
    // Erzeuge neue Arbeitsmappe
    ExcelApplication->Workbooks->Add();
    // Verbinde Komponente mit Tabelle
    ExcelWorksheet->ConnectTo(ExcelApplication->ActiveSheet);
    // Trage Daten ein
    DM1->QueryLVAbfrage->Open();
    DM1->QueryLVAbfrage->First();
    char cText[20];
    unsigned short zeile=1;
    while (!DM1->QueryLVAbfrage->Eof)
    {
    ExcelWorksheet->Cells->set_Item(zeile, 1,
    StringToOleStr(DM1->QueryLVAbfrage->Fields->Fields[1]->AsString));
    ExcelWorksheet->Cells->set_Item(zeile, 2,
    StringToOleStr(DM1->QueryLVAbfrage->Fields->Fields[2]->AsString));
    ExcelWorksheet->Cells->set_Item(zeile, 3,
    (DM1->QueryLVAbfrageLVAbfrage->Fields->Fields[3]->AsFloat));
    //ExcelWorksheet->Cells->set_Item(zeile, 3,
    // DM1->QueryLVAbfrageLVAbfrage->Fields->Fields[3]->AsFloat);
    ExcelWorksheet->Cells->set_Item(zeile, 4,
    StringToOleStr(DM1->QueryLVAbfrageLVAbfrage->Fields->Fields[4]->AsString);
    //ExcelWorksheet->Cells->set_Item(zeile, 5,
    // DM1->QueryLVAbfrageLVAbfrage->Fields->Fields[5]->AsFloat);
    ExcelWorksheet->Cells->set_Item(zeile, 5,
    (DM1->QueryLVAbfrageLVAbfrage->Fields->Fields[5]->AsFloat));
    DM1->QueryLVAbfrageLVAbfrage->Next();
    zeile++;
    }
    DM1->QueryLVAbfrageLVAbfrage->Close();

    // Eigenes Fenster wieder in den Vordergrund
    StatusBar1->SimpleText = "Vorgang beendet." ;
    Show();
    }
    catch(Exception& e)
    {
    Application->MessageBox(e.Message.c_str(),"OLE-Error",MB_ICONERROR);
    return;
    }
    }

    Debugger meldet:

    [C++ Fehler] ToolBoxMain.cpp(53): E2247 Zugriff auf 'TExcelApplication::Visible' nicht möglich
    [C++ Fehler] ToolBoxMain.cpp(66): E2034 Konvertierung von 'unsigned short' nach 'tagVARIANT' nicht möglich
    [C++ Fehler] ToolBoxMain.cpp(66): E2342 Keine Übereinstimmung des Typs beim Parameter 'RowIndex' ('tagVARIANT' erwartet, 'unsigned short' erhalten)..
    </PRE>
    Wo liegt der Fehler?

    Alex

  • #2
    Hallo,
    für das ExcelApplication->Visible[0] = True; gibt es jetzt das
    ExcelApplication->set_Visible(0,1);

    wenn tagVARIANT als Parameter erwartet wird, empfiehlt es sich, eine Varibale dieses Typs zu deklarieren
    tagVARIANT myValue;
    und dann in vt den Typ zuzuweisen
    myValue.vt = VT_UINT;
    und jetzt noch den Wert
    myValue.intVal = 1;
    und zuletzt der eigentlich Aufruf dann mit

    ExcelWorksheet->Cells->set_Item(myValue, ...

    Gruß Jürgen

    Comment

    Working...
    X