Announcement

Collapse
No announcement yet.

In EXCEL97 Datei schreiben

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

  • In EXCEL97 Datei schreiben

    Ich habe Delpi 5 Professional. Ich muss Daten von DBASE nach EXCEL97 konvertieren. Geht das über die BDE? Wie speichere ich die Datei?

  • #2
    Hallo Andreas,

    versuch es über einen BDE-Alias, der ODBC als Treiber und dort eine Data Source für Excel-Tabellen verwendet.
    Zuerst den ODBC Treiber für Excel installieren und eine Data Source dafür einrichten. Anschließend definierst Du in der BDE einen ODBC-Alias für diese Data Source. Mit diesem Alias kannst Du dann in Delphi z.B. eine TTable öffnen und damit auf die Excel-Tabelle zugreifen.

    Aber wenn Du mit D5 arbeitest, warum verwendest Du nicht die OLE-Server für Excel. Das ist sicher komfortabler als über die BDE. Ich guck mal nach einem Bsp.

    Gruß Fal
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hallo,

      ich hab noch ein bißchen was rausgekürzt (ich hoffe nicht zu viel ;-).
      Der Vorteil dieser Variante ist die volle Kontrolle über das Excel-Sheet, also nicht nur Daten reinschreiben sondern eben auch Formatierung, Berechnung etc. - eben (fast) alles was man in Excel in VB machen kann.

      AppExcel:Variant;<br>
      <br>
      function Tfrm_Main.ExcelConnect: Boolean;<br>
      begin<br>
      if not FExcelConnected then<br>
      begin<br>
      try<br>
      AppExcel := CreateOleObject('Excel.Application');<br>
      FExcelConnected := True;<br>
      Result := True;<br>
      except<br>
      Result := False;<br>
      raise;<br>
      end;<br>
      end<br>
      else Result := True;<br>
      end;<br>
      <br>
      procedure Tfrm_Main.ExcelDisconnect;<br>
      begin<br>
      if FExcelConnected then<br>
      begin<br>
      {CloseDok;}<br>
      try<br>
      AppExcel.Quit;<br>
      finally<br>
      FExcelConnected := False;<br>
      AppExcel := 0;<br>
      end;<br>
      end;<br>
      end;<br>
      <br>
      function Tfrm_Main.ExcelExport;<br>
      var<br>
      FWS, FWB, FWC: Variant;<br>
      I, J: Integer;<br>
      begin<br>
      if ExcelConnect then<br>
      try<br>
      FWB := AppExcel.Workbooks.Add(xlWBATWorksheet);<br>
      FWS := FWB.WorkSheets.Item[1];<br>
      with DT_ADOQuery do<br>
      begin<br>
      for I := 0 to FieldCount - 1 do<br>
      begin<br>
      FWC := FWS.Cells[1, I + 1];<br>
      {FWC.NumberFormat := 'Text';}<br>
      FWC.Value := DT_ADOQuery.FieldDefs[I].Name;<br>
      end;<br>
      First;<br>
      J := 2;<br>
      while not EOF do<br>
      begin<br>
      for I := 0 to FieldCount - 1 do<br>
      begin<br>
      FWC := FWS.Cells[J, I + 1];<br>
      {FWC.NumberFormat := 'Text';}<br>
      FWC.Value := DT_ADOQuery.Fields[I].AsString;<br>
      end;<br>
      Next;<br>
      Inc(J);<br>
      end;<br>
      FWB.Close(True);<br>
      Result := True;<br>
      end;<br>
      except<br>
      Result := False;<br>
      MessageDlg('Datenexport zu MS Excel nicht möglich!', mtError, [mbOK], 0);<br>
      raise;<br>
      end<br>
      else begin<br>
      MessageDlg('Datenexport zu MS Excel nicht möglich!', mtError, [mbOK], 0);<br>
      Result := False;<br>
      end;<br>
      end;<br>
      <br>
      procedure Do_Excel;<br>
      begin<br>
      if ExcelExport then MessageDlg('Exceltabelle erfolgreich erstellt!', mtInformation, [mbOK], 0)<br>
      else MessageDlg('Exceltabelle konnte nicht erstellt werden!', mtInformation, [mbOK], 0);<br>
      end;<br>
      <br>

      Gruß Fal
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment


      • #4
        Hallo Andreas,

        wenn Du nur schnell mal eine Tabelle oder eine SQL-Ergebnis-Tabelle übertragen willst, hat sich bei mir folgender Code bewährt, den ich eine allgemeinen Unit abgespeichert habe und durch

        InitDB.ExportExcel(dbquSQL);

        von überall aus aufgerufen werden kann.

        procedure TInitDB.ExportExcel(DataSet: TDBDataSet);<br>
        var<br>
        ..sWert : String;<br>
        ..Excel : Variant;<br>
        ..iSpalte,<br>
        ..iZeile : Integer;<br>
        <br>
        begin<br>
        ..try<br>
        ....Excel:=CreateOleObject('Excel.Application');<b r>
        ..except<br>
        ....ShowMessage('Excel konnte nicht gestartet werden!');<br>
        ....Exit;<br>
        ..end;<br>
        ..Excel.Visible:=true;<br>
        ..Excel.Workbooks.Add;<br>
        <br>
        ..for iSpalte:=1 to DataSet.FieldCount do<br>
        ....Excel.Cells[1, iSpalte].Value:=DataSet.Fields[iSpalte-1].FieldName;<br>
        <br>
        ..DataSet.First;<br>
        ..iZeile:=1;<br>
        ..while not DataSet.EOF do<br>
        ..begin<br>
        ....for iSpalte:=1 to DataSet.FieldCount do<br>
        ....begin<br>
        ......sWert:=DataSet.Fields[iSpalte-1].AsString;<br>
        { Alle Typen : ftUnknown, ftString, ftSmallint, ftInteger, ftWord, ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo, ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor }
        { unbehandelte Typen: ftUnknown, ftString, ftSmallint, ftInteger, ftWord, ftBoolean, ftBCD, ftDate, ftTime, ftDateTime, ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo, ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor }
        ......if DataSet.Fields[iSpalte-1].DataType in [ftFloat, ftCurrency] then<br>
        ......begin<br>
        ........if pos(',', sWert)>0 then sWert[pos(',', sWert)]:='.'<br>
        ......end<br>
        ......else if DataSet.Fields[iSpalte-1].DataType in [ftString] then<br>
        ........sWert:=#39+sWert;<br>
        ......Excel.Cells[iZeile+1, iSpalte].Value:=sWert;<br>
        ....end;<br>
        ....DataSet.next;<br>
        ....inc(iZeile);<br>
        ..end;<br>
        end;<br&gt

        Comment


        • #5
          Hallo Andreas,

          wenn es sich um eine dBase IV (oder früher) - Tabelle handelt, ist der schnellste (und einfachste) Weg der, Excel97 die Tabelle selbst zu übergeben! Excel97 kann solche Tabellen <b> sehr schnell (!) </b> öffnen

          Comment


          • #6
            Hallo Gerd,<br>

            einfach, genial, funktional, super ....<br>
            In den meisten Fällen braucht man nicht mehr!<br>

            Gruß Karste

            Comment

            Working...
            X