Announcement

Collapse
No announcement yet.

Excel-Automation

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

  • Excel-Automation

    Hallo Herr Kraus,

    das ist kein Problem. Ich habe Ihre Mail hier ins Forum gestellt, da das hier eventuell noch andere User betreffen könnte und somit noch anderen weiterhilft.<br><br>

    Hallo Herr Hagedorn,
    im Entwickler-Forum haben Sie angeboten bei Fragen zur Excel-Automation zu helfen. Ich habe noch keinerlei Erfahrung mit Excel-Automation und habe jetzt die Aufgabe Daten nach Excel zu exportieren und einen Chart in Excel aus diesen Daten anzuzeigen. Vielleicht können Sie mir ein kleines Beispielprojekt zusenden, damit ich überhaupt mal den Einstieg bekomme. Würde mich über diese Hilfe sehr freuen.<br><br>

    Mit freundlichen Grüßen<br>
    Stefan Kraus

  • #2
    Hier nun die Antwort: <br><br>
    Also bei der Excel-Automation mit Delphi gibt es zwei Möglichkeiten (und eine kleine dritte, dazu später) zu entwickeln. Die frühe und die späte Bindung:<br><br>

    1) frühe Bindung --> man nutzt z. B. die "TExcel..."-Komponenten von Delphi (zu finden unter Servers) und hat so die Möglichkeit, Fehler mit dem Compiler zu erkennen und auch die Programmierhilfe zu nutzen.<br>
    Nachteil: bestimmte Funktionen sind so nicht verfügbar (z.B. Werte einer X-Achse zuweisen)
    <br><br>
    2) späte Bindung --> man arbeitet über OLE-Objekte mit Delphi, kann so aber keine Programmierhilfe nutzen und nicht auf den Compiler zählen, da Fehler erst zur Laufzeit erkannt werden können. Das ist ein wenig mühsam, aber so sind ALLE Funktionen von Excel ansprechbar
    3) man kann beides nutzen. An der Stelle, wo man mit den Delphi-Komponenten nicht weiterkommt, kann man über eine Interface-Verknüpfung die späte Bindung nutzen und so die nicht unterstützten Funktionen ansprechen, - primär arbeitet man jedoch mit den Excel-Komponenten von Delphi. Diese Methode habe ich gewählt, da man so sehr komfortabel programmieren kann.
    <br><br>
    Ich habe Ihnen ein kleines Beispiel per Email geschickt. Das ist die frühe Bindung, sollten Sie noch an die anderen Varianten interessiert sein, kann ich Ihnen da auch noch zahlreiche Beispiele schicken.
    <br><br>
    Hier noch das Beispiel zur späten Bindung:<br><br>

    procedure TForm1.Button1Click(Sender: TObject);<br>
    {* Sebastian Hagedorn, September 2003 *}<br>
    {* Excel starten, Werte in Worksheet einfügen und ein Chart erzeugen was auf die eingetragenen *}<br>
    {* Werte Bezug nimmt. *}<br>
    var<br>
    Excel, range : Variant;<br>
    i : Integer;<br>
    H : HResult;<br>
    begin<br>
    try<br>
    H := (OleInitialize(nil)); // initialisieren<br>
    if (H <> S_OK) and (H <> S_FALSE) then begin<br>
    ShowMessage('Fehler bei der OLE-Initalisierung! Microsoft Excel konnte nicht gestartet werden.');<br>
    Exit;<br>
    end;<br>
    <br>
    Excel := (CreateOleObject('Excel.Application'));<br>
    Excel.Workbooks.add;<br>
    Excel.Worksheets[1].Cells[1, 1] := ('Time');<br>
    Excel.Worksheets[1].Cells[1, 2] := ('Signal');<br>
    <br>
    for i:=0 to 100 do begin<br>
    Excel.Worksheets[1].Cells[i+2, 1] := (inttostr(trunc(i/2.9)));<br>
    Excel.Worksheets[1].Cells[i+2, 2] := (inttostr(trunc(i*0.2)));<br>
    end;<br>
    <br>
    {* füge ein Diagram ein *}<br>
    Excel.Charts.add;<br>
    {* Diagramm-Titel und Legende *}<br>
    Excel.ActiveChart.HasLegend := (False);<br>
    Excel.ActiveChart.HasTitle := (True);<br> Excel.ActiveChart.ChartTitle.Characters.Text := ('Chromatogramm');<br>
    <br>
    // Hintergrundfarbe des Diagramms<br>
    Excel.ActiveChart.PlotArea.Select;<br>
    Excel.Selection.Interior.ColorIndex := (2);<br> Excel.Selection.Interior.Pattern := (xlsolid);<br><br>

    // Typ des Diagramms --> Variable aus Excel_TLB Unit<br>
    Excel.ActiveChart.ChartType := (xlline);<br>
    Excel.ActiveChart.SetSourceData(Excel.Workbooks[1].Worksheets[1].range['A1:A100'], xlColumns);<br>
    // die Werte der X-ACHSE aus der Spalte nehmen<br>
    Excel.ActiveChart.SeriesCollection(1).XValues := ('=Tabelle1!Z1S2:Z'+inttostr(500)+'S2');<br>
    finally<br>
    Excel.Visible := (True);<br>
    end;<br>
    end;<br>
    <br>

    Folgende Units werden für das Beispiel benötigt und müssen eingebunden werden:<br><br>
    uses Variants, ActiveX, ComObj, Excel_TLB;<br>
    <br>

    MfG
    Sebastian Hagedor

    Comment


    • #3
      Hallo Sebastian,
      vielen Dank für die rasche Hilfe. Noch ein Problem: Bei der späten Bindung wird die Legende (hier Time) angezeigt, bei der frühen zeigt er als Legende Reihe1. Ich habe HasLegend auf True gesetzt. Wie kann ich bei der frühen Bindung die richtige Legende anzeigen?

      Gruß
      Stefan Krau

      Comment


      • #4
        Hallo Stefan,

        also so ganz verstehe ich Dein Problem noch nicht, weil die Legende wird automatisch angezeigt, sprich alle Datenreihen die im Diagramm dargestellt werden. Sprich wenn Du haslegend auf True gesetzt hast, müsste alles klappen. Erkläre doch nochmal genauer oder schick mir die Beispiele mit einer kleinen Beschreibung.

        MfG
        Sebastia

        Comment

        Working...
        X