Announcement

Collapse
No announcement yet.

Wie wird eine lange Stringliste über ADO in eine EXCEL Zelle imprtiert?

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

  • Wie wird eine lange Stringliste über ADO in eine EXCEL Zelle imprtiert?

    Bei dem Versuch in eine EXCEL-Tabelle (.csv) über ADOTable Daten mit Insert einzulesen, werden Strings, welche länger als ca. 200 Zeichen sind abgeschnitten bzw nicht weiter importiert.

    Der Import von Variablen kürzerer Länge (verschiedene Zahlenformate oder Strings) verläuft reibungslos.

    Wir werden lange Stringlisten (oder Blob-Felder) über ADO in EXCEL-ZELLEN eingefügt?
    (mit Delphi 7)

    Schon jetzt danke für eine Antwort.

  • #2
    Hallo,

    meines Wissens nach geht EXCEL je Zelle von einer Default-Länge von 255 Zeichen aus. Der entgegengesetzte Weg (EXCEL wird von ADO eingelesen) kopiert auch längere Texte.

    Das folgende Beispiel für die Automation von Excel 2002 zeigt, dass die Methode <b>CopyFromRecordset</b> auch längere BLOb-Text in voller Breite in die Excel-Tabelle einfügt. Die Daten stammen aus der <i>Northwind</i>-Beispieldatenbank des MS SQL Server 2000. Die Konfiguration der ADO-Komponenten im Objektinspektor sieht wie folgt aus:
    <pre>
    <b>object</b> ADOConnection1: TADOConnection
    Connected = True
    ConnectionString =
    <font color="#9933CC">'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security In'</font> +
    <font color="#9933CC">'fo=False;Initial Catalog=Northwind;Data Source=(local)'</font>
    LoginPrompt = False
    Provider = <font color="#9933CC">'SQLOLEDB.1'</font>
    Left = 48
    Top = 32
    <b>end</b>
    <b>object</b> ADODataSet1: TADODataSet
    Active = True
    Connection = ADOConnection1
    CursorType = ctStatic
    CommandText = <font color="#9933CC">'select EmployeeID, LastName, Notes from Employees'</font>
    Parameters = &lt;&gt;
    Left = 88
    Top = 32
    <b>end</b>
    </pre>
    Das Programm verbindet sich mit den Server-Komponenten von Delphi 7 (die Fassung für Office XP, <b>nicht</b> die Fassung für Office 2000) mit der XLS-Datei, um dann die Spaltenbeschriftung in die 1. Zeile einzufügen. Danach wird der Inhalt der Ergebnismenge der SELECT-Abfrage angehängt:
    <pre>
    <b>uses</b> ADOInt;
    <br>
    <b>const</b>
    cXLS_FileName = <font color="#9933CC">'C:\Temp\Mappe1.xls'</font>;
    <br>
    <b>procedure</b> TForm1.Button1Click(Sender: TObject);
    <b>var</b>
    aRS : _RecordSet;
    iCnt : Integer;
    i : Integer;
    aRange : ExcelRange;
    aField : Field;
    <b>begin</b>
    ExcelApplication1.Connect;
    ExcelApplication1.Visible[GetUserDefaultLCID] := True;
    ExcelApplication1.UserControl := True;
    ExcelApplication1.Workbooks.Open(cXLS_FileName, False, False,
    EmptyParam,<font color="#9933CC">''</font>,False,False,EmptyParam,
    EmptyParam,false,false,EmptyParam,false,EmptyParam , EmptyParam,0);
    ExcelWorkbook1.ConnectTo(ExcelApplication1.ActiveW orkBook);
    ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Sheets.It em[1] <b>as</b>
    _Worksheet);
    ExcelWorksheet1.Activate;
    aRS := ADODataSet1.Recordset;
    iCnt := aRS.Fields.Count;
    <font color="#003399"><i>// Spaltenbeschriftung</i></font>
    <b>for</b> i := 1 <b>to</b> iCnt <b>do</b>
    <b>begin</b>
    aRange := IDispatch(ExcelWorksheet1.Cells.Item[1,i]) <b>as</b> ExcelRange;
    aRange.Font.Bold := True;
    aField := aRS.Fields[i-1];
    aRange.Value2 := aField.Name;
    <b>end</b>;
    <font color="#003399"><i>// Daten aus der ADO-Datenmenge kopieren</i></font>
    ExcelWorksheet1.Range[<font color="#9933CC">'A2'</font>,<font color="#9933CC">'A2'</font>].CopyFromRecordset(aRS,
    EmptyParam, EmptyParam);
    <b>end</b>;
    </pre>
    Das Ergebnis zeigt die beigefügte Abbildung

    Comment


    • #3
      Hallo zusammen,

      meine Frage paßt vielleicht nicht ganz zum Thema, aber ich versuche gerade aus meinem BCB6 aus Excel zuzugreifen.

      Mein bisheriger Veruch:
      <PRE>
      xlapp->Connect();
      AnsiString asXLFile = "test.xls";
      wchar_t* wcXLFile = new wchar_t[asXLFile.Length() + 1];
      xlapp->Workbooks->Open(/* egal was ich hier reinschreibe, es wird angemeckert...*/);
      </PRE>
      Ich hab' testweise mal die Werte aus dem Bsp oben eingefügt... Das Ergebnis:

      [C++ Fehler] Unit1.cpp(25): E2129 char-Konstanten dürfen ein oder zwei Zeichen lang sein<BR>
      [C++ Fehler] Unit1.cpp(25): E2285 Keine Übereinstimmung für 'Workbooks::Open(wchar_t *,const bool,const bool,OleVariant,char,const bool,const bool,OleVariant,OleVariant,bool,bool,OleVariant,bo ol,OleVariant,OleVariant,int)' gefunden

      Also habe ich versucht das Ganze über tagVARIANT Variablen zu machen. Ergebnis:

      [C++ Fehler] Unit1.cpp(32): E2285 Keine Übereinstimmung für 'Workbooks::Open(wchar_t *,tagVARIANT,tagVARIANT,tagVARIANT,tagVARIANT,tagV ARIANT,tagVARIANT,tagVARIANT,tagVARIANT,tagVARIANT ,tagVARIANT,tagVARIANT,tagVARIANT,tagVARIANT,tagVA RIANT,tagVARIANT)' gefunden

      Wenn man sich die Codeparameter anzeigen läßt, sind die angeblich alle vom Typ tagVARIANT... (vom ersten (wchar_t*) und letzten (long) Parameter abgesehen)

      WAS in WinzigWeichs Namen muß da rein????? Wo kann ich das nachsehen (in der BCB-Hilfe gibt's dazu gar nichts...)?

      Grüße Jochen

      P.S. Ich verwende die Office97 Komponenten (Office 97 ist auch installiert

      Comment


      • #4
        Hallo,

        &gt; E2129 char-Konstanten dürfen ein oder zwei Zeichen lang sein

        ich kenne C++ zwar nur von Hörensagen (im Gegensatz zu C#), aber ich gehe davon aus, dass der Grund durch die 1. Fehlermeldung benannt wird. Kann <i>wchar_t*</i> nicht durch etwas anderes ausgetauscht werden?

        &#10

        Comment


        • #5
          Hallo Andreas,

          die Fehlermeldung mit dem char bezieht sich auf das leere Feld für das Paßwort (in Deinem Beispiel oben haßt Du da ' ' verwendet, fünfter Parameter).
          Trotzdem habe ich mal versucht WideString, AnsiString und char versucht - kein Unterschied.

          Gibt es denn eine Quelle, wo ich die Parameter für die TExcel***-Komponenten nachsehen kann?

          Grüße Joche

          Comment


          • #6
            Hallo,

            &gt;Gibt es denn eine Quelle....

            im Fall eines Zugriffs auf einen Automation-Server wird generell ein BSTR (Unicode-Stringlänge wird zusätzlich als negativer Indexwert mit übergeben) als Stringtyp erwartet. Im Fall von Delphi übernimmt der Kompiler alles in eigener Regie, solange dort <b>WideString</b> oder <b>OleVariant</b> als Datentyp genutzt wird. Da Borland beim standardisierten C++ nicht so freizügig mit dem Kompiler hantieren darf (um die Standard-Kompatibilität nicht zu gefährden), ist es dort generell schwieriger.

            Das folgende C++Builder-Beispiel habe ich auf einer alten Borland-Seite gefunden:
            <pre>
            void __fastcall TForm1::Button1Click(TObject *Sender)

            {

            Variant V1, V2, V3;

            Variant V = CreateOleObject("TestLib.Test");

            V1 = 5;

            V2 = "Sam";

            V3 = V;

            V.OleProcedure("VarTest", V1, V2, V3);

            }
            </pre&gt

            Comment

            Working...
            X