Montag, 13. Oktober 2008

entwickler.com Magazine Konferenzen Akademie Entwickler-Forum Jobbörse Bücher
Software & Support Verlag

Lange Texte über ADO in Excel einfügen

Frage: Bei dem Versuch, die Daten über ADO in eine EXCEL-Tabelle abzulegen werden Strings, die länger als ca. 200 Zeichen sind, abgeschnitten bzw nicht weiter importiert. Der Import von Variablen kürzerer Länge verläuft reibungslos. Wir werden lange Zeichenfolgen (oder BLOb-Felder) über ADO in EXCEL-Zellen mit Delphi 7 eingefügt?

Antwort: Meines Wissens nach geht EXCEL je Zelle von einer Default-Länge von 255 Zeichen aus. Der entgegengesetzte Weg (vorhandene Excel-Daten werden von ADO eingelesen) kopiert auch längere Texte. Um beliebig lange BLOb-Texte in die Excel-Seite einzufügen, gibt es als Alternative den Automation-Weg. Das folgende Beispiel für die Automation von Microsoft Excel 2002 zeigt, dass die Methode CopyFromRecordset auch längere BLOb-Text in voller Breite in die Excel-Tabelle einfügt. Die Daten stammen aus der Northwind-Beispieldatenbank des MS SQL Server 2000. Die Konfiguration der ADO-Komponenten im Objektinspektor sieht wie folgt aus:

  object ADOConnection1: TADOConnection
    Connected = True
    ConnectionString =
      'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security In' +
      'fo=False;Initial Catalog=Northwind;Data Source=(local)'
    LoginPrompt = False
    Provider = 'SQLOLEDB.1'
    Left = 48
    Top = 32
  end
  object ADODataSet1: TADODataSet
    Active = True
    Connection = ADOConnection1
    CursorType = ctStatic
    CommandText = 'select EmployeeID, LastName, Notes from Employees'
    Parameters = <>
    Left = 88
    Top = 32
  end
Das Programm verbindet sich über die Server-Komponenten von Delphi 7 (die Fassung für Office XP, nicht die Fassung für Office 2000) mit der leeren XLS-Datei, um dann die Spaltenbeschriftung in die 1. Zeile einzufügen. Danach wird der Inhalt der Ergebnismenge der SELECT-Abfrage an die Position der Zelle A2 angehängt:
uses ADOInt;

const cXLS_FileName = 'C:\Temp\Mappe1.xls';
procedure TForm1.Button1Click(Sender: TObject); var aRS : _RecordSet; iCnt : Integer; i : Integer; aRange : ExcelRange; aField : Field; begin ExcelApplication1.Connect; ExcelApplication1.Visible[GetUserDefaultLCID] := True; ExcelApplication1.UserControl := True; ExcelApplication1.Workbooks.Open(cXLS_FileName, False, False, EmptyParam,'',False,False,EmptyParam, EmptyParam,false,false,EmptyParam,false,EmptyParam, EmptyParam,0); ExcelWorkbook1.ConnectTo(ExcelApplication1.ActiveWorkBook); ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Sheets.Item[1] as _Worksheet); ExcelWorksheet1.Activate; aRS := ADODataSet1.Recordset; iCnt := aRS.Fields.Count; // Spaltenbeschriftung for i := 1 to iCnt do begin aRange := IDispatch(ExcelWorksheet1.Cells.Item[1,i]) as ExcelRange; aRange.Font.Bold := True; aField := aRS.Fields[i-1]; aRange.Value2 := aField.Name; end; // Daten aus der ADO-Datenmenge kopieren ExcelWorksheet1.Range['A2','A2'].CopyFromRecordset(aRS, EmptyParam, EmptyParam); end;
Das Ergebnis zeigt die beigefügte Abbildung:






Software & Support Verlag GmbH