Announcement

Collapse
No announcement yet.

ADO und Excel

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

  • ADO und Excel

    Hallo,

    ich würde gerne die Werte der Zellen eines ExcelWorkSheets auslesen.
    Kann ich ein WorkSheet als ADO-Datenmenge auslesen oder muß ich
    die Daten über OleAutomation auslesen ??

    Thx
    Sascha

  • #2
    Hallo,

    ADO kann direkt die Daten aus einer Excel-Tabelle als "Datenbanktabelle" auswerten. Mit den neuen ADO-Komponenten von Delphi 5 ist dazu im Objektinspektor die folgende Konfiguration notwendig:
    <pre>
    object ExcelDataSet: TADODataSet
    ConnectionString =
    'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Forecast.xls;Extended Properties' +
    '=Excel 8.0;Persist Security Info=False'
    CursorType = ctStatic
    CommandText = 'select * from Forecast'
    CommandType = cmdUnknown
    Parameters = <>
    Left = 40
    Top = 48
    end
    object ExcelDataSource: TDataSource
    DataSet = ExcelDataSet
    Left = 44
    Top = 112
    end
    </pre>
    Die EXCEL-Tabelle wird über eine SELECT-Anweisung abgefragt. Stehen die ADO-Komponenten nicht zur Verfügung, kann man aber auch direkt über das <b>RecordSet</b>-Objekt von ADO auf die Excel-Tabelle zugreifen

    Comment


    • #3
      Hallo Herr Kosch,

      danke für die Beantwortung der Frage. Allerdings habe ich noch ein Problem.

      Wenn ich über TableDirect gehe, dann funktioniert es perfekt.

      object ADODataSet1: TADODataSet
      ConnectionString =
      'Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;Data ' +
      'Source=c:\wochentage.xls;Mode=Share Deny None;Extended Propertie' +
      's=Excel 8.0;Locale Identifier=0;Jet OLEDB:System database="";Jet' +
      ' OLEDB:Registry Path="";Jet OLEDBatabase Password="";Jet OLED'
      CursorType = ctStatic
      CommandText = 'Wochen$'
      CommandType = cmdTableDirect
      FieldDefs = <
      item
      Name = 'Wochentage'
      Attributes = [faFixed]
      DataType = ftFloat
      end
      item
      Name = 'Bezeichnung'
      DataType = ftWideString
      Size = 255
      end>
      Parameters = <>
      StoreDefs = True
      Left = 20
      Top = 204
      end

      Probiere ich es allerdings über ein SQL-Statement, so erhalte ich die die Fehlermeldung: Systaxfehler in FROM-Klausel.

      object ADODataSet2: TADODataSet
      ConnectionString =
      'Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;Data ' +
      'Source=c:\wochentage.xls;Mode=Share Deny None;Extended Propertie' +
      's=Excel 8.0;Locale Identifier=0;Jet OLEDB:System database="";Jet' +
      ' OLEDB:Registry Path="";Jet OLEDBatabase Password="";Jet OLED'
      CursorType = ctStatic
      CommandText = 'select * from Wochen$'
      Parameters = <>
      Left = 272
      Top = 204
      end

      Hätten Sie evtl. eine Idee was falsch sein kann ?

      Thx Sasch

      Comment


      • #4
        Hallo,

        was bedeutet das <b>$</b> in der Zeile <i>CommandText = 'select * from Wochen$'</i>? Ich gehe einmal davon aus, das dieser Eintrag durch die Zeichenkette "Wochentage" ersetzt werden muss

        Comment


        • #5
          ich glaube das problem läßt sich folgendermaßen lösen: "select * from [Wochen$]". Bei sonderzeichen muß der tabellenname in eckigen klammern geschrieben werden

          Comment


          • #6
            Hallo,<br>
            ich versuche gerade eine Tabelle aus einem Excelworksheet (Excel 97) über ein Recordset zu lesen.<br>
            Das Worksheet hat den Namen Tab1.<br>
            Aber ich schaffe es nicht. Was mach ich bloß falsch?<br>
            Connectionstring:<pre>
            <font face="Verdana" size="1" color="#000000">[oledb]
            ; Everything after this line is an OLE DB initstring
            Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Delphi5\Test\Excel über Recordset\Text.xls;
            Extended Properties=Excel 8.0;Persist Security Info=False</font>
            </pre>
            hier der Source:<br>
            <pre>
            <font face="Verdana" size="1" color="#000000">resourcestring
            ConnectionString='FILE NAME=excel.udl';

            procedure TForm1.Button1Click(Sender: TObject);
            var
            CN : Connection;
            RS : Recordset;
            SQL : OleVariant;
            begin
            SQL:='SELECT * FROM Text';
            CN:=CoConnection.Create;
            RS:=CoRecordset.Create;
            Try
            CN.Open(ConnectionString,'','',-1);
            RS.Open(SQL,CN,adOpenStatic,adLockOptimistic,adCmd Unspecified);
            Finally
            CN:=Nil;
            RS:=NIL;
            end;
            end;</font>
            </pre>
            Ich erhalte immer Syntaxfehler in FROM-Klausel. Ich weiß auch nicht, wie im Select das Worksheet angebe, dass ich abfragen möchte.<br>
            Der Dateienamen im SELECT kann doch ausreichend sein.<br&gt

            Comment


            • #7
              Hallo,

              in diesem Spiel gibt es gleich 2 Beteiligte, die Einfluss auf die Syntax haben: <br>
              1. OLE DB Provider (Jet Engine oder ODBC) <br>
              2. Excel-Version (97 vs. 2000 vs.2002)<br>
              Bei mir ist der folgende Aufruf erfolgreich, wobei der Worksheet-Name in eckigen Klammern mit einem abschliessenden $-Zeichen auftaucht):
              <pre>
              uses ADOInt; // ADO-Interfaces + CoClass-Hilfsfunktionen

              const
              cCS = 'Provider=MSDASQL.1;Data Source=ADOEXCEL';
              cSQL = 'SELECT Count(*) FROM [Personal$]';

              procedure TForm1.Button1Click(Sender: TObject);
              var
              aCon : _Connection;
              vRowsAffected : OleVariant;
              begin
              aCon := CoConnection.Create;
              aCon.CursorLocation := adUseClient;
              aCon.Open(cCS, '', '', adConnectUnspecified);
              try
              aCon.Execute(cSQL, vRowsAffected, adOptionUnspecified);
              ShowMessage('Der Aufruf war erfolgreich');
              finally
              aCon.Close;
              aCon := nil;
              end;
              end;
              </pre&gt

              Comment


              • #8
                Hallo Jens,

                im Select mußt du den WorkSheetnamen als Tabellennamen angeben.
                z.B. SELECT * FROM [Tabelle1$]

                Eine Liste der verfügbaren Tabellen (WorkSheets) bekommst du mit Hilfe von ADOConnection.GetTableNames(...
                Was die Tabellen (WorkSheets) sind bei denen nach dem "$" Zeichen noch weitere Zeichen folgen kann ich dir leider auch nicht sagen. Ich filtere diese in einer Funktion heraus, da man sie scheinbar sowieso nicht ansprechen kann.

                Andrea

                Comment


                • #9
                  Hallo, <br>
                  genau das ist es . Vielen Dank !!!<br>
                  Der Grund weshalb ich über das Recordset gehe ist, das unter Win95 das Programm<br>
                  immer abschmiert wenn zu viele Interfaces angefordert werden. <br>
                  Bislang lesen immer jede Zelle einzeln über das Range Interface ein.<br>
                  Unter Win2k läuft das Porgramm "Stunden" ohne Probleme. Unter Win95 ist meißt nach<br>
                  3 Minuten Schluß.<br>
                  <br>
                  Habe ich, wenn ich ein RecordSet verwende, mit den gleichen Problemen zu rechnen ?<br&gt

                  Comment


                  • #10
                    Hallo,<br>das Lesen eines WorkSheets klappt ja prima über ein Recordset. Wenn ich aber den Inhalt einer Zelle mit RS.Fields.Item[iCnt].Value:='Change'; ändere, kann ich die Excel-Datei nicht mehr öffnen.<br>Wie kann man über ADO in ein Worksheet schreiben

                    Comment


                    • #11
                      Vielleicht "SELECT * FROM Tab1"?
                      Hatte neulich auch das Problem und mich dann dafür entschieden, daß Excel-Sheet anders zu bearbeiten (über Office-Automation) ..

                      Comment

                      Working...
                      X