Thema: Delphi Problem mit Excelexport

Einzelnen Beitrag anzeigen

Borschti

Registriert seit: 1. Nov 2007
Ort: Marburg Lahn
235 Beiträge
 
Delphi 2007 Professional
 
#1

Problem mit Excelexport

  Alt 18. Jul 2008, 14:49
Hallo,

ich habe ein Problem mit dem Exportieren einer Datenmenge nach Excel, also meine procedure läuft wunderbar auf Rechnern auf denen Excel installiert ist, aber wen Excel nicht installiert ist kommt eine Fehlermeldung das die classID (oder so ähnlich) nicht registriert ist.

Also meine Frage jetzt: Wie kann ich meine procedure möglichst einfach verändern das sie auch auf Rechnern angewandt werden kann auf denen kein Excel installiert ist

Hier mal mein derzeitiger Code:

Delphi-Quellcode:
procedure ExcelExport(SaveDialog : TSaveDialog; ExcelAppli : TExcelApplication;
                      ExcelWb : TExcelWorkbook; ExcelWsht : TExcelWorksheet;
                      Query : TVddQuery);

var Filename, CoordCounter: String;
    oleArray1, oleArray2:OleVariant;
    i, z, flcid : Integer;
    sl, sl2 : TStringlist;
begin

  Screen.Cursor := crHourglass;

  SaveDialog.Execute;

    case SaveDialog.FilterIndex of
      1: Filename := ChangeFileExt(SaveDialog.FileName,'.xls');
      2: Filename := ChangeFileExt(SaveDialog.FileName,'.xls');
    end;

    if Filename <> 'then
      begin
        flcid:=GetUserDefaultLCID;
        ExcelAppli.Connect;
        ExcelAppli.Visible[flcid]:=true;
        ExcelAppli.UserControl:=true;

        CreateFile(@Filename[1], 0, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);

        ExcelWb.ConnectTo(ExcelAppli.Workbooks.Open(filename, False,
        False, EmptyParam, '', False, False, EmptyParam, EmptyParam, false, false,
        EmptyParam, EmptyParam, EmptyParam, false, 0));
        ExcelWsht.ConnectTo(ExcelWb.Sheets.Item[1] as ExcelWorkSheet);

        sl := TStringList.Create;
        sl2 := TStringList.Create;
        Query.GetFieldNames(sl);

        OleArray1 := VarArrayCreate([0, Query.RecordCount], varVariant);
        OleArray2 := VarArrayCreate([0, sl.Count], varVariant);

        for z := 0 to sl.Count - 1 do
          begin
            OleArray2[z] := sl.Strings[z];
          end;

        sl2.Add('A');
        sl2.Add('B');
        sl2.Add('C');
        sl2.Add('D');
        sl2.Add('E');
        sl2.Add('F');
        sl2.Add('G');
        sl2.Add('H');
        sl2.Add('I');
        sl2.Add('J');
        sl2.Add('K');
        sl2.Add('L');
        sl2.Add('M');
        sl2.Add('N');
        sl2.Add('O');
        sl2.Add('P');
        sl2.Add('Q');
        sl2.Add('R');
        sl2.Add('S');
        sl2.Add('T');
        sl2.Add('U');
        sl2.Add('V');
        sl2.Add('W');
        sl2.Add('X');
        sl2.Add('Y');
        sl2.Add('Z');
        sl2.Add('AA');
        sl2.Add('AB');
        sl2.Add('AC');
        sl2.Add('AD');
        sl2.Add('AE');
        sl2.Add('AF');
        sl2.Add('AG');
        sl2.Add('AH');
        sl2.Add('AI');
        sl2.Add('AJ');
        sl2.Add('AK');
        sl2.Add('AL');
        sl2.Add('AM');
        sl2.Add('AN');
        sl2.Add('AO');
        sl2.Add('AP');
        sl2.Add('AQ');
        sl2.Add('AR');
        sl2.Add('AS');
        sl2.Add('AT');
        sl2.Add('AU');
        sl2.Add('AV');
        sl2.Add('AW');
        sl2.Add('AX');
        sl2.Add('AY');
        sl2.Add('AZ');

        ExcelWsht.Range[sl2[0]+'1', sl2[sl.Count-1]+'1'].Value[EmptyParam] := OleArray2;

        if sl.count > sl2.Count then
          begin
            ExcelWsht.Range[sl2[0]+'1', sl2[sl.Count-1]+'1'].Value[EmptyParam] := OleArray2;
          end;

        Query.First;

        for i := 0 to Query.RecordCount - 1 do
          begin
            for z := 0 to sl.Count - 1 do
              begin
                OleArray1[z] := Query.FieldByName(sl[z]).AsString;
              end;

            CoordCounter := IntToStr(i+2);
            ExcelWsht.Range[sl2[0]+CoordCounter, sl2[sl.Count-1]+CoordCounter].Value[EmptyParam]:=OleArray1;
            Query.Next;

          end;

        ExcelWsht.Cells.EntireRow.AutoFit;
        ExcelWsht.Cells.EntireColumn.AutoFit;

      end;

    Screen.Cursor := crDefault;
    sl.Free;
    sl2.Free;

end;
Ich weiß, die Sache mit der Stringlist und dem hinzufügen der Felder ist nicht gerade die eleganteste Methode aber es musste einfach schnell gehn und mit ist nichts besseres eingefallen, falls hier jemand etwas besseres kennt würde ich mich über Tipps freun.

Also dann ich hoffe ihr könnt mir weiterhelfen.

mfg
Alex
  Mit Zitat antworten Zitat