Announcement

Collapse
No announcement yet.

Arbeiten mit TExcelApplication

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

  • Arbeiten mit TExcelApplication

    Hallo!

    Ich hatte vor einiger Zeit schon mal dasselbe gefragt, bin aber zwischenzeitlich noch zu keiner besseren Lösung gekommen...
    Mein Problem ist folgendes: Ich muss aus einem TStringGrid eine größere Menge Daten in ein Excelsheet übertragen. Dabei geh ich folgendermassen vor:


    Code:
    Variant ExcelWorksheet;
    unsigned int smom,zmom,s,z;
    AnsiString txt;
    
    try
    {
    ExcelApplication->Connect();
    }
    catch(Exception& e)
    {
    Application->MessageBox(e.Message.c_str(),"OLE-Error",MB_ICONERROR);
    return;
    }
    ExcelApplication->set_Visible(0,1);
    ExcelApplication->Workbooks->Add();
    tagVARIANT mycol,myrow,myval,mycolwidth;
    mycol.vt = VT_UINT;
    mycolwidth.vt=VT_UINT;
    myrow.vt = VT_UINT;
    myval.vt=VT_R8;
    
    for(z=zmom;z<(maxz+zmom+1);z++){
    		 for(s=smom;s<(maxs+smom+1);s++){
    			 mycol.intVal=s;
    			 myrow.intVal=z;
    			 txt=(AnsiString)StringGrid1->Cells[s][z];
    			 if(!(txt==""))
    				 ExcelApplication->Cells->set_Item(myrow,mycol,TVariant(txt));
    			 }
    		 }
    Das Problem ist: das ganze ist unaussprechlich langsam. Für die knapp 350x20 Zellen brauch das ganze Dingens schätzungsweise 20 sec.

    Gibt es irgendwie keine Möglichkeit ganze Arrays zu übertragen, oder das ganze zumindest zu beschleunigen?

    Bin für jede Hilfe dankbar...

    Bodo

  • #2
    Sagt mal, dass gibts doch nicht dass das nur so lahmarschig geht! Ich versteh auch gar nicht an was das hängt, was treibt denn das dumme Excel im Hintergrund??? Jeden Datensatz zum Bill funken oder erst gar nicht aus dem Valiumkoma wach werden? ;-)

    Hat keiner ne Idee wie ich das beschleunigen kann?
    Vielleicht ist es möglich dass ich die Daten in ein *.xls schreibe und dieses dann öffne? Ist das schneller?

    Comment


    • #3
      350 x 20 =7000 in 20 Sek=0,002 Sek pro Wert. Finde ich für OLE nicht langsam.

      txt=(AnsiString)StringGrid1->Cells[s][z];
      Cell liefert einen String zurück casten unnötig -> wieder was gespart

      if(!(txt==""))
      Klammerung überflüssig -> if(tx!="")
      Christian

      Comment


      • #4
        Du darfst nich jede Zelle einzeln bearbeiten sondern mußt den ganzen Block als Range übergeben (Stichwort: Variant-Array). Die Grids von TMS machen das z.B. beim Excel-Export. Da ich meine Ladefunktion auch davon gezogen habe kann ich dir leider keine Quellcode(auszug) posten.

        Comment


        • #5
          Danke!

          Stimmt, der cast ist unnötig. Wird aber wahrsch. "den Bock nicht fett machen".
          Sowas wie das Variant-Array hab ich gesucht, vielen Dank! Muss mich erstmal durch die Hilfe klicken. Mal sehen ob ich was finde.

          Nochmals danke für die Tipps!

          Comment

          Working...
          X