Announcement

Collapse
No announcement yet.

Export nach Excel

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

  • Export nach Excel

    Hallo,
    ich versuche seit Tagen erfolglos eine Möglichkeit zu erkunden, wie ich aus einer Abfrage, Tabelle aus einer MSSQL-DB (arbeite mit ADO, D6, MSDE) einen Export nach Excel ermöglichen kann. Bei der bisher genutzten ACCESS-DB ging dies problemlos und elegant nach den hier oft veröffentlichten Hinweisen von Herrn Kosch. Kann mir jemand hier helfen?

    Wolfgang

  • #2
    Hallo,

    wenn auf dem gleichen Rechner das Anwendungsprogramm <i>Microsoft Excel</i> installiert ist, steht der universelle Weg über die Interface-Methode <b>CopyFromRecordset</b> des Range-Objekts von Excel zur Verfügung. Dabei spielt es keine Rolle, aus welcher Datenbank die Recordset-Ergebnismenge stammt:
    <pre>
    // Daten aus der ADO-Datenmenge kopieren
    ExcelWorksheet1.Range['A10','A10'].CopyFromRecordset(aRS,
    EmptyParam, EmptyParam);
    </pre>

    Wenn auf dem Rechner kein Microsoft Excel installiert ist, gibt es zwei Umwege:

    1. Neue Excel-Tabelle direkt über ADO mit der benötigten Struktur anlegen und dann jeden Datensatz vom Recordset mit der Ergebnismenge dort hinein kopieren.

    2. Ergebnismenge vom Recordset in eine Hilfs-MDB-Datenbank kopieren, und von dort aus die Export-Fähigkeit der Microsoft JET Engine nutzen.

    Der 1. Umweg könnte zum Beispiel so aussehen:
    <pre>
    uses
    ADOX_TLB, ADODB_TLB;

    resourcestring
    cCONNECTSTRING = 'Provider=Microsoft.Jet.OLEDB.4.0;' +
    'Data Source=%s;' +
    'Extended Properties=Excel 8.0';
    cSHEET = 'SSF';

    procedure TFormExport.ExportToXLS;
    var
    aTargetCon : _Connection;
    aTargetRS : _Recordset;
    aSourceRS : _Recordset;
    iLoop : Integer;
    begin
    CreateExportXLS;
    aTargetCon := CoConnection.Create;
    aTargetCon.CursorLocation := adUseClient;
    aTargetCon.Open(FXLSPath, '', '', Integer(adConnectUnspecified));
    try
    aTargetRS := CoRecordSet.Create;
    aTargetRS.Set_ActiveConnection(aTargetCon);
    aTargetRS.Open(cSHEET, EmptyParam, adOpenStatic,
    adLockOptimistic, adCmdTableDirect);
    // Daten in die XLS-Tabelle schreiben
    aSourceRS := FormBerichteAlles.ExportRecordSet;
    ProgressBarExport.Max := aSourceRS.RecordCount;
    aSourceRS.MoveFirst;
    while not aSourceRS.EOF do
    begin
    aTargetRS.AddNew(EmptyParam, EmptyParam);
    for iLoop := 0 to aSourceRS.Fields.Count - 1 do
    aTargetRS.Fields[iLoop].Value := aSourceRS.Fields[iLoop].Value;
    aTargetRS.Update(EmptyParam, EmptyParam);
    aSourceRS.MoveNext;
    ProgressBarExport.StepIt;
    end;
    aTargetRS.Close;
    aTargetRS := nil;
    finally
    aTargetCon.Close;
    aTargetCon := nil;
    end;
    ShowMessage('Alle Datensätze wurden exportiert.');
    Close;
    end;

    procedure TFormExport.CreateExportXLS;
    var
    aCatalog : _Catalog;
    aTable : _Table;
    begin
    // Neue XLS-Tabelle als Exportziel anlegen
    FXLSPath := Format(cCONNECTSTRING, [StaticTextFileName.Caption]);
    aCatalog := CoCatalog.Create;
    aCatalog.Set_ActiveConnection(FXLSPath);
    aTable := CoTable.Create;
    aTable.ParentCatalog := aCatalog;
    aTable.Name := cSHEET;
    with aTable.Columns do
    begin
    Append('Feld1', adVarWChar, 100);
    ...
    Append('Feld20', adVarWChar, 10);
    Refresh;
    end;
    aCatalog.Tables.Append(aTable);
    end;

    Comment


    • #3
      Hallo Herr Kosch,
      vielen Dank für die schnelle Antwort.
      Excel kann ich nicht unbedingt am betreffenden PC voraussetzen.
      An den 2. Umweg hatte ich auch schon gedacht, aber an der Umsetzung klemmte es, werde mal Ihren 1. Weg versuchen.

      wolfgan

      Comment

      Working...
      X