Announcement

Collapse
No announcement yet.

Excel/Delphi

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

  • Excel/Delphi

    Hallo,

    ich muss folgendes Problem lösen:

    In ein bestehendes Excel-Formular sollen über einen Barcodescanner ca. 30.000 Werte eingelesen werden. In Abhängigkeit vom eingelesen Wert muss jeweils ein anderes Feld im Excel-Arbeitsblatt angesprungen werden.

    Da die Eingabe sehr schnell gehen muss (ohne Maus usw.), dachte mir, dieses so zu lösen, dass ich die Barcodes mit einem kleinen Delphi-Programm einlese und Excel anschließend sozusagen fernbediene.

    Da es von den Delphi Kommmoneten "Server" aber keine Beschreibung gibt, war ich mit meinen Tests bis jetzt nicht sehr erfolgreich.

    In diesem Forum wird immer vom Buch "COM/DCOM" mit Delphi geschrieben und auf bestehende Beispiele verwiesen, aber diese Beispiele kann ich in meinen Buch bzw. auf der CD nicht finden - habe ich evtl. eine alte Version?

    Mir fehlt einfach ein zusammenhängendes Beispiel.
    Vielleicht kann mir ja jemand weiterhelfen.

    Gruß
    Manfred Abeln
    [email protected]

  • #2
    Hallo,

    das Nachfolgebuch <i>COM/DCOM/COM+ mit Delphi</i> kann dank der 1000 gedruckten Seiten (sowie der als PDF ausgelagerten Kapitel) ausführlicher auf das Thema Automation von Microsoft Office 97/2000 eingehen. Das folgende Beispielprojekt stammt aus dem Buch:
    <pre>
    { ************************************************** **************
    Source File Name : D5E2KTestFrm.pas
    Typ : Formular-Unit
    Autor : Andreas Kosch
    Erstellt am : 04.05.2000
    Compiler : Delphi 5.01 (UpdatePack#1)
    Betriebssystem : Windows NT 4
    Beschreibung : Delphi 5.01 (mit den Office2000-Komponenten
    aus dem UpdatePack#1) steuert EXCEL 2000
    Revisionen :
    ************************************************** ************** }

    unit D5E2KTestFrm;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls, Excel2000, OleServer, ComCtrls;

    type
    TForm1 = class(TForm)
    StatusBar1: TStatusBar;
    ExcelApplication1: TExcelApplication;
    ExcelWorkbook1: TExcelWorkbook;
    ExcelWorksheet1: TExcelWorksheet;
    Button_1: TButton;
    Button_2: TButton;
    Button_3: TButton;
    Button_6: TButton;
    EditSheetNr: TEdit;
    Button_4: TButton;
    ButtonBad: TButton;
    ButtonGood: TButton;
    Button_5: TButton;
    LabelBad: TLabel;
    LabelGood: TLabel;
    procedure Button_1Click(Sender: TObject);
    procedure Button_2Click(Sender: TObject);
    procedure Button_3Click(Sender: TObject);
    procedure Button_6Click(Sender: TObject);
    procedure Button_4Click(Sender: TObject);
    procedure ButtonBadClick(Sender: TObject);
    procedure ButtonGoodClick(Sender: TObject);
    procedure Button_5Click(Sender: TObject);
    private
    { Private-Deklarationen }
    FLCID : Integer;
    FSheetCount : Integer;
    public
    { Public-Deklarationen }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.DFM}

    const
    cXLS_FileName = 'C:\Temp\Out\Automation\Excel\Mappe1.xls';

    procedure TForm1.Button_1Click(Sender: TObject);
    begin
    FLCID := GetUserDefaultLCID;
    ExcelApplication1.Connect;
    ExcelApplication1.Visible[FLCID] := True;
    ExcelApplication1.UserControl := True;
    end;

    procedure TForm1.Button_2Click(Sender: TObject);
    begin
    ExcelApplication1.Workbooks.Open(cXLS_FileName, False, False,
    EmptyParam,'',False,False,EmptyParam,
    EmptyParam,false,false,EmptyParam,false,0);
    ExcelWorkbook1.ConnectTo(ExcelApplication1.ActiveW orkBook);
    FSheetCount := ExcelWorkbook1.Worksheets.Count;
    ShowMessage(Format('Es wurden %d Worksheets im Workbook gefunden.',
    [FSheetCount]));
    end;

    procedure TForm1.Button_3Click(Sender: TObject);
    var
    iItem : Integer;
    sValue: String;
    begin
    iItem := StrToInt(EditSheetNr.Text);
    if (iItem > FSheetCount) or (iItem < 0 ) then
    raise Exception.Create('Dieses Sheet gibt es nicht.');
    ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Sheets.It em[iItem] as
    _Worksheet);
    sValue := ExcelWorksheet1.Range['A5','A5'].Value;
    ShowMessage(sValue);
    end;

    procedure TForm1.Button_4Click(Sender: TObject);
    var
    vArray : OleVariant;
    aRange : Range;
    begin
    ExcelWorksheet1.ConnectTo(
    ExcelWorkbook1.Sheets.Item[3] as _Worksheet);
    // Benutzer soll das Sheet auch sehen
    ExcelWorksheet1.Activate;
    // Überschrift eintragen
    vArray := VarArrayOf(['Datum', 'Auftragsnummer', 'Betrag', 'Info']);
    aRange := ExcelWorksheet1.Range['A1','D1'];
    aRange.Value := vArray;
    aRange.Font.Bold := True;
    aRange.EntireColumn.AutoFit;
    // Werte eintragen
    vArray := VarArrayCreate([0, 2], varVariant);
    vArray[0] := 12;
    vArray[1] := 20;
    vArray[2] := 30;
    ExcelWorksheet1.Range['A2','C2'].Value := vArray;
    // Formel eintragen und Ergebnis in Fettschrift formatieren
    ExcelWorksheet1.Range['D2','D2'].Formula := '=A2+B2+C2';
    ExcelWorksheet1.Range['D2','D2'].Font.Bold := True;
    end;

    procedure TForm1.ButtonBadClick(Sender: TObject);
    var
    iLoop : Integer;
    iStart: Integer;
    iStop : Integer;
    begin
    iStart := GetTickCount;
    for iLoop := 1 to 100 do
    ExcelWorksheet1.Cells.Item[iLoop,6].Value := 99.99;
    iStop := GetTickCount;
    LabelBad.Caption := IntToStr(iStop - iStart);
    end;

    procedure TForm1.ButtonGoodClick(Sender: TObject);
    var
    iLoop : Integer;
    iStart: Integer;
    iStop : Integer;
    aRange: Range;
    begin
    aRange := ExcelWorksheet1.Cells;
    iStart := GetTickCount;
    for iLoop := 1 to 100 do
    aRange.Item[iLoop,7].Value := 99.99;
    iStop := GetTickCount;
    LabelGood.Caption := IntToStr(iStop - iStart);
    end;

    procedure TForm1.Button_5Click(Sender: TObject);
    begin
    ExcelWorksheet1.Range['F1','F100'].Clear;
    ExcelWorksheet1.Range['G1','G100'].Clear;
    end;

    procedure TForm1.Button_6Click(Sender: TObject);
    begin
    ExcelWorksheet1.Disconnect;
    // Workbook ohne Speichern schliessen
    ExcelWorkbook1.Close(False);
    ExcelWorkbook1.Disconnect;
    // Excel beenden
    ExcelApplication1.Quit;
    ExcelApplication1.Disconnect;
    end;

    end.
    </pre&gt

    Comment


    • #3
      Hallo Hr. Kosch <br>
      Wie kann ich bei diesem Beispiel zwischen zwei geöffneten Excel-<br>
      Dateien hin und her wechsel ? <br>

      Können Sie mir da helfen ? <br>

      Mfg <br>

      Jörg Majer

      Comment


      • #4
        Hallo,

        das folgende Beispiel demonstriert dies:
        <pre>
        procedure TForm1.Button1Click(Sender: TObject);
        var
        FLCID : Integer;
        vArray : OleVariant;
        aRange : Range;
        begin
        FLCID := GetUserDefaultLCID;
        ExcelApplication1.Connect;
        ExcelApplication1.Visible[FLCID] := True;
        ExcelApplication1.UserControl := True;

        ExcelApplication1.Workbooks.Add(EmptyParam, FLCID);
        ExcelApplication1.Workbooks.Add(EmptyParam, FLCID);

        ExcelWorkbook1.ConnectTo(ExcelApplication1.Workboo ks.Item[1]);
        ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Sheets.It em[1] as _Worksheet);
        vArray := VarArrayOf(['Datum', 'Auftragsnummer', 'Betrag', 'Info']);
        aRange := ExcelWorksheet1.Range['A1','D1'];
        aRange.Value := vArray;
        aRange.Font.Bold := True;

        ExcelWorkbook1.ConnectTo(ExcelApplication1.Workboo ks.Item[2]);
        ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Sheets.It em[1] as _Worksheet);
        vArray := VarArrayOf(['Datum', 'Auftragsnummer', 'Betrag', 'Info']);
        aRange := ExcelWorksheet1.Range['A2','D2'];
        aRange.Value := vArray;
        aRange.Font.Bold := True;
        end;
        </pre&gt

        Comment

        Working...
        X